Android P非SDK接口限制适用于android.support and/or androidx

Android P non SDK interface restrictions applicability to android.support and/or androidx

我们都知道并热爱 "Restrictions on non SDK interfaces"。该页面有关于术语定义的说明:

Generally speaking, SDK interfaces are those ones found documented in the Android framework Package Index.

此包索引左侧的包菜单有一个标题为 "Android Platform" 的第一个部分,然后是一个名为 "Android Support Library" 的单独部分。而黑名单hereandroid.support.

中没有任何符号

那么,"Android Platform"中非SDK接口政策是否只适用于类?并且永远不会设计包含 Androidx?

嗯,是的。

支持库可帮助开发人员在不牺牲功能的情况下瞄准更广泛的受众。 @hide 本机平台中存在 API,因为应用不应使用它们。支持库存在的唯一原因是供应用程序使用。

原生SDK是一个SDK。它是用来告诉 Android Studio 哪些 classes、方法和常量已经存在于 Android、framework.jar 中。 None 其中实际上内置在您的 APK 中。将本机 SDK(和任何 SDK)视为一种 "promise" 到 Android Studio,当它是 运行 时,您正在做的事情实际上会起作用。 SDK 还取决于设备上实际存在的内容。如果 SDK 有设备没有的方法,Android Studio 会编译,但应用程序在尝试调用该方法时会在该设备上崩溃。

当 class、方法或变量在 AOSP 中具有 @hide 标志时,SDK 编译器 Google 使用简单地从 class、方法或变量中删除它构建的 SDK JAR。这意味着 Android Studio 没有 "promise" 这些东西存在(据它所知,它们不存在),所以它不会构建。但是,这些方法仍然存在于设备上。这就是为什么在 Pie 之前,您只能使用反射来访问 Android.

的这些隐藏部分

Pie 引入了一个 "security" "feature" 来检查应用程序正在使用的方法、class 或变量是否被列入黑名单。如果是,当应用程序尝试访问时,如果应用程序不是系统应用程序,Android 将抛出 SecurityException。在您的应用程序和框架之间有一种看门人。

但是,AndroidX 不是 SDK。这是一个图书馆。库 编译到您的 APK 中,因为它们的组件在目标设备上尚不存在。我在 AndroidX 中看到一些方法用 @hide 注释,但我很确定这是一个错误。 Gradle 编译器,至少在默认情况下,不会删除任何带有 @hide 的内容,这没有意义,因为库 only 存在于内部你的APK。