Apk升级过程中排查问题所引发的思考

本篇文章为工作中问题排查解决过程及问题解决后的思考。


前置改动说明:业务相关的 apkA: 一个Launcher 主应用, 一些后台服务相关的apkB: 辅助应用,由于业务需要,在 apkA 中增加了启动 apkB 中的某个 service 相关的代码, 且在 apkB 中 manifest 文件对应 service 增加了 exported = true 属性。


问题说明: 在仅升级apkA时,重启设备, 此时设备卡在开机画面, 无法进入Launcher主应用。


问题排查过程:查看增加的代码处的相关日志,对设备中拉取的日志进行关键字过滤,发现启动 service 时报异常如下:

 java.lang.SecurityException: 
           Not allowed to start service 
           Intent { cmp=xxx.xxx.xxx/.xxxService }
           without permission not exported

报错很清楚,不允许启动未添加 exported 权限的服务。即如果不添加 exported = true,则该服务无法从外部进行启动。 结合问题说明, 出现问题说明中的现象也就可以解释通了。 即:仅升级 apkA 后, apkA 中增加了调用 apkB 中服务的相关代码, 但是未升级 apkB, 旧版 apkB 中没有添加 exported = true 属性, 导致出现问题。


问题解决后的反思:

在新增功能时, 一定要考虑对旧版本 apk 进行兼容,把 apk 升级过程中可能对旧版本的影响以及相关的解决方案都设计好,才能顺利地完成升级。



上一篇:谈CPU共享场景下的性能问题


下一篇:Android Studio比较实用的快捷键