android.app.LoadedApk.mReceivers 内存泄漏

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存泄漏原因

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

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

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

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

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

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

03-16 12:33:00.942 18324 18324 E AndroidRuntime: FATAL EXCEPTION: main 03-16 12:33:00.942 18324 18324 E AndroidRuntime: Process: com.android.bluetooth, PID: 18324 03-16 12:33:00.942 18324 18324 E AndroidRuntime: java.lang.IllegalArgumentException: Receiver not registered: com.oplus.bluetooth.feature.dcs.OplusBluetoothRecorderFactory$1@f666353 03-16 12:33:00.942 18324 18324 E AndroidRuntime: at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1777) 03-16 12:33:00.942 18324 18324 E AndroidRuntime: at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1922) 03-16 12:33:00.942 18324 18324 E AndroidRuntime: at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:832) 03-16 12:33:00.942 18324 18324 E AndroidRuntime: at com.oplus.bluetooth.feature.dcs.03-16 12:33:00.942 18324 18324 E AndroidRuntime: FATAL EXCEPTION: main 03-16 12:33:00.942 18324 18324 E AndroidRuntime: Process: com.android.bluetooth, PID: 18324 03-16 12:33:00.942 18324 18324 E AndroidRuntime: java.lang.IllegalArgumentException: Receiver not registered: com.oplus.bluetooth.feature.dcs.OplusBluetoothRecorderFactory$1@f666353 03-16 12:33:00.942 18324 18324 E AndroidRuntime: at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1777) 03-16 12:33:00.942 18324 18324 E AndroidRuntime: at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1922) 03-16 12:33:00.942 18324 18324 E AndroidRuntime: at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:832) 03-16 12:33:00.942 18324 18324 E AndroidRuntime: at com.oplus.bluetooth.feature.dcs.OplusBluetoothRecorderFactory.cleanUp(OplusBluetoothRecorderFactory.java:312).cleanUp(OplusBluetoothRecorderFactory.java:312) 帮我看看报错是什么,是什么类型的报错,怎么导致的
最新发布
03-21
``` SELinux : avc: denied { find } for interface=vendor.mediatek.hardware.nvram::INvram sid=u:r:system_server:s0 pid=955 scontext=u:r:system_server:s0 tcontext=u:object_r:mtk_hal_nvramagent_hwservice:s0 tclass=hwservice_manager permissive=1 03-13 21:32:52.240 955 955 I system_server: type=1400 audit(0.0:46332): avc: denied { call } for scontext=u:r:system_server:s0 tcontext=u:r:mtk_hal_nvramagent:s0 tclass=binder permissive=1 03-13 21:32:52.247 955 955 I android_os_HwBinder: HwBinder: Starting thread pool for getting: vendor.mediatek.hardware.nvram@1.0::INvram/default 03-13 21:32:52.250 955 955 D NetworkSecurityConfig: No Network Security Config specified, using platform default 03-13 21:32:52.251 955 955 E Zygote : System zygote died with fatal exception 03-13 21:32:52.251 955 955 E Zygote : java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hra.TouchPenWizard/com.hra.TouchPenWizard.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference 03-13 21:32:52.251 955 955 E Zygote : at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3742) 03-13 21:32:52.251 955 955 E Zygote : at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3879) 03-13 21:32:52.251 955 955 E Zygote : at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 03-13 21:32:52.251 955 955 E Zygote : at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 03-13 21:32:52.251 955 955 E Zygote : at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 03-13 21:32:52.251 955 955 E Zygote : at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2346) 03-13 21:32:52.251 955 955 E Zygote : at android.os.Handler.dispatchMessage(Handler.java:106) 03-13 21:32:52.251 955 955 E Zygote : at android.os.Looper.loopOnce(Looper.java:201) 03-13 21:32:52.251 955 955 E Zygote : at android.os.Looper.loop(Looper.java:288) 03-13 21:32:52.251 955 955 E Zygote : at com.android.server.SystemServer.run(SystemServer.java:983) 03-13 21:32:52.251 955 955 E Zygote : at com.android.server.SystemServer.main(SystemServer.java:659) 03-13 21:32:52.251 955 955 E Zygote : at java.lang.reflect.Method.invoke(Native Method) 03-13 21:32:52.251 955 955 E Zygote : at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:569) 03-13 21:32:52.251 955 955 E Zygote : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997) 03-13 21:32:52.251 955 955 E Zygote : Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference 03-13 21:32:52.251 955 955 E Zygote : at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1489) 03-13 21:32:52.251 955 955 E Zygote : at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1399) 03-13 21:32:52.251 955 955 E Zygote : at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3653) 03-13 21:32:52.251 955 955 E Zygote : ... 13 more 03-13 21:32:52.251 955 955 D AndroidRuntime: Shutting down VM```原因
03-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值