android.app.LoadedApk.mReceivers 内存泄漏

本文探讨了Android应用中由于未正确注销广播接收器导致的内存泄漏问题。通过两种方法定位内存泄漏的广播,一是逐一排查,二是分析hprof文件。重点讲解了如何从LoadedApk的mReceivers找到泄漏的广播,并强调了ArrayMap数据结构在定位问题中的作用。同时提醒开发者注意混淆可能导致的广播名称识别困难。

内存泄漏原因

== 总结:注册的广播没有进行注销 ==
原理请自行阅读源码分享,下面提供两个关键方法代码简单说明
1.注册广播
在这里插入图片描述
2.注销广播
在这里插入图片描述

定位到对应的广播
方法一,逐个广播排查,如果好找的话
方法二,通过分析hprof文件定位

1.通过泄漏的Activity定位到对应的LoadedApk
在这里插入图片描述

2.查看对应的LoadedApk的mReceivers
在这里插入图片描述

3.找到泄漏的Activity,以及它所注册的广播
在这里插入图片描述
请自行了解ArrayMap的数据结构,我这里直接给结论
n = Activity,n+1 = 对应的广播信息。所以我这里就看 4+1 = 5 的信息就可以知道是哪个广播了

在这里插入图片描述
图中的"c$a"广播被混淆了,请自行对应mapping文件进行查找。

