首页 > 解决方案 > Android 11 - 始终触发 StrictMode detectLeakedClosableObjects()

问题描述

我想将 StrictMode 与 .detectAll() 和 .penaltyDeath() 一起使用来发现我的应用程序中的问题。但很常见的是,我的应用程序因以下消息而终止(因为受到惩罚死亡):

D/StrictMode:StrictMode 策略违规:android.os.strictmode.LeakedClosableViolation:在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable。呼叫站点:关闭

为了找到原因,我已经从我的应用程序中删除了几乎所有的代码——但没有成功。

我惊讶地发现我可以在 Android Studio 自动生成的项目“Basic Activity”中重新创建这个问题。

现在我注意到这个问题只发生在 Android 11 模拟器中。它不会出现在 Android 8.1 映像中。

如何重现:

  1. 在 Android Studio 中:文件 > 新建 > 新建项目 > 基本活动 > Kotlin + API 21

  2. 添加

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    StrictMode.setVmPolicy(
        StrictMode.VmPolicy.Builder()
        .detectLeakedClosableObjects()
        .penaltyLog()
        .penaltyDeath()
        .build())
}

super.onCreate(savedInstanceState)到和之间的 onCreate 方法binding = ActivityMainBinding.inflate(layoutInflater)

  1. 添加缺失的导入

  2. 运行应用

  3. 等到应用程序在模拟器中启动/启动

  4. 再次运行

  5. 等待 5 秒

  6. 应用程序崩溃D/StrictMode: StrictMode policy violation: android.os.strictmode.LeakedClosableViolation: A resource was acquired at attached stack trace but never released...

  7. (有时penaltyDeath()杀的太快,异常没有写入Logcat)

我已经:

我正在使用 Linux、Manjaro、Ryzen 7 5800X、32GB RAM。有谁知道我做错了什么?

从 Android Studio 登录(从运行选项卡) https://pastebin.com/fkq0u1vd

标签: androidlinuxandroid-studiokotlin

解决方案


推荐阅读