我们都知道并喜欢"Restrictions on non SDK interfaces"。该页面上有关于术语定义的说明:
通常来说,SDK接口是在Android框架Package Index中记录的接口。
此软件包索引左侧的软件包菜单的第一部分为“ Android平台”,然后为单独的部分“ Android支持库”。而且黑名单here在android.support
中没有任何符号。
因此,可以绝对确定非SDK接口策略仅适用于“ Android平台”中的类吗?而且设计不会包含Androidx吗?
答案 0 :(得分:1)
是的,
支持库可帮助开发人员在不牺牲功能的情况下瞄准更广泛的受众。 @hide
API在本机平台中存在,因为它们不应该被应用程序使用。支持库存在的唯一原因是由应用程序使用。
本地SDK是SDK。可以在framework.jar
中告诉Android Studio哪些类,方法和常量已经存在于Android中。实际上,您的APK都没有内置任何功能。可以将本机SDK(和任何SDK)视为对Android Studio的一种“承诺”,即您正在执行的操作在运行时便会真正起作用。 SDK还取决于设备上实际存在的内容。如果SDK包含该设备没有的方法,则Android Studio会编译,但尝试调用该方法时,该应用将在该设备上崩溃。
当某个类,方法或变量在AOSP中具有@hide
标志时,Google使用的SDK编译器只需从其构建的SDK JAR中删除该类,方法或变量。这意味着Android Studio没有“承诺”这些东西存在(据它所知,它们不存在),因此它不会构建。但是,这些方法仍然存在于设备上。这就是为什么直到Pie之前,您都可以使用反射来访问Android的这些隐藏部分的原因。
Pie引入了“安全性”“功能”,用于检查应用程序正在使用的方法,类或变量是否已列入黑名单。如果是,则当应用程序不是系统应用程序时,当应用程序尝试访问时,Android会引发SecurityException。您的应用程序与框架之间有某种关守。
但是,AndroidX不是SDK。这是一个图书馆。库 已编译到您的APK中,因为目标设备上不存在它们的组件。我已经在AndroidX中看到了一些用@hide
注释的方法,但是我很确定这是一个错误。至少在默认情况下,Gradle编译器不会使用@hide
删除任何内容,并且这没有任何意义,因为APK中仅存在 库。