应用开机自启问题排查

来源:互联网 发布:it维保服务 编辑:程序博客网 时间:2024/06/01 07:46

问题背景:

由于项目接近尾声,近期测试人员主要针对应用性能、稳定性等方面进行集中测试,以保证应用上线后的稳定运行。
前几天测试人员提出一个bug,手机开机后应用在后台启动起来了,以下为测试步骤:
1. 将手机手动重启或者使用adb reboot命令重启
2. 手机开机后,静置手机五分钟(不做任何操作)
3. 五分钟后,使用adb shell dumpsys meminfo查看内存占用情况

实际结果:
使用adb shell dumpsys meminfo查看,发现com.test.A应用存在于内存中,应用启动
预期结果:
com.test.A开机不自启动

问题分析:

按照上面的测试步骤我尝试复现了一下,使用adb shell dumpsys meminfo查看内存信息如下:

手机内存占用

另:也可使用adb shell dumpsys meminfo > d:\meninfo.txt,将内存信息导入到D盘下的meninfo.txt文件中
ps:此图只为演示作用
发现com.test.A存在于上面的列表中(假设有这个应用,项目机密不便透露包名)

于是,开始着手分析是什么导致了应用的开机自启动:

1.AndroidManifest.xml中配置了BOOT_COMPLETED的Reveiver

根据我对该项目的业务流程和代码的熟悉,当然这个是不存在的。不过我还是仔细排查了一遍项目的manifest文件,并没有搜到有Receiver注册了开机自启动的action:

<action android:name="android.intent.action.BOOT_COMPLETED"/>

这…就尴尬了,我和老大眼瞪眼,似乎都没有了思路。。。

2.其他自启应用启动了应用,比如监听应用的Provider

我想,既然应用不是自身启动起来的,会不会是其他应用(需要开机自启)启动起来的?

于是,导出来一份手机的全量日志开始分析,果然有了眉目,哈哈^_^
经过分析系统的全量log,发现应用是由com.test.B启动起来的。而应用com.test.B确实是有开机自启的权限的;进一步分析发现是由应用B监听了A应用的Provider,来获取A应用里面的数据。
而该Provider已经废弃了:A应用不再本地保存某项数据,改由服务器保存。所以,删除该Provider即可

问题得以解决,全工程下搜索使用到该Provider的模块,并知会相关模块负责人修改相关代码即可。

总结

引起应用开机自启的原因:

  • 被应用自身:如监听了开机广播 BOOT_COMPLETED
  • 被其他应用启动:如其他应用监听了该应用的Provider
1 0
原创粉丝点击