在通过 Fabric 从 Crashlytics 转换为通过 Firebase 的 Crashlytics 之后,我开始在调试运行中看到以下调用堆栈,其中启用了 StrictMode 以查找资源泄漏。
StrictMode 与此代码一起使用,仅在调试版本中使用:
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedClosableObjects()
.penaltyLog()
.build());
Run Code Online (Sandbox Code Playgroud)
我在项目级 gradle 中使用了这个版本的 Fabric 的 gradle 工具:
classpath "io.fabric.tools:gradle:1.27.0"
Run Code Online (Sandbox Code Playgroud)
以及模块级 gradle 中这些版本的 Firebase 和 Crashlytics:
implementation "com.google.firebase:firebase-core:16.0.7"
implementation "com.crashlytics.sdk.android:crashlytics:2.9.8"
Run Code Online (Sandbox Code Playgroud)
在初始化期间,Firebase 检测会启动一个后台线程,该线程使用 okhttp 进行设置调用。当它发生时, StrictMode 会导致此调用堆栈弹出:
W/CrashlyticsCore: Received null settings, skipping report submission!
D/StrictMode: StrictMode policy violation: android.os.strictmode.LeakedClosableViolation: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
at android.os.StrictMode$AndroidCloseGuardReporter.report(StrictMode.java:1786)
at dalvik.system.CloseGuard.warnIfOpen(CloseGuard.java:264)
at java.util.zip.Inflater.finalize(Inflater.java:398) …Run Code Online (Sandbox Code Playgroud)