Android平台LeakCanary检测到内存泄漏,求修复方案
内存泄漏问题分析与修复建议
泄漏日志翻译与解析
以下是翻译后的LeakCanary泄漏日志:
├─ android.app.AppOpsManager$3 实例 │ 泄漏状态:未知 │ 保留内存:536 B,涉及1个对象 │ 类型:com.android.internal.app.IAppOpsActiveCallback$Stub的匿名子类 │ ↓ AppOpsManager$3.this$0 │ ~~~~~~ ├─ android.app.AppOpsManager 实例 │ 泄漏状态:未知 │ 保留内存:240 B,涉及10个对象 │ mContext 实例为 android.app.ContextImpl │ ↓ AppOpsManager.mContext │ ~~~~~~~~ ├─ android.app.ContextImpl 实例 │ 泄漏状态:未知 │ 保留内存:9.0 kB,涉及106个对象 │ mAutofillClient 实例为 com.welldoc.platform.android.ui.insulinpen.TSBPairAndDataSyncActivity,且mDestroyed = true │ mOuterContext 实例为 android.app.ContextImpl │ ContextImpl.mOuterContext == ContextImpl.this:未绑定到特定生命周期 │ ↓ ContextImpl.mAutofillClient │ ~~~~~~~~~~~~~~~ ╰→ com.welldoc.platform.android.ui.insulinpen.TSBPairAndDataSyncActivity 实例 泄漏状态:是(ObjectWatcher监控到该Activity已收到Activity#onDestroy()回调,且Activity#mDestroyed = true) 保留内存:6.3 MB,涉及8734个对象 key = 76dd66e8-d8cb-4330-9a45-bb6600394233 watchDurationMillis = 16635 retainedDurationMillis = 11635 mDsmApplication 实例为 com.welldoc.platform.android.DiabetesApplication mApplication 实例为 com.welldoc.platform.android.DiabetesApplication mBase 实例为 androidx.appcompat.view.ContextThemeWrapper
泄漏路径梳理
泄漏链清晰指向:系统AppOpsManager的内部回调持有AppOpsManager实例 → AppOpsManager持有ContextImpl → ContextImpl的mAutofillClient持有已销毁的TSBPairAndDataSyncActivity实例,导致Activity无法被GC回收,引发内存泄漏。
修复步骤
- 检查
TSBPairAndDataSyncActivity中自动填充相关逻辑:确认是否注册了自动填充服务/回调,务必在onDestroy()方法中取消所有相关注册,切断回调与Activity的绑定。 - 替换Context引用:如果必须向自动填充相关API传入Context,不要直接传入Activity实例,改用
getApplicationContext()获取全局上下文,避免生命周期绑定。 - 弱引用包装:若业务场景必须保留Activity与自动填充逻辑的关联,用
WeakReference<TSBPairAndDataSyncActivity>包装Activity实例,避免强引用导致泄漏。 - 验证第三方依赖:检查是否有第三方库在内部调用了自动填充相关API并传入了Activity Context,如有,替换为全局上下文或联系库方修复。
内容的提问来源于stack exchange,提问作者user7204872
相关产品推荐
相关产品推荐

