Android9.0对非 SDK 接口的限制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q714093365/article/details/83177796

在 Android 9.0 版本中,谷歌加入了非 SDK 接口使用限制,无论是通过调用、反射还是JNI等方式,开发者都无法对非 SDK 接口进行访问,此接口的滥用将会带来严重的系统兼容性问题。 在开发过程中,开发者如果调用了非 SDK 接口,会导致应用出现crash,无法启动;或在运行过程中出现崩溃、闪退等现象;也可能导致应用功能不可用等严重兼容性问题,其影响范围波及所有调用此接口的应用。 

 目的:通过减少对非SDK 接口的调用,提升应用的稳定性。

区分 SDK 接口和非 SDK 接口

SDK 接口是指在 Android 框架软件包索引API中记录的接口。

非 SDK 接口是 API 抽象化的实现细节,它们是不属于官方 Android SDK 的 Java 字段和函数;其会随时更改,不另行通知,如:private修饰的方法.

用于限制非 SDK 接口的不同名单

 测试非 SDK 接口

通过 Android 9 对您的应用进行测试。系统将打印日志,如果您的应用访问某些“列入灰名单的”非 SDK 接口,系统还可能显示 toast。 如果您的应用调用“列入黑名单的”非 SDK 接口,系统将引发错误。

注意 toast,它会提醒您注意被建议禁用的接口。 此外,确保检查应用的日志消息,其中包含关于应用所访问的非 SDK 接口的更多详细信息,包括以 Android 运行时所使用的格式列出的声明类、名称和类型。 日志消息还说明了访问方法:直接、通过反射或者通过 JNI。 最后,日志消息显示调用的非 SDK 接口属于灰名单还是黑名单。

方法1:动态运行,通过日志分析扫描

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

关键日志

*Accessinghidden 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)

 方法2:静态扫描,通过谷歌提供的 Veridex 扫描工具扫描

  • 工具路径:art/tools/veridex/

  • 工具编译:make appcompat

  • 工具执行:appcompat.sh –dex-file=test.apk

  • 工具执行(带参数,扫描的结果更全面,但可能存在误报的情况):  appcompat.sh –dex-file=test.apk –imprecise

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

  • 工具下载:Veridex下载1

  • 具体使用请参阅: veridex工具扫描非 SDK 接口

 非SDK接口整改

浅灰名单中的非SDK接口若不整改,仍可以正常使用。开发者需要重点关注的是深灰名单和黑名单中的非 SDK 接口,找到可替代的 SDK 接口进行适配。如果调用的接口在深灰名单或者黑名单中,且无法找到可替代的SDK接口,可向谷歌提供必需使用此接口的详细原因,申请重新评估该接口。链接

猜你喜欢

转载自blog.csdn.net/q714093365/article/details/83177796