Android9.0对非 SDK 接口的限制
发布时间:2018-10-19 12:00,
浏览次数:919
, 标签:
Android
SDK
在 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接口,可向谷歌提供必需使用此接口的详细原因,申请重新评估该接口。链接