Android P版本非SDK接口管控特性,参考华为

Android P版本非SDK接口管控特性解读及适配指导

在Android P版本中,谷歌加入了非SDK接口使用限制,无论是通过调用、反射还是JNI等方式,开发者都无法对非SDK接口进行访问,此接口的滥用将会带来严重的系统兼容性问题。

针对谷歌的大动作,开发者该如何快速反应,更便捷、高效的实现P版本的适配?华为专家为您带来非SDK管控特性适配指导的详细解读,一起来看看吧。

在开发过程中,开发者如果调用了非SDK接口,会导致应用出现crash,无法启动;或在运行过程中出现崩溃、闪退等现象;也可能导致应用功能不可用等严重兼容性问题,其影响范围波及所有调用此接口的应用,因此,非SDK接口管控被誉为Android史上最严格的变更特性之一。

1. 特性介绍

1.1 非SDK接口的定义

能够在谷歌网站查询到的接口都是SDK接口;除以上的SDK接口外,其他都是非SDK接口。

1.2 危害

非SDK接口在版本之间可能有所变化,应用滥用non-SDK interfaces,将带来兼容性问题。

1.3 非SDK接口管控名单

1. 名单说明

名单类型 影响 名单说明
浅灰名单 targetSDK>=P时,警告。 目前,针对非SDK接口没有可替代SDK接口的这种情况,谷歌暂时将之放在浅灰名单,并在后续版本考虑增加可替代的接口,然后再将接口转移到深灰名单,名单通过代码维护。
深灰名单

targetSDK<P时,警告;
>=p时,不允许调用。

目前,针对非SDK接口有可替代SDK接口的情况,谷歌将之放在深灰名单中,开发者需要将这些非SDK接口进行整改。名单通过代码维护。
黑名单 所有三方应用不允许调用 灰名单(深灰+浅灰)之外的其他所有非SDK接口都将被添加到黑名单中,如果应用使用到黑名单接口,需马上整改或者反馈给谷歌申请加入灰名单。

2. 名单查看:https://android.googlesource.com/platform/frameworks/base/+/master/config/

1.4 非SDK接口调用警告

1. 所有私有API均在Logcat中显示警告。

2. DP版本在Activity开始时会显示Toast警告。

a2.png

3. Debuggable应用出现对话框警告,弹框内容和Toast提示内容一致。

4. 从DP2开始,通过StrictMode内新增的detectNonSdkApiUsage()来检测违规的调用。

5. 正式商用版本将去掉Toast警告和对话框提示。

2. 兼容性影响

2.1 影响范围

调用非 SDK(包括深灰名单、黑名单)接口的所有应用都将受到影响。

2.2 具体影响

在Developer Preview后续版本中,各种访问非SDK接口的方法都会产生错误或其他不良结果:

访问方式 结果
Dalvik指令引用字段 引发NoSuchFieldError
Dalvik指令引用函数 引发NoSuchMethodError
通过Class.getDeclaredField()或Class.getField()反射 引发NoSuchFieldException
通过Class.getDeclaredMethod()或Class.getMethod()反射 引发NoSuchMethodException
通过Class.getDeclaredFields()或Class.getFields()反射 结果中未出现非SDK成员
通过Class.getDeclaredMethods()或Class.getMethods()反射 结果中未出现非SDK成员
通过env->GetFieldID()调用JNI 返回NULL,引发NoSuchFieldError。
通过env->GetMethodID()调用JNI 返回NULL,引发NoSuchMethodErro。

3. 兼容性适配指导

3.1 获取应用使用的所有非SDK接口列表

3.1.1 输出非SDK接口列表

截图.PNG

3.1.2 非SDK接口扫描方法

3.1.2.1 动态运行,通过日志分析扫描

通过自动化或人工测试,遍历应用每一个界面和所有功能,抓取日志分析调用的所有非SDK接口。

关键日志:

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
Accessing hidden method Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; 
(dark greylist, reflection)
Accessing hidden method Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; 
(blacklist, reflection)

3.1.2.2 静态扫描,通过谷歌提供的Veridex扫描工具扫描

1. 工具路径:art/tools/veridex/

2. 工具编译:make appcompat

3. 工具执行:

./art/tools/veridex/appcompat.sh --dex-file=test.apk

使用带参数的命令扫描可使扫描的结果更全面,但可能存在误报的情况:

