互联网客户端基于Android O(API等级26)需解决问题
2019-04-23 本文已影响0人
angeliur
背景:之前的项目targetSDK的版本是23,今年所有应用需要按照《移动应用软件高API等级预置与分发自律公约》的约定,应用应基于Android O开发,否则无法通过应用商店的上架。所以我们的targetSDK版本需要升级到26,下面是公司的架构师总结的升级sdk26需要注意的问题,以及从哪些方面去解决,分享给大家参考。
目前大部分互联网客户端基于Android M(API等级23)开发
达到基于API等级26的目标需要包括下列所有适配内容:
Android M/23 -> Android N/24 -> Android N/25 -> Android O/26
适配内容仅包括 “必须” 适配的部分,不包括 “可选” 内容。“必须”即如果不完成适配,应用可能无法按预期工作,或短期内可能无法按预期工作; “可选” 例如采用操作系统新增功能改进用户体验,或改尚未废弃的老接口为新接口 。
适配方法:
- 调查Android版本间比较显著的行为变化,即确认之前的框架或机制能否继续按预期工作,不能工作的寻找替代方案
- 切换编译环境及目标API版本,修复因API接口变化导致的编译错误
- 寻找废弃接口,换用替代方案
- 处理好老版本兼容性
- 对应用进行全功能测试,排查遗漏的问题并修复
可能存在问题需要排查的点:
- 应用自启动限制
- 23 -> 24/25
应用未运行时无法收到网络变化通知CONNECTIVITY_ACTION;
应用不再能发送、接收ACTION_NEW_PICTURE和ACTION_NEW_VIDEO;
建议采用更加可靠的方式registerNetworkCallback()来监听网络改变 - 25 -> 26
应用不再能够静态注册接收隐式广播(例如ACTION_PACKAGE_REPLACED),但仍可以静态注册接收显式广播;
应用可以动态注册接收任意广播,无论显式或隐式;
需要签名级权限的广播可以继续采用静态注册接收;
存在一些例外: ACTION_BOOT_COMPLETED、 ACTION_LOCALE_CHANGED、 ACTION_MEDIA_MOUNTED等可以继续静态注册接收
- 后台应用运行时间限制
- 23 -> 24/25:Doze
Android 6.0引入Doze,在手机熄屏、未充电、静置不动时进入偶尔短暂唤醒的休眠模式,Android 7.0不再要求静置不动;
在手机休眠期间,系统对应用的网络、CPU、GPS、WiFI等资源和活动性进行限制 - 25 -> 26:后台服务限制
应用刚进入后台时,有几分钟的窗口时间内可以使用后台服务,过了窗口期,服务将被强行停止,且不允许启动后台服务(拒绝执行启动,并抛出异常);
使用Context.startForegroundService()启动前台服务时,必须在规定时间内调用startForeground();
当应用执行接收SMS/MMS、执行来自通知栏的PendingIntent等用户可见任务时,将有几分钟的时间允许使用后台服务
- 后台能力限制
- 25 -> 26:定位限制
后台应用每小时只能收到几次位置更新;
电子围栏事件每两三分钟收到一次;
无法收到GNSS消息;
WiFi扫描每小时只会执行几次
- 隐私
- 25 -> 26:设备识别
应用获得的ANDROID_ID将和特定手机用户、应用的签名相关,不同应用获得的ANDROID_ID不同;
未恢复出厂设置的前提下,同一应用重新安装后将获得相同的ANDROID_ID;
恢复出厂设置后,ANDROID_ID将发生改变;
手机从老版本升级到Android O时,之前的ANDROID_ID将保留,但是删除/重新安装后将发生改变;
Build.SERIAL废弃(在P上功能移除),需要改用Build.getSerial(),而后者需要READ_PHONE_STATE动态权限
- 安全性
- 23 -> 24/25:
TLS/SSL中RC4算法禁用;
TLS/SSL中CHACHA20-POLY1305算法启用;
Crypto JCA provider废弃;
应用之间无法直接访问私有文件,不能直接传递file://形式的文件路径,应用之间分享文件内容需要通过FileProvider进行;
应用不能再通过COLUMN_LOCAL_FILENAME路径访问DownloadManager存储的文件
- 接口标准化
- 23 -> 24/25:只能使用标准NDK API
应用只能使用标准的NDK API,不能再使用未公开的系统so;
违反结果:在新版本手机上无法工作,crash
- 能力变化
- 25 -> 26:创建桌面图标、系统弹出窗口
之前版本创建桌面图标的接口com.android.launcher.action.INSTALL_SHORTCUT不再工作,需要使用新的接口;
持有SYSTEM_ALERT_WINDOW权限的应用,必须使用TYPE_APPLICATION_OVERLAY类型弹出系统窗口,不再能够使用TYPE_PHONE、TYPE_PRIORITY_PHONE、TYPE_SYSTEM_ALERT、TYPE_SYSTEM_OVERLAY、TYPE_SYSTEM_ERROR等类型
- 权限
- 25 -> 26:
需要使用ACTION_INSTALL_PACKAGE的应用,需要持有REQUEST_INSTALL_PACKAGES权限(签名级+用户可设置)
- 其他变化
- API接口行为调整(例如Notification默认设置)
- API新接口、接口修改、废弃
- 新功能及功能改进(例如多窗口、Data Saver、画中画、富状态栏等)
总结:
以上列出了很多版本变化需要关注的点,其中最主要是静态广播的注册、后台服务的限制以及应用间文件访问方式的变更。广播尽可能的采用动态注册的方式,服务可以选择前台服务和JobService两种方式,根据实际的业务需求来选择。如果及时性要求比较高并且能够接受前台服务通知栏就可以使用前台服务的方式来工作,如果实时性要求不是很高可以使用JobService来交给系统分发,系统一次最多可以执行6个JobService,每个可以执行的时间大概是10分钟,10分钟后就会执行其他job,还可以通过设置JobService的优先级来保证系统优先调度。
当然了,这些只是比较重要的部分,更多细节变化的适配需要通过编译、测试验证,再结合自己的实际需求来调整。