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" 的单独部分。而黑名单here在android.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。
我们都知道并热爱 "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" 的单独部分。而黑名单here在android.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。