本篇文章为工作中问题排查解决过程及问题解决后的思考。
前置改动说明:业务相关的 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 升级过程中可能对旧版本的影响以及相关的解决方案都设计好,才能顺利地完成升级。