非 SDK 接口常见问题 Android 开发者 FAQ Vol13

  涵盖范围内的 Java 字段和方法。此类接口是 SDK 的内部实现细节,可能随时会被修改,且不对开发者另行通知。

  A:谷歌正在逐步限制非 SDK 接口的使用:针对不同接口采取不同形式的限制 (详情请参照条目 “应用运行时,我应该如何检测非 SDK 接口的使用?” )。若您正在使用非 SDK 接口进行开发,请特别注意限制对应用行为造成的影响。

  如果我正在使用非 SDK 接口,我应该如何提交请求,申请重新评估该接口?

  非 SDK 接口都有哪些不同管控名单?且不同名单下接口的限制又有何不同?

  - 黑名单:不论 target SDK 版本为多少,所有应用均不允许调用黑名单接口。对开发者来说,相当于系统里不存在这些接口。比如,当应用试图调用此类接口时,系统会抛出 NoSuchMethodError / NoSuchFieldException 异常,并且在应用获取特定类的字段和方法列表时,不在返回列表中包含此类接口。

  我在应用开发过程中引用了不少第三方库,很难发现它们调用了哪些私有 API,请问谷歌能否提供编译时工具帮助我追踪这些违规行为?

  A:您可尝试 AOSP 开源项目中的静态分析工具 “veridex” 及其预编译可执行程序。

  - 在 Andrid P 最终版本中:Toast 信息只在调试版本的应用中显示;同时仅在非 SDK 接口调用被拒绝的情况下,系统才会打印 logcat 信息。

  - 进行额外静态分析,在分析中适当增加误报 (false positive) 信息。

  若您想在 adb logcat 中显示 API 访问信息,您可通过以下命令更改 API 执行策略:

  A:在 Android P 开发过程中,我们对各名单进行了不同方式的迭代:

  - 开发者预览版 1:仅有浅灰和深灰名单。所有我们试图限制的非 SDK 接口都被列在深灰名单中。

  - Beta 1:仅有浅灰名单和黑名单。在预览版1的基础上对浅灰名单进行增补,其余非 SDK 接口均移至黑名单。

  - Beta 2:浅灰、深灰和黑名单均存在,许多黑名单中的接口被移至深灰名单。

  A:深灰名单中包含了在开发阶段中未被发现使用的方法和字段,但我们有可能会有疏漏,所以我们也将一些与公开 SDK 及浅灰名单中的接口密切相关的接口也移入了深灰名单。

  A:它们都被编译进 Android 平台中。您可前往以下地址查找编译前的条目:

  此外,您可前往该地址查看 SDK 28 中的浅灰名单接口 (名单 3)。

  黑名单与深灰名单是在平台编译时按照一定规则自动生成的。我们也添加了一条编译规则在 AOSP 开源项目中生成这些名单。请注意:这里生成的黑名单与 Android P 中的黑名单不相同,但差别不大。开发者可下载 AOSP 开源项目,然后通过以下命令生成黑名单:make hiddenapi-aosp-blacklist

  A:这些名单被编码在平台 dex 文件中的字段和方法的访问标志中。系统映像中没有包含这些名单的单独文件。

  A:是的。OEM 厂商可以在黑名单中添加自己的 API,但是不允许从原始 / AOSP 黑名单 (或灰名单) 中移除项目。兼容性标准文档 (CDD) 禁止此类更改,且兼容性测试 (CES) 会确保 Android 运行时 (ART) 检查该名单。

  A:仅开发者预览版会显示 Toast 信息,最终版本将不再显示此类信息。此外:

  - Beta 2 将大部分黑名单中的接口移至深灰名单。Beta 2 的限制名单和最终版应该十分接近,不过依旧会根据收到的反馈进行一定修改。

  A:我们暂时不会限制开发者访问 dex2oat 二进制文件,但是在开发文档《Dalvik 可执行文件格式》指定的 dex 公开格式以外,我们不保证其它 dex 文件格式及其接口的稳定性。我们保留随时更改或移除 dex2oat 文件和未指定格式的 dex 文件的权利。请注意,通过 dex2oat 转换的文件格式,如 odex (即 oat)、vdex、cdex 等,均为未指定格式。

  如果关键第三方 SDK(尤其是,加固工具)必须调用非 SDK 接口,而第三方开发者也承诺该接口会兼容未来 Android 版本,Android 能否取消对该接口的警告?

  A:我们不会因为单独 SDK 用例就放宽兼容性要求。如果 SDK 合作伙伴无法保证兼容现行的白名单和灰名单接口,他们可以提交需求,申请使用某个非 SDK 接口。

  在 Android P 中,我们暂时不会对 Android 应用或 SDK 当前已使用的非 SDK 接口加以限制,但在今后,若相关接口有合适的 SDK 替代选项,我们计划引入 target SDK 限制。注意:如果调用了非 SDK 或非 NDK 接口,这些接口中的大部分每年都会出现兼容问题,需要不断进行适配。

  非 SDK 接口限制是否适用于所有应用 (包括系统应用和第一方应用),而不仅仅是第三方应用?

  A:是的。但是由平台密钥签名的应用不受限制,同时我们还为一些系统映像中的应用提供了软件包级别的白名单。请注意:此类豁免仅适用于系统映像中的应用(或更新后在系统映像中的应用)。

  某些开发者已经发表文章,公布了私有 API 限制的运行机制以及突破方法,谷歌方面对此有何看法?是否会加强管控?

  A:我们知道会有潜在的方法来帮助开发者绕过限制。不过,好在大部分应用坚持使用公开 API。我们会加大调用非 SDK 接口的难度,确保应用兼容性,与此同时找到一个比较好的平衡点,方便运行时的调试。我们将继续开展具体实现的评估工作,与开发者保持积极合作。

  如果您仍然有关于系统及兼容性等问题,欢迎在我们的微信公众平台留言,我们会继续收集有代表性的问题,请我们的工程师做出解答,并将答案尽量及时地回复给大家。同时,也请关注下一期的 “Android 开发者 FAQ” 专题文章,希望可以帮助您补充相关知识技能。

  阅读原文查看《对于非 SDK 接口的限制》文档了解详细信息返回搜狐,查看更多

您可能还会对下面的文章感兴趣: