私のアプリで AndroidStudio のコンソールを使用すると、次のように表示されます。
W/システム: リソースが解放の呼び出しに失敗しました。
複数回言われることもあります。意味はわかりますが、約 2,000 行のコードを何度もチェックしましたが、閉じる/解放するために何が足りないのかわかりません。
コンソールからこの情報を拡張する方法はありますか?または、リソースが何であるか、またはリソースが閉じられない場合にターゲットを設定するにはどうすればよいでしょうか? どのようなアイデアでも歓迎します。 ありがとうございます。
ベストアンサー1
@guestからの回答は機能しますが、リフレクションに頼らずにまったく同じことを実現できます。厳密モード具体的には、次のようになります。
StrictMode.setVmPolicy(new VmPolicy.Builder()
.detectLeakedClosableObjects()
.penaltyLog()
.build());
一般的に、厳密モードではさらに多くのことが可能になります (ドキュメントへの上記のリンクを参照)。デフォルトの設定で必要なことは次のとおりです。
StrictMode.enableDefaults(); # <-- This includes warning on leaked closeables
厳密モードを「できるだけ早く」有効にするには、上記のコード オプションのいずれかをアプリケーション クラスのコンストラクターに追加します。例:
public class MyApp extends Application {
public MyApp() {
if(BuildConfig.DEBUG)
StrictMode.enableDefaults();
}
}
上記のクラスを作成するだけでなく、カスタム アプリケーション クラスを作成したことを Android に通知する必要があることに注意してくださいAndroidManifest.xml
(これにより、Android がデフォルト クラスを作成するのではなく、アプリケーション プロセスの開始時にそのインスタンスが作成されます)。カスタム アプリケーション クラスの完全に解決されたパッケージ パスを指すように、タグの属性Application
を追加/変更する必要があります(この場合は次のようになります)。android:name
<application>
MyApp
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name="com.example.app.MyApp" <-- IMPORTANT PART: ADAPT FOR YOUR ACTUAL PROJECT
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">