TargetSdkVersion升级26总结

作者: 凌空御风 | 来源:发表于2019-01-10 17:39 被阅读12次

背景

  • 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 级别:

未适配的原因

  • 工作量比较大,适配点较多(还是19)
  • 敏感权限需要动态申请
  • 低电量模式限制,对保活、闹钟提醒等有影响
  • 版本排期问题

下面主要对,Android 5.0、6.0、7.0、8.0中适配的点进行介绍及相应解决方案。

Android 5.0(API 级别 21)

请查看下列每个版本对应的“行为变更”页面,以确保您的应用已将这些版本推出的变更纳入考量:

适配点:

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,响应式链式返回结果。目前微鲤省钱、微鲤测测中都是使用此方案。
  • PermissionsDispatcherAndPermission
    这两个也是使用比较多的解决动态权限申请的库。

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。

相关文章

网友评论

    本文标题:TargetSdkVersion升级26总结

    本文链接:https://www.haomeiwen.com/subject/qhplzftx.html