这究竟是做什么的?
它控制您正在编译的android.jar 中的内容。
当您的build.gradle 文件中有compileSdkVersion 19 时,真正发生的是$ANDROID_SDK/platforms/android-19/android.jar 被添加到您的编译时类路径中。
该 JAR 是作为编译 Android 本身的一部分而创建的。分析 Android 框架类,并创建它们的副本。本副本:
JavaDocs 是根据这个源代码树构建的(这就是 JavaDocs 不显示隐藏方法的原因),并且框架 JAR 的 SDK 版本是根据这个源代码树编译的。
但是你可以使用反射来访问它们
这是因为,在 runtime,real 框架 JAR 位于您的运行时类路径中,从框架类的真实源代码编译而来。它包含所有标记为 @hide 并从编译时框架 JAR 中删除的内容。
我仍然可以调用一些@hide 方法(也许只是静态方法?),据我所知,应用程序编译并运行良好。我只是收到一个 lint 错误
正如 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 级别上使用这些方法是有风险的。
我不关心 API 被更改的可能性
您应该这样做,除非您只为您控制固件的一台设备构建,包括所有操作系统更新。而且,在这种情况下,您可能正在构建自己的固件,因此您可以从您的 Android 分支构建自己的 SDK 框架 JAR,在其中从您想要真正使用的东西中删除 @hide。
此外,如果有任何方法可以根据具体情况禁用 lint,这将是有帮助的。
根据我从您的屏幕截图和我的电脑中看到的情况,这是来自 IDE 的编译错误。您不能禁用编译错误。