Tim*_*mmm 10 java android lint hide
Android中的许多内部API都已标记@hide.这到底是做什么的?
另一个答案是它只隐藏了Javadoc的方法,但你可以使用反射来访问它们.
这没有任何意义 - 如果它们只是从Javadoc隐藏,那么你肯定不需要反射来访问它们.事实上,我发现我没有.我仍然可以调用一些@hide方法(也许只是静态方法?),应用程序编译并运行正常,据我所知.我只是得到一个lint错误:
请注意,上面的代码仍然编译好.
我不关心API被更改的可能性,所以我很高兴使用私有API,但有人可以解释这种行为吗?此外,如果有任何方法可以根据具体情况禁用lint,这将是有帮助的.
Com*_*are 20
这到底是做什么的?
它控制着android.jar你正在编译的内容.
例如,当您compileSdkVersion 19在build.gradle文件中时,实际发生的事情是$ANDROID_SDK/platforms/android-19/android.jar添加到编译时类路径中.
该JAR是作为编译Android本身的一部分创建的.分析Android框架类,并创建它们的副本.这份副本:
删除标记为的所有类,方法,字段等 @hide
有剩余所有方法的存根实现(字面意思throw new RuntimeException("Stub!"),我最后一次看)
保留JavaDoc注释以保留剩余的所有内容
JavaDocs是基于此源代码树构建的(这就是JavaDocs不显示隐藏方法的原因),并且框架JAR的SDK版本是从此源代码树编译而来的.
但是你可以用反射来访问它们
这是因为,在运行时,真正的框架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
Run Code Online (Sandbox Code Playgroud)
现在,您可以针对以前标记过的方法进行编译@hide,因为它们在以后的Android SDK中未被隐藏,并且您compileSdkVersion处于该API级别或更高级别.在将API级别正式添加到SDK之前使用这些方法是有风险的.
我不关心API被更改的可能性
您应该,除非您只为一个控制固件的设备构建,包括所有操作系统更新.而且,在这种情况下,您可能正在构建自己的固件,因此您可以从Android fork构建自己的SDK框架JAR,从中删除@hide您想要真正使用的东西.
此外,如果有任何方法可以根据具体情况禁用lint,这将是有帮助的.
根据我从截图和我的PC中看到的内容,这是来自IDE的编译错误.您无法禁用编译错误.
不知何故,Google 使用@hide注释从编译的 android 框架 jar 中删除他们不希望成为公共 SDK 一部分的类和方法,您下载并使用这些类和方法来编译代码。(我不知道它是如何工作的细节,所以不要问。)这就是为什么你的 IDE 无法针对它们编译你的代码——它们实际上不存在。然而,实际设备上的 android 框架 jar 确实包含这些类和方法,这就是为什么可以在运行时使用反射来访问它们。
您在帖子中显示的不是 lint 错误,而是编译错误。它无法解析该方法,这意味着它认为这不是有效的方法调用。
| 归档时间: |
|
| 查看次数: |
4604 次 |
| 最近记录: |