刚刚有同窗问我,不太了解 “非SDK接口” 是什么意思?android9.0有什么限制 ?apache的http也有限制 ?html
并且如今的大部分系统都升级上来了,黑名单、灰名单和白名单 也是必需要了解一下的,这里参考Google开发者网站给你们整理一下。python
首先,公共 SDK 接口是在 Android 框架软件包索引 中记录的那些接口,什么是框架软件包?android
连接地址:https://developer.android.google.cn/reference/packages.htmlapache
而 非 SDK 接口 的处理是 API 抽象出来的实现细节,所以这些接口可能会在不另行通知的状况下随时发生更改。微信
黑名单 | 不管应用的目标 API 级别是什么,都没法使用此列表中的非 SDK 接口。若是您的应用尝试访问其中任何一个接口,系统就会抛出错误。 |
灰名单 | 从 Android 9(API 级别 28)开始,在每一个 API 级别分别会限制某些非 SDK 接口。若是应用的目标 API 级别较低,您能够访问灰名单中的受限 API,但若是您的应用尝试访问在您的目标 API 级别受限的非 SDK 接口,系统就会假定此 API 已列入黑名单。说白了,就是只要在您应用的目标 API 级别不限制此列表中的非 SDK 接口,您就可使用它们。 |
白名单 | 此列表中的接口已在 Android 框架软件包索引中正式记录,它们是受支持的接口,您能够自由使用。 |
有的同窗听完仍是比较郁闷……框架
那换个说法吧,好比应用在经过反射等机制与类互动时(WebView、HTTP等),android9.0以后就不该访问 SDK 中未列出的方法或字段,不然会提示报错,应用老老实实的用谷歌大佬提供的API就行了。ide
来看谷歌大佬的回应:工具
尽管您目前仍可使用灰名单中的某些非 SDK 接口(取决于您应用的目标 API 级别),可是若是您使用任何非 SDK 方法或字段,终归存在极可能会损坏应用的风险。若是您的应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 接口或其余替代方案。若是您没法为应用中的功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。测试
尽管仍是可使用,但后果自负。网站
有frameworks的同窗能够看这个路径,此文本包含已列入灰名单的非受限 API 的列表。
若是很是想使用此接口又找不到替代方案时怎么办?能够找Google提需求,以下图。
其它的说明均可以忽略,主要是确认本身的SDK接口究竟是不是属于非SDK接口。
先建议开启lintOptions,检测一下其余问题。
另外在搭载 Android 9(API 级别 28)或更高版本的设备或模拟器上构建和运行可调试应用来测试该应用是否使用非 SDK 接口。
在您的应用上运行测试时,若是该应用访问了某些非 SDK 接口,系统就会输出一条日志消息。
您能够检查应用的日志消息,查找如下详细信息:
咱们可使用 adb logcat 来查看这些日志消息,这些消息显示在所运行应用的 PID 下,不过日志消息看起来很痛苦……
举例而言,日志中可能包含以下条目:
Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
咱们也可使用 StrictMode API 进行测试的
记得在主方法里面开启 StrictMode
,用 StrictMode API 来测试应用是否使用 非 SDK 接口 ,怎么开启?打开 detectNonSdkApiUsage
方法 ,而后使用 penaltyListener
来接收每次使用 非 SDK 接口的行为所对应的回调,而且能够在其中实现自定义处理。
回调中提供的 Violation 对象派生
自 Throwable,而且封闭式堆栈轨迹会提供相应使用行为的上下文。
固然,咱们也可使用 veridex 工具进行测试的
您还能够在 APK 上运行静态分析工具 veridex。veridex 工具 会扫描 APK 的整个代码库(包括全部第三方库),并报告发现的全部使用非 SDK 接口的行为。
不过 veridex
工具存在如下局限性:
有的人会好奇,它对原生代码中的非 NDK 接口是否有限制?Google大佬回应,Android SDK 包含 Java 接口。Android 平台从 Android 7(API 级别 26)开始就已经限制访问原生 C/C++ 代码中的非 NDK 的接口了。
做者:奥特曼超人Dujinyang来源:CSDN
原文:https://dujinyang.blog.csdn.net/article/details/102858639