在 Android P 版本中,谷歌加入了非 SDK 接口使用限制,无论是通过调用、反射还是JNI等方式,开发者都无法对非 SDK 接口进行访问,此接口的滥用将会带来严重的系统兼容性问题。 在开发过程中,开发者如果调用了非 SDK 接口,会导致应用出现crash,无法启动;或在运行过程中出现崩溃、闪退等现象;也可能导致应用功能不可用等严重兼容性问题,其影响范围波及所有调用此接口的应用;
1:那什么是SDK接口? https://developer.android.google.cn/reference/packages,能够在谷歌网站查询到的接口都是 SDK 接口;
2:那什么是非SDK接口? 所有SDK接口之外的都是非SDK接口
2.1:非SDK接口的三种分类:浅灰名单,深灰名单和黑名单 这里写图片描述
由图可知,当在一个P版本的手机中,即使你的应用targetsdk < p,如果你的app使用了黑名单,那么也会造成app的crash
2.2:那我们在app中使用了非SDK的接口,会出现什么情况?
所有私有 API 均在 Logcat 中显示警告。 DP版本在 Activity 开始时会显示 Toast 警告。 Debuggable 应用出现对话框警告,弹框内容和 Toast 提示内容一致。 从 DP2 开始,由StrictMode内新增的detectNonSdkApiUsage()来检测违规的调用。 3:所以我们应该明确,在P版本中,使用非SDK接口会造成各种兼容性问题,具体产生的不良后果如图所示 这里写图片描述
4:那我们如何知道自己的app使用了非标准SDK的接口?google已经为我们制造了这样的一个工具:veridex veridex下载地址 veridex使用方法 这个工具只提供了 Mac 和 Linux 版本的工具, 那我们windows怎么办呢 官方也提供了解决办法就是用windows子系统linux(wsl)来执行 Linux版本的工具
Native Windows binaries are not provided, but the Linux binaries can be executed with Windows Subsystem for Linux (WSL). Follow the instructions at this link and install Ubuntu distribution when given the choice. Once installed, launch an Ubuntu terminal and follow instructions for Linux.
这个是下载Ubuntu的windows版本 下载地址
安装完成后 输入任何字符都会出现闪退的情况,这是因为你还没有配置成功 配置方法
按照这个配置完成后需要重新启动 重启之后在打开Linux终端 会提示你输了用户名和密码 完成后就进入真正的命令输入终端了
然后输入命令
“/mnt/e/runtime-master-appcompat/appcompat.sh --dex-file=/mnt/e/runtime-master-appcompat/test.apk”
回车确定 就会开始检测了
/mnt/ 这是用来和windows交互的命令
后面的e/runtime-master-appcompat/appcompat.sh这个是你在windows下存放这个文件的路径 e是e盘 后面的file= apk的路径也是一样的
如图
检测结果
5个非SDK接口在深灰名单
59个非SDK接口在浅会名单
并没有使用黑名单里面的非SDK接口
参考