背景
- Google Play 将要求新应用(自 2018 年 8 月 1 日起)和应用更新(自 2018 年 11 月 1 日起)将目标 API 级别至少设为 26 (Android 8.0)。
- 应国家电信终端产业协会要求,自2019年5月1日起,华为应用市场新上架应用应基于Android8.0(API Level 26)及以上版本开发。自2019年8月1日起,现有应用的更新应基于Android8.0(API Level 26)及以上版本进行开发,安卓绿色联盟提醒广大应用开发者请提前做好准备,及时适配。
在Google Play和国内主要应用市场的要求下,更新和上架新产品,targetSdkVersion都要求在26以上。在此背景下,升级势在必行。
本文重点介绍了一些要点,以帮助更新目标 API 级别,满足 Google Play 和应用市场的要求。详细行为变更,请点击您应用的当前 API 级别:
- Android 5.0(API 级别 21)以下版本。
- Android 6.0(API 级别 23)以下版本。
- Android 7.0(API 级别 24)以下版本。
- Android 8.0(API 级别 26)以下版本。
- Android 9.0(API 级别 28)以下版本。
未适配的原因
- 工作量比较大,适配点较多(还是19)
- 敏感权限需要动态申请
- 低电量模式限制,对保活、闹钟提醒等有影响
- 版本排期问题
下面主要对,Android 5.0、6.0、7.0、8.0中适配的点进行介绍及相应解决方案。
Android 5.0(API 级别 21)
请查看下列每个版本对应的“行为变更”页面,以确保您的应用已将这些版本推出的变更纳入考量:
适配点:
-
Webview混合内容在API 21以上适配
否则部分https的图片无法加载出,例子微鲤小说
Android 6.0(API 级别 23)以下版本
运行时权限
- 敏感权限只能在运行时授予。
- 应用应尽可能做好准备,以应对权限请求遭拒的情况。
使用的敏感权限
- 地理位置(ACCESS_FINE_LOCATION、WRITE_EXTERNAL_STORAGE)
- 存储权限(WRITE_EXTERNAL_STORAGE)
- 手机状态(READ_PHONE_STATE)
- 读取日历权限(READ_CALENDAR、WRITE_CALENDAR)
- 通讯录联系人权限 (READ_CONTACTS)
- 麦克风录音权限(RECORD_AUDIO)
- 多媒体权限(CAMERA)
以上权限在使用时都需要动态申请,而且要做好被拒绝时的适配。
解决方案
现在已经有了比较好的开源解决方案,具体的使用参照对应的使用说明。
-
RxPermissions
RxPermissions配合RxJava或RxJava2,响应式链式返回结果。目前微鲤省钱、微鲤测测中都是使用此方案。 -
PermissionsDispatcher和AndPermission
这两个也是使用比较多的解决动态权限申请的库。
Android 7.0(API 级别 24)以下版本
-
低电耗模式和应用待机模式
参照对低电耗模式和应用待机模式进行针对性优化
当设备处于低电耗模式和应用待机模式时,系统的行为如下:* 限制网络访问权限。 * 延迟提醒、同步和作业。 * 限制 GPS 和 WLAN 扫描。 * 限制一般优先级的 Firebase 云消息传递消息。
-
权限变更
系统限制访问应用不公开目录;
在您的应用之外显示 file:// URI 会触发 FileUriExposedException。需要在其应用之外共享文件的开发者应实施 FileProvider。 -
系统禁止链接到非 NDK 库
-
APK signature scheme v2
影响和解决方案
- 低电耗模式和应用待机
AlarmManager的使用,具体参照对低电耗模式和应用待机模式进行针对性优化
1、如果您需要设置在低电耗模式下触发的闹铃,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle();
2、一般情况下,使用 setAlarmClock() 设置的闹铃将继续触发 — 但系统会在这些闹铃触发之前不久退出低电耗模式。
注:对于每个应用,setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle() 触发闹铃的时间间隔都不能超过 9 分钟。
3、加入白名单 - 系统限制访问应用不公开目录
Uri.fromFile(new File(photoUrl))此种形式的需改成Uri photoOutputUri = FileProvider.getUriForFile(getApplicationContext(),getPackageName() + ".fileProvider",new File(photoUrl));形式,解决方案参考Android 7.0 适配中 FileProvider
注意加FLAG_GRANT_READ_URI_PERMISSION。 - so库适配
项目中mp3库编译有误,不支持API 26级别。 - Android 7.0以下使用TYPE_TOAST类型做悬浮窗,这样即使通知权限被禁,也可用通过这种方式重写Toast生效;但是7.1之后失效在用此种方式显示自定义Toast可能会引起crash。新实现方式使用DecorView中添加view的方式。
-
APK signature scheme v2
7.0引入v2签名方式,AS 2.2后默认开启,由于快速打包方案需禁掉。添加v2SigningEnabled false在gradle中,打包时默认勾选v1方式。
Android 8.0(API 级别 26)以下版本
主要适配以下几点:
-
后台执行限制
主要涉及高德定位相关内容,升级高德sdk到支持8.0的版本 -
通知渠道
这个注意点比较多:channel、优先级、主题色等 - 快捷方式适配
- 隐式广播限制
Android8.0无法接收隐式广播消息;所有自定义的静态广播发送时都需要修改setPackage或setComponent,参考文章 -
未知来源应用安装适配
后续经过验证,暂时不调用系统授权,直接安装即可。注意加FLAG_GRANT_READ_URI_PERMISSION,否则会安装失败。
Android 9.0(API 级别 28)以下版本
主要注意以下几点:
-
默认情况下启用网络传输层安全协议 (TLS)
如果您的应用以 Android 9 或更高版本为目标平台,则默认情况下 isCleartextTrafficPermitted() 函数返回 false。 如果您的应用需要为特定域名启用明文,您必须在应用的网络安全性配置中针对这些域名将 cleartextTrafficPermitted 显式设置为 true。 -
Apache HTTP 客户端弃用
最好将HttpClient全部替换掉,否则后crash。
网友评论