我们都知道并喜爱 "Restrictions on non SDK interfaces" 。该页面关于该术语的定义是这样说的:
Generally speaking, SDK interfaces are those ones found documented in the Android framework Package Index.
此包索引左侧的包菜单有一个标题为“Android Platform”的第一部分,然后是一个名为“Android 支持库”的单独部分。以及黑名单here android.support
中没有任何符号。
那么,非SDK接口(interface)政策是否绝对确定仅适用于“Android平台”中的类?并且在设计上永远不会包含 Androidx?
最佳答案
嗯,是的。
支持库可以帮助开发人员在不牺牲功能的情况下瞄准更广泛的受众。 @hide
API 存在于 native 平台中,因为它们不应该被应用程序使用。支持库存在的唯一原因是供应用程序使用。
原生SDK是一个SDK。它告诉 Android Studio 哪些类、方法和常量已经存在于 Android 中的 framework.jar
中。它们实际上都没有内置到您的 APK 中。将 native SDK(以及任何 SDK)视为对 Android Studio 的一种“ promise ”,即您所做的事情在运行时将真正起作用。 SDK 还取决于设备上实际存在的内容。如果 SDK 具有设备没有的方法,Android Studio 将进行编译,但应用在尝试调用该方法时将在该设备上崩溃。
当类、方法或变量在 AOSP 中具有 @hide
标志时,Google 使用的 SDK 编译器会简单地从其构建的 SDK JAR 中删除该类、方法或变量。这意味着 Android Studio 没有“ promise ”这些东西存在(据它所知,它们不存在),因此它不会构建。然而,这些方法仍然存在于设备上。这就是为什么在 Pie 之前,您只能使用反射来访问 Android 的这些隐藏部分。
Pie 引入了一项“安全”“功能”,用于检查应用程序正在使用的方法、类或变量是否被列入黑名单。如果是,当应用程序尝试访问时,如果该应用程序不是系统应用程序,Android 会抛出 SecurityException。您的应用程序和框架之间有一种看门人。
但是,AndroidX 不是 SDK。这是一个图书馆。库被编译到您的 APK 中,因为目标设备上尚不存在它们的组件。我在 AndroidX 中看到了一些用 @hide
注释的方法,但我很确定这是一个错误。 Gradle 编译器至少在默认情况下不会删除带有 @hide
的任何内容,而且这样做没有任何意义,因为该库仅存在于您的 APK 中。
关于Android P 非 SDK 接口(interface)限制适用于 android.support 和/或 androidx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53136739/