Android的@hide注解究竟干什么?

Android中的许多内部API都标记为@hide 。 这到底是什么?

另一个答案是,它只隐藏Javadoc的方法,但是你可以使用reflection来访问它们。

这是没有意义的,但是 – 如果他们只从Javadoc隐藏,那么你肯定不需要reflection来访问它们。 事实上,我发现我没有。 我仍然可以调用一些@hide方法(也许只是静态方法?),应用程序编译并运行良好,据我所知。 我只是得到一个皮棉错误:

无法解析方法

请注意,上面的代码仍然编译好。

我不关心API被更改的可能性,所以我很高兴使用私有API,但是有人可以解释这种行为吗? 此外,如果有任何方法可以在个案的基础上禁用皮棉,这将是有益的。

Solutions Collecting From Web of "Android的@hide注解究竟干什么?"

这到底是什么?

它控制你正在编译的android.jar中的内容。

当你在你的build.gradle文件中compileSdkVersion 19时,真正发生的事情是将$ANDROID_SDK/platforms/android-19/android.jar添加到你的编译时类path中。

该JAR是作为编译Android本身的一部分而创build的。 Android框架类被分析,并创build它们的副本。 本副本:

  • @hide标有@hide所有类,方法,字段等

  • 有剩下的所有方法的存根(实际上是throw new RuntimeException("Stub!") ,我上次看)

  • 保留JavaDoc留下的所有内容

JavaDocs是由这个源代码树构build的(这就是为什么JavaDocs不显示隐藏的方法),框架JAR的SDK版本是从这个源代码树编译而来的。

但是你可以使用reflection来访问它们

这是因为,在运行时真正的框架JAR在您的运行时类path中,从框架类的真实源代码中编译。 它包含用@hide标记的所有内容,并从编译时框架JAR中剥离出来。

我仍然可以调用一些@hide方法(也许只是静态方法?),应用程序编译并运行良好,据我所知。 我只是得到一个皮棉错误

正如Karakuri指出的那样,这对我来说看起来像是一个编译错误。 如果我在compileSdkVersion 22项目中尝试你的代码,我得到一个编译错误。 当我去运行它,我得到:

 /tmp/MyApplication/app/src/main/java/com/commonsware/myapplication/MainActivity.java Error:(16, 23) error: cannot find symbol method isEmailAddress(String) Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > Compilation failed; see the compiler error output for details. Information:BUILD FAILED 

现在,您可以针对之前@hide标记的方法进行编译,因为它们在以后的Android SDK中未被隐藏,而且您的compileSdkVersion处于该API级别或更高级别。 在SDK正式添加到SDK之前,在API级别使用这些方法是有风险的。

我不关心API被改变的可能性

除非您仅为一个控制固件的设备构build应用程序,包括所有操作系统更新。 而且,在这种情况下,您可能正在构build自己的固件,因此您可以从Android分叉中构build自己的SDK框架JAR,在其中从您想要使用的东西中删除@hide

此外,如果有任何方法可以在个案的基础上禁用皮棉,这将是有益的。

根据我从屏幕截图和我的电脑中看到的情况,这是IDE的编译错误。 您不能禁用编译错误。

不知何故,Google使用@hide注释@hide了他们不想成为公共SDK的一部分的类和方法,从他编译的android框架jar中下载并用来编译你的代码。 (我不知道如何工作的细节,所以不要问。)这就是为什么你的IDE不能编译你的代码,他们实际上不存在。 然而,实际设备上的android框架jar会包含这些类和方法,这就是为什么它们可以在运行时使用reflection来访问。

你在post中显示的内容不是lint错误,这是一个编译错误。 它不能解决该方法,这意味着它认为这不是一个有效的方法调用。