Android 中的许多内部 API 都标记为 @hide
。 究竟这是做什么的?
Another answer说它只对 Javadoc 隐藏方法,但您可以使用反射来访问它们。
但这没有任何意义 - 如果它们只是对 Javadoc 隐藏,那么您肯定不需要反射来访问它们。事实上,我发现我没有。我仍然可以调用一些 @hide
方法(也许只是静态方法?),据我所知,应用程序可以正常编译和运行。我只是收到一个 lint 错误:
请注意,上面的代码仍然可以正常编译。
我不关心 API 被更改的可能性,所以我很高兴使用私有(private) API,但是有人可以解释这种行为吗?此外,如果有任何方法可以根据具体情况禁用 lint,那将很有帮助。
最佳答案
What exactly does this do?
它控制您正在编译的 android.jar
中的内容。
当你的 build.gradle
文件中有 compileSdkVersion 19
时,真正发生的是 $ANDROID_SDK/platforms/android-19/android.jar
被添加到您的编译时类路径中。
该 JAR 是作为编译 Android 本身的一部分创建的。分析了 Android 框架类,并创建了它们的副本。此副本:
去掉所有用
标记的类、方法、字段等@hide
具有所有剩余方法的 stub 实现(字面意思是
throw new 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 级别或更高级别。在将这些方法正式添加到 SDK 之前,在 API 级别使用这些方法是有风险的。
I don't care about the possibility of the API being changed
你应该,除非你只为你控制固件的一台设备构建,包括所有操作系统更新。而且,在那种情况下,您可能正在构建自己的固件,因此您可以从您的 Android 分支构建您自己的 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 注解到底有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31908205/