最近使用新手机测试,竟然频繁出现ANR,而且每次加载都很慢。每次加载慢时,都会出现一下代码:
经过了解,Android 9引入了针对非SDK接口的使用限制,无论是直接使用还是通过反射或JNI间接使用。这意味着,通过反射之类的语义来操作某个类时,不应访问SDK中未列出的函数或字段(通常都有@hide
标志)。
blacklist、greylist、greylist-max-o、greylist-max-p含义如下:
- blacklist 黑名单:禁止使用的非SDK接口,运行时直接Crash(因此必须解决)
- greylist 灰名单:即当前版本仍能使用的非SDK接口,但在下一版本中可能变成被限制的非SDK接口
- greylist-max-o: 在targetSDK<=O中能使用,但是在targetSDK>=P中被禁止使用的非SDK接口
- greylist-max-p: 在targetSDK<=P中能使用,但是在targetSDK>=Q中被禁止使用的非SDK接口
一、非SDK接口
官方文档:针对非 SDK 接口的限制
官方从 Android 9(API 级别 28)开始,对应用使用的非 SDK 接口实施了限制。
如果你的APP通过引用非 SDK 接口
或尝试使用反射或 JNI 来获取句柄
,这些限制就会起作用。官方给出的解释是为了提升用户体验、降低应用崩溃
风险。
1.1、非SDK接口检测工具
官方给出了一个检测工具,下载地址
Google官方 veridex下载:
https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat
veridex使用方法:
./appcompat.sh --dex-file=文件名.apk --imprecise
文件名称为veridex.gz,直接解压即可。解压后
因为我开发环境是mac。所以加压veridex-mac.zip文件,并将apk复制进去。
打开终端,cd到当前面目录,执行即可。
appcompat.sh --dex-file=apk.apk
./appcompat.sh --dex-file=文件名.apk --imprecise
补充,这两个命令都可以。只不过--imprecise
参数,可以看到更多详细的信息。
将命令行信息复制出来,根据报名查看需要修改的代码。
完毕——收工——撒花……