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

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

区分 SDK 接口和非 SDK 接口

SDK 接口是指在 Android 框架软件包索引
<https://developer.android.google.cn/reference/packages.html>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 <https://pan.baidu.com/s/1NojiqPjvJMzJ_AuHd5jukQ>

*
具体使用请参阅: veridex工具扫描非 SDK 接口
<https://blog.csdn.net/yi_master/article/details/80664674>

 非SDK接口整改

浅灰名单中的非SDK接口若不整改,仍可以正常使用。开发者需要重点关注的是深灰名单和黑名单中的非 SDK 接口,找到可替代的 SDK
接口进行适配。如果调用的接口在深灰名单或者黑名单中,且无法找到可替代的SDK接口,可向谷歌提供必需使用此接口的详细原因,申请重新评估该接口。链接
<https://issuetracker.google.com/issues/new?component=328403&template=1027267>

 

 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信