Data Backupのガイドラインに従ってBackupAgentを実装しました。リークされたクローズ可能なオブジェクトを検出するように設定されるまで、コードは期待どおりに動作します。バックアップが実行され、GC が発生した後、CloseGuard は次のスタック トレースでリークを報告します。StrictMode.VmPolicy
ParcelFileDescriptor
06-28 21:47:39.683 25072-25081/com.qbix.nub E/StrictMode﹕ A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:184)
at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:179)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:905)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:897)
at android.app.IBackupAgent$Stub.onTransact(IBackupAgent.java:64)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
06-28 21:47:39.683 25072-25081/com.qbix.nub W/System.err﹕ StrictMode VmPolicy violation with POLICY_DEATH; shutting down.
06-28 21:47:39.683 25072-25081/com.qbix.nub I/Process﹕ Sending signal. PID: 25072 SIG: 9
ParcelFileDescriptor
でリークしていないことを確認するために、次のようBackupAgent
にスタブしました。onBackup()
@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException {
if (oldState != null) {
oldState.close();
}
newState.close();
return;
}
この変更では、リークは修正されませんでした。
これらは、問題を再現するために使用する手順です。
- アプリ データを変更して呼び出しをトリガーする
BackupManager.dataChanged()
adb shell bmgr run
バックアップ操作を強制するために使用します- から GC を開始
Android Studio
BackupService
バインドされたサービスについて、スタック トレースがリークがシステム内にあるのか、それとも私が確認できないコードのエラーによって引き起こされているのかについての手がかりを提供するかどうかを理解するのに十分な知識がありません。スタブを使用して実行しているときにリークが継続的に発生することは、onBackup()
リークがサービスにあることを示唆しています。
この問題を調査しているときに、過去数か月に投稿された他の問題を見つけました。これらの問題には、同じリーク レポートが含まれていましたlogcats
。
Android - HTTP Get - Explicit Termination not called エラー。私は何が欠けていますか?
Android での java.lang.Throwable 例外の解決
上記の logcat は KitKat デバイスのものです。Lollipop を実行している別のデバイスでも、同じエラーが発生していると思います。アプリは強制終了されますが、logcat には CloseGuard ダンプが含まれていません。それを見るために何をする必要があるのかわからない。