Android 11下StrictMode的detectLeakedClosableObjects()持续触发问题排查
问题原因
这不是你的操作错误,是Android 11(API 30)官方x86/x86_64模拟器镜像本身的系统级BUG,和你的应用代码、开发环境无关联。
该泄露属于模拟器系统底层未正确释放Closeable资源导致的误报,并非你的应用代码产生的资源泄露,因此你清空应用代码、更换Android 11镜像架构都无法解决,而低版本Android 8.1镜像、Android 11真机、更高版本Android系统的模拟器都不会出现该问题。
可行的解决方案
- 针对Android 11模拟器做特殊适配,开启StrictMode时跳过该版本的模拟器:
// 判断是否是Android 11的官方模拟器 val isAndroid11Emulator = Build.VERSION.SDK_INT == Build.VERSION_CODES.R && Build.MODEL.contains("sdk_gphone") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !isAndroid11Emulator) { StrictMode.setVmPolicy( StrictMode.VmPolicy.Builder() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build() ) }
- 更换其他版本的模拟器做Closeable泄露检测,可选择Android 12及以上版本的模拟器,或者直接使用Android 11真机测试。
- 如果必须使用Android 11模拟器调试,可临时关闭
penaltyDeath()配置,仅保留penaltyLog()输出日志,过滤掉系统层的泄露报错即可。
内容的提问来源于stack exchange,提问作者Tobias Hellmann
相关产品推荐
相关产品推荐

