java – Android的@hide注释究竟做了什么?

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

Another answer说它只隐藏了Javadoc的方法,但你可以使用反射来访问它们.

这没有任何意义 – 如果它们只是从Javadoc中隐藏,那么你肯定不需要反射来访问它们.事实上,我发现我没有.我仍然可以调用一些@hide方法(也许只是静态的方法?)并且应用程序编译并运行正常,据我所知.我只是得到一个lint错误:

Cannot resolve method

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

我不关心API被更改的可能性,所以我很高兴使用私有API,但有人可以解释这种行为吗?此外,如果有任何方法可以根据具体情况禁用lint,这将是有帮助的.

最佳答案

What exactly does this do?

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

当你在build.gradle文件中有compileSdkVersion 19时,真正发生的是$ANDROID_SDK / platforms / android-19 / android.jar被添加到你的编译时类路径中.

该JAR是作为编译Android本身的一部分创建的.分析Android框架类,并创建它们的副本.这份副本:

>删除标有@hide的所有类,方法,字段等
>具有所有剩余方法的存根实现(字面上抛出新的RuntimeException(“Stub!”),我最后一次看)
>保留JavaDoc注释以保留剩余的所有内容

JavaDocs是基于此源代码树构建的(这就是JavaDocs不显示隐藏方法的原因),并且框架JAR的SDK版本是从此源代码树编译而来的.

but that you can use reflection to access them

这是因为,在运行时,真正的框架JAR位于运行时类路径中,从框架类的真实源代码编译而来.它包含用@hide标记的所有内容,并从编译时框架JAR中删除.

I can still call some @hide methods (maybe just static ones?) and the app compiles and runs fine as far as I can tell. I just get a lint error

正如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级别或更高级别.在将API级别正式添加到SDK之前使用这些方法是有风险的.

I don’t care about the possibility of the API being changed

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

Also if there’s any way to disable the lint on a case-by-case basis that would be helpful.

基于我从截图和我的PC中看到的内容,这是来自IDE的编译错误.您无法禁用编译错误.

转载注明原文:java – Android的@hide注释究竟做了什么? - 代码日志