java - Android 的@hide 注解到底有什么作用?

标签 java android hide lint

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

Another answer说它只对 Javadoc 隐藏方法,但您可以使用反射来访问它们。

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

Cannot resolve method

请注意,上面的代码仍然可以正常编译。

我不关心 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/

相关文章:

java - DTO、DAO 或服务层?

java - 解决Java中的 "loader constraints violated when linking [...] class"错误

java - 尝试在 Java 中简单地实现 MD5 散列

java - 使用 onkeydown 方法或覆盖 onbackbuttonpressed 时,Android 后退按钮会卡住

c++ - 如何在 Mac OS(gcc 编译器)中隐藏控制台窗口?

java - 是否可以使用字符串作为计算?

android - 如何在android中将webview滚动默认设置为底部

c# - 如何在 Wpf-app 中使用 9-patch 图像

javascript - 搜索框中没有查询时自动隐藏行

javascript - 将 Jquery 函数转换为纯 Javascript