Android P 非 SDK 接口(interface)限制适用于 android.support 和/或 androidx

标签 android android-9.0-pie

我们都知道并喜爱 "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/

相关文章:

android - 如何在 Android 中保护我的加密 key ?

android - 具有网络约束的 WorkManager 未在 android 9 模拟器上运行

Android 9 上的 android.database.sqlite.SQLiteCantOpenDatabaseException

java - 关于整数值

android - Robolectric 在命令行上失败,但在 Android Studio 中成功

java - Android P,下载没有开始使用下载管理器?

android - ClassNotFoundException:在 Android 9 上找不到类 SchemeRegistry

android - WebView 本地文件在 Android 9.0 中不加载页面?

编译时的 Android Studio Gradle 错误

java - 如何在Android上通过蓝牙发送字节数组?