android - 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 映像中。
如何重现:
在 Android Studio 中:文件 > 新建 > 新建项目 > 基本活动 > Kotlin + API 21
添加
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)
添加缺失的导入
运行应用
等到应用程序在模拟器中启动/启动
再次运行
等待 5 秒
应用程序崩溃
D/StrictMode: StrictMode policy violation: android.os.strictmode.LeakedClosableViolation: A resource was acquired at attached stack trace but never released
...(有时penaltyDeath()杀的太快,异常没有写入Logcat)
我已经:
- 重新创建并冷启动模拟器
- Android R 的 x86 和 x86_64 受到影响
我正在使用 Linux、Manjaro、Ryzen 7 5800X、32GB RAM。有谁知道我做错了什么?
从 Android Studio 登录(从运行选项卡) https://pastebin.com/fkq0u1vd
解决方案
推荐阅读
- javascript - 对 json 数据使用异步的最佳实践
- c# - DependencyInjection CommandLine API 和我认为是后期绑定
- python - Discord.py - 如何制作一个简单的计算器?
- c# - 为什么 MemoryStream() 有数据,即使它没有用任何数据源初始化
- karate - 如何在空手道的参数值中传递/斜线
- elf - 使用调试符号从 ELF 中提取源代码
- javascript - 需要检查以下字符串格式是否正确或未使用正则表达式
- python - 根据文件夹中的文件名重命名多个数据框
- spring-boot - 在 Spring Boot 生产代码中使用 AssertJ
- python - 如何使用 Visual Studio Code 为 cmake 添加预构建步骤?