Unable to instantiate appComponentFactory java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.CoreComponentFactory" on path: DexPathList[[],nativeLibraryDirectories=[/data/app/~~J258SDO7Api5tHdW19guAg==/com.dfl.threedhmi-lTSolR3TYLnFiIHscCPuqg==/lib/arm64, /data/app/~~J258SDO7Api5tHdW19guAg==/com.dfl.threedhmi-lTSolR3TYLnFiIHscCPuqg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at android.app.LoadedApk.createAppFactory(LoadedApk.java:260) at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:902) at android.app.LoadedApk.getClassLoader(LoadedApk.java:982) at android.app.LoadedApk.getResources(LoadedApk.java:1214) at android.app.ContextImpl.createAppContext(ContextImpl.java:2777) at android.app.ContextImpl.createAppContext(ContextImpl.java:2769) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6602) at android.app.ActivityThread.access$1300(ActivityThread.java:237) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7664) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
09-04
2025-07-28 17:17:24.640 4997-4997/? E/LoadedApk: Unable to instantiate appComponentFactory java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.CoreComponentFactory" on path: DexPathList[[zip file "/data/app/~~oocBzTKzJzrykXxwo2pUUw==/com.tencent.nba2kol-EEy-nw9eiTduuLYyKIP8qw==/base.apk"],nativeLibraryDirectories=[/data/app/~~oocBzTKzJzrykXxwo2pUUw==/com.tencent.nba2kol-EEy-nw9eiTduuLYyKIP8qw==/lib/arm64, /data/app/~~oocBzTKzJzrykXxwo2pUUw==/com.tencent.nba2kol-EEy-nw9eiTduuLYyKIP8qw==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at android.app.LoadedApk.createAppFactory(LoadedApk.java:282) at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:995) at android.app.LoadedApk.getClassLoader(LoadedApk.java:1082) at android.app.LoadedApk.getResources(LoadedApk.java:1330) at android.app.ContextImpl.createAppContext(ContextImpl.java:3068) at android.app.ContextImpl.createAppContext(ContextImpl.java:3060) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7057) at android.app.ActivityThread.access$1800(ActivityThread.java:284) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2277) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:233) at android.os.Looper.loop(Looper.java:334) at android.app.ActivityThread.main(ActivityThread.java:8344) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1065) --------- beginning of crash
07-30
07-27 07:12:45.574 5050 5050 W ziparchive: Unable to open '/system/priv-app/SystemUI/SystemUI.apk': No such file or directory 07-27 07:12:45.575 5050 5050 E ndroid.systemu: Failed to open APK '/system/priv-app/SystemUI/SystemUI.apk' I/O error 07-27 07:12:45.576 5050 5050 E ResourcesManager: failed to add asset path /system/priv-app/SystemUI/SystemUI.apk 07-27 07:12:45.577 5050 5050 D AndroidRuntime: Shutting down VM 07-27 07:12:45.580 5050 5050 E AndroidRuntime: FATAL EXCEPTION: main 07-27 07:12:45.580 5050 5050 E AndroidRuntime: Process: com.android.systemui, PID: 5050 07-27 07:12:45.580 5050 5050 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Configuration android.content.res.Resources.getConfiguration()' on a null object reference 07-27 07:12:45.580 5050 5050 E AndroidRuntime: at android.app.ActivityThread.updateLocaleListFromAppContext(ActivityThread.java:5570) 07-27 07:12:45.580 5050 5050 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5799) 07-27 07:12:45.580 5050 5050 E AndroidRuntime: at android.app.ActivityThread.access$1100(ActivityThread.java:200) 07-27 07:12:45.580 5050 5050 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656) 07-27 07:12:45.580 5050 5050 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106) 07-27 07:12:45.580 5050 5050 E AndroidRuntime: at android.os.Looper.loop(Looper.java:193) 07-27 07:12:45.580 5050 5050 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6718) 07-27 07:12:45.580 5050 5050 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 07-27 07:12:45.580 5050 5050 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 07-27 07:12:45.580 5050 5050 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 07-27 07:12:45.592 442 1867 V RescueParty: Disabled because of active USB connection 07-27 07:12:45.593 442 1867 W ActivityManager: Process com.android.systemui has crashed too many times: killing! 07-27 07:12:45.619 5050 5050 I Process : Sending signal. PID: 5050 SIG: 9 07-27 07:12:45.655 442 2025 I ActivityManager: Process com.android.systemui (pid 5050) has died: pers PER 07-27 07:12:45.655 442 486 W libprocessgroup: kill(-5050, 9) failed: No such process 07-27 07:12:45.655 442 486 I libprocessgroup: Successfully killed process cgroup uid 10024 pid 5050 in 0ms 07-27 07:12:45.656 226 226 I Zygote : Process 5050 exited due to signal (9) 07-27 07:12:45.656 442 2025 W ActivityManager: Scheduling restart of crashed service com.android.systemui/.SystemUIService in 0ms 07-27 07:12:45.656 442 2025 W ActivityManager: Scheduling restart of crashed service com.android.systemui/.keyguard.KeyguardService in 0ms 07-27 07:12:45.656 442 2025 W ActivityManager: Scheduling restart of crashed service com.android.systemui/com.android.zhkj.ZhkjService in 0ms 07-27 07:12:45.660 442 2025 W ActivityManager: Re-adding persistent process ProcessRecord{58aa8e 5050:com.android.systemui/u0a24} 07-27 07:12:45.692 5066 5066 I Zygote : seccomp disabled by setenforce 0 07-27 07:12:45.692 442 485 I ActivityManager: Start proc 5066:com.android.systemui/u0a24 for restart com.android.systemui 07-27 07:12:45.753 5066 5066 W System : ClassLoader referenced unknown path: /system/priv-app/SystemUI/SystemUI.apk 07-27 07:12:45.761 5066 5066 E LoadedApk: Unable to instantiate appComponentFactory 07-27 07:12:45.761 5066 5066 E LoadedApk: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.app.CoreComponentFactory" on path: DexPathList[[],nativeLibraryDirectories=[/system/priv-app/SystemUI/lib/arm, /system/lib, /system/lib]] 07-27 07:12:45.761 5066 5066 E LoadedApk: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134) 07-27 07:12:45.761 5066 5066 E LoadedApk: at java.lang.ClassLoader.loadClass(ClassLoader.java:379) 07-27 07:12:45.761 5066 5066 E LoadedApk: at java.lang.ClassLoader.loadClass(ClassLoader.java:312) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.app.LoadedApk.createAppFactory(LoadedApk.java:226) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:731) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.app.LoadedApk.getClassLoader(LoadedApk.java:810) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.app.LoadedApk.getResources(LoadedApk.java:1032) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.app.ContextImpl.createAppContext(ContextImpl.java:2345) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5798) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.app.ActivityThread.access$1100(ActivityThread.java:200) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.os.Handler.dispatchMessage(Handler.java:106) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.os.Looper.loop(Looper.java:193) 07-27 07:12:45.761 5066 5066 E LoadedApk: at android.app.ActivityThread.main(ActivityThread.java:6718) 07-27 07:12:45.761 5066 5066 E LoadedApk: at java.lang.reflect.Method.invoke(Native Method) 07-27 07:12:45.761 5066 5066 E LoadedApk: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 07-27 07:12:45.761 5066 5066 E LoadedApk: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 分析
07-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值