./art/tools/veridex/appcompat.sh --dex-file=test.apk --imprecise

4. 输出扫描结果:

a5.png

备注:已经加固的应用,需要使用加固前的APK进行扫描。

5. 工具下载:谷歌已开放DP2版本对应的代码下载:https://android.googlesource.com/platform/art/+/android-p-preview-2

6. 源码下载指导:https://source.android.google.cn/setup/downloading

下载P版本Android工程代码后,可直接在工程下编译运行扫描工具,再进行非SDK接口扫描。

3.2 非SDK接口整改

目前在P版本中,浅灰名单中的非SDK接口若不整改,仍可以正常使用。开发者需要重点关注的是深灰名单和黑名单中的非SDK接口,找到可替代的SDK接口进行适配。

1. 无法整改的接口:向谷歌申请重新评估

2. 如果调用的接口在深灰名单或者黑名单中,且无法找到可替代的SDK接口,可向谷歌提供必需使用此接口的详细原因,申请重新评估该接口,问题反馈链接:https://issuetracker.google.com/issues/new?component=328403&template=1027267

问题反馈邮件模板:

a6.png

3.3 重点关注

应用测试发现需要申请加入浅灰名单的非SDK接口需尽快反馈给谷歌,越晚反馈,谷歌修改的难度将越大,可能会导致无法加入灰名单而影响应用的功能。

谷歌发布的DP2版本中已加入黑名单,建议开发者在DP2版本中测试验证应用调用的非SDK接口,针对无法整改的非SDK接口,及时向谷歌反馈必需使用此接口的详细原因,申请重新评估该接口。

4. P版本兼容性测试验证方法

4.1 刷P版本

购买谷歌 Pixel、Pixel XL、Pixel2、Pixel 2 XL,刷P版本进行测试。

4.1.1 版本下载

参考:https://developer.android.google.cn/preview/download

设备 下载链接 SHA-256 校验和
Pixel sailfish-ppp2.180412.013-factory-18f60ec5.zip 18f60ec5d77dc44a2c80ca0819fe3ce3aaeba04cd35a58598b8352eb200b010a
Pixel XL marlin-ppp2.180412.013-factory-cf8ae2b1.zip cf8ae2b1bfe6b9ba8ada311436c29e1cee731c16f1bf790cc36923faf96ee423
Pixel 2 walleye-ppp2.180412.013-factory-6406b348.zip  6406b348c6dc2349b1dcf33e1031043d3d0a2c3a065f64e0385d8ee6dacfbcbf
Pixel 2 XL taimen-ppp2.180412.013-factory-546fdc1f.zip 546fdc1fa56d4d47f1c729688c8087d66d59ce831f01b08e28b67bb0320463cd

 a8.png

DP2版本,需要将网页底部的显示语言修改为英文,中文显示的仍为DP1版本

4.1.2 刷机

刷机前需要退出之前登录的谷歌帐号。

1. 下载对应设备的压缩包并解压。

2. 手机连USB后,执行 adb reboot bootloader 命令。

3. 手机出现小机器人图案,并显示‘unlock’字样时,执行压缩包中的bat脚本。

4. 如果是“lock”字样:
        (1)连续点击设置-版本号7次,打开开发人员选项;
        (2)在开发人员选项中打开OEM unlock;
        (3)连接手机到电脑,执行adb reboot bootloader命令到小机器人界面;
        (4)执行fastboot oem unlock,手机就解锁了,再使用上面的刷机方法即可。

4.2 远程真机调试

新用户如需申请使用华为终端开放实验室的云测功能,需加入安卓绿色联盟,成为会员。可通过以下步骤申请:

1. 登录DevEco平台

2. 使用所在公司尾缀的邮箱进行帐号注册。

3. 将您新申请的帐号、所在公司、个人姓名及电话、负责的应用名称发送至[email protected],申请成为安卓绿色联盟会员,通过审核后,将为您开通使用权限。

4. 登录帐号选择真机进行远程调试。

a9.png

5. 选择手机:Pixel

a10.png

6. 点击“立即体验”,上传 APK 进行调试。

a11.png

4.3 使用谷歌模拟器验证

安装和配置Android P SDK和模拟器,参考:https://developer.android.google.cn/preview/setup-sdk

更多Android P版本精彩内容请关注安卓绿色联盟

猜你喜欢

转载自blog.csdn.net/qq_19822039/article/details/83537713