全部产品
云市场
云游戏

适配 targetSdkVersion 28

更新时间:2020-06-22 15:21:46

背景

为应对谷歌在 Google Play 上发布的应用 targetSdkVersion 不小于 28 的要求,mPaaS 在特定基线上对此要求进行了支持。如果您的应用需要在 Google Play 上发布,请联系技术支持人员或 提交工单 获取支持 64 位 CPU 的基线号,并参照本文中的 更新 SDK适配 targetSdkVersion 28 完成适配,并按照 回归测试 的内容对适配进行确认。

更新 SDK

前提条件

已使用 mPaaS IDEA 插件管理依赖(即 portal 工程根目录下有 mpaas_packages.json 文件)。

操作步骤

  1. 更新 IDEA 插件 至最新版本。
  2. 为确保更新成功,请在备份后删除 portal 工程根目录下已有的 mpaas_packages.json 文件。
  3. 使用 IDEA 插件的 组件管理 功能,勾选 自定义基线,填入您获取到的基线号,点击 OK 。您也可以参考 定制基线 以获得更多信息。
  4. 按照引导安装所需的组件。
  5. 如果您需要使用分享 SDK,请在 portal 工程主 module 下的 build.gradle 中添加依赖:
    1. bundle 'com.alipay.android.phone.mobilecommon:share-build:1.3.0.190929144835@jar'
    2. manifest 'com.alipay.android.phone.mobilecommon:share-build:1.3.0.190929144835:AndroidManifest@xml'
  6. mPaaS SDK 中已移除内置的高德定位和搜索 SDK,如果您需要使用,可自行添加高德官方提供的 Google Play 版本 SDK。

适配 targetSdkVersion 28

在 portal 工程主 module 下的 build.gradle 文件中修改属性 targetSdkVersion 28。

通用配置

修改 portal 工程 AndroidManifest.xml:

  • 添加权限:
    1. <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  • application 节点下添加:
    1. <uses-library android:name="org.apache.http.legacy" android:required="false"/>
  • LauncherActivity 删除以下属性(sdk 已改为通过代码设置):
    1. android:screenOrientation="portrait"

    其他配置

    允许 http 请求

    Android 9.0 的网络配置默认禁止了 http 请求,只允许 https 请求,设置 targetSdkVersion 28 将在9.0+设备上启用 9.0 的网络配置。如果您仍然需要发送 http 请求,可通过配置 networkSecurityConfig 开启。
  • 在 portal 工程 res/xml 下创建 network_security_config.xml 文件,内容如下:
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <network-security-config>
    3. <base-config cleartextTrafficPermitted="true">
    4. <trust-anchors>
    5. <certificates src="system" />
    6. </trust-anchors>
    7. </base-config>
    8. </network-security-config>
  • 在 portal 工程 AndroidManifest.xml 中 application 节点添加属性:
    1. android:networkSecurityConfig="@xml/network_security_config"
    更多配置可参考 谷歌官方文档

透明背景 Activity 设置屏幕方向 crash

该适配点为 Android 8.0 系统 bug。在 8.0 设备上,当应用 targetSdkVersion > 26 时,透明背景的 Activity 如果设置了屏幕方向,打开该 Activity 就会触发 crash。触发具体条件为:

  • Activity 使用的 theme 中 windowIsTranslucent 或 windowIsFloating 属性为 true。
  • 在 AndroidManifest.xml 中设置了 screenOrientation 属性,或调用了 setRequestedOrientation 方法。

您需要检查所有 Activity 是否满足触发条件,同时除了您自定义的 style 外,请注意部分常用的系统 theme 也满足条件,例如:

  1. @android:style/Theme.Translucent.NoTitleBar
  2. @android:style/Theme.Dialog

推荐适配方式:

  1. 对于 theme 满足条件的 Activity,删除 AndroidManifest.xml 中 screenOrientation 属性,改为调用 setRequestedOrientation 方法。
  2. 在对应 Activity 或父类中重写 setRequestedOrientation 方法,try catch super.setRequestedOrientation() 兜底:

    1. @Override
    2. public void setRequestedOrientation(int requestedOrientation) {
    3. try {
    4. super.setRequestedOrientation(requestedOrientation);
    5. } catch (Exception ignore) {
    6. }
    7. }
  3. mPaaS 提供的 BaseActivity、BaseFragmentActivity、BaseAppCompatActivtiy 均已重写 setRequestedOrientation 方法兜底。
  4. 完成上述适配后,虽可避免 crash,但仍可能出现在8.0设备上锁定方向失效的情况,请确保您的 Activity 不会因旋转屏幕发生异常(例如重走生命周期导致某些成员变量为空)。

Android 8.0 系统相关源码:android 8.0 bug

回归测试

全量回归测试的设备中必须包含 Android 9.0+设备,同时对于透明背景 Activity 设置屏幕方向 crash问题,请在 Android 8.0 机型上专项测试。

回归测试中您需要重点关注以下组件功能(如果使用):

组件 验证项目
移动网关 - 开启 签名校验 后,RPC调用是否成功。
- 开启 数据加密 后,RPC调用是否成功。
热修复
- 热修复 是否能够生效。
UC内核 - H5容器使用UC内核 后,各项功能是否正常。
- 小程序 (必须使用UC内核),各项功能是否正常。
- 小程序打开手机相册、拍照及预览 是否正常。
- 小程序发起http请求 是否成功(如果强制开启了http)。
扫一扫 - 标准 UI 扫码是否成功。
- 标准 UI 打开手机相册、拍照及预览是否正常。
- 自定义 UI 扫码是否成功,如自定义 UI,需要 适配部分新接口
统一存储 - 数据库加密存储 是否正常。
- 文件加密存储 是否正常。
分享 - 分享到新浪微博、QQ 是否成功。