EN JP CN

ANDROID.RLK.MEDIARECORDER

ANDROID.RLK.MEDIARECORDER

RLK (リソースリーク) 問題は、割り当てられたリソースが使用後に適切に破棄されなかった場合に報告されます。ANDROID.RLK.MEDIARECORDER 警告は、開かれた MediaRecorder が明示的に解放されていないことを示します。

脆弱性とリスク

ストリーム、接続、グラフィックオブジェクトなどのリソースは、明示的に閉じられる必要があります。閉じる操作により、トランザクションをアンブロックすることや、ファイルシステム内のファイルの変更をフラッシュすることができます。リソースは、最終的にはガーベッジコレクタにより閉じられますが、ガーベッジコレクションが開始される前にリソースの枯渇が発生する可能性があります。リソースの性質によっては、別のリソース割り当ての失敗時に、さまざまな例外がスローされます。次のような例外があります:java.io.FileNotFoundException:開かれたファイルが多すぎるか、データベース接続が多すぎます。

軽減と防止

重要でないと考えられるリソースであっても、メソッドを持つリソースはすべて明示的に閉じてください。こうすることで、将来的なコード変更時にもこのようなエラーから安全が保たれます。

例 1

20     public boolean onKeyDown(final int keyCode, final KeyEvent event) {
21         if (keyCode == KeyEvent.KEYCODE_ENTER) {
22             MediaRecorder recorder = new MediaRecorder();
23             recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
24             recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
25             recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
26             recorder.setOutputFile(PATH_NAME);
27             recorder.prepare();
28             recorder.start();   // Recording is now started
29             recorder.stop();
30             recorder.reset();   // You can reuse the object by going back to setAudioSource() step
31             recorder.release();
32             return true;
33         }
34         return super.onKeyDown(keyCode, event);
35     }

ANDROID.RLK.MEDIARECORDER が、行 22 のスニペットについて報告されています。'setAudioSource(...)' から java.lang.IllegalStateException がスロー (23 行目) された場合、「recorder」が終了時に解放されないためです。

例 2

20     public boolean onKeyDown(final int keyCode, final KeyEvent event) {
21         if (keyCode == KeyEvent.KEYCODE_ENTER) {
22             MediaRecorder recorder = new MediaRecorder();
23             try {
24                 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
25                 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
26                 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
27                 recorder.setOutputFile(PATH_NAME);
28                 recorder.prepare();
29                 recorder.start();   // Recording is now started
30                 recorder.stop();
31                 recorder.reset();   // You can reuse the object by going back to setAudioSource() step
32             } finally {
33                 recorder.release();
34             }
35             return true;
36         }
37         return super.onKeyDown(keyCode, event);
38     }

例 1 のスニペットを修正しました。フィールドは、ANDROID.RLK.MEDIARECORDER は報告されません。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。