android框架Java API接口总注释/**@hide*/和internal API
Posted Ronald Hu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android框架Java API接口总注释/**@hide*/和internal API相关的知识,希望对你有一定的参考价值。
android有两种类型的API是不能经由SDK访问的
l 第一种是位于com.android.internal包中的API我,位于frameworks/base/core/java/com/android/internal/。我将称之为internal API。
l 第二种API类型是一系列被标记为@hide属性的类和方法。从严格意义上来讲,这不是一个单一的API和类,而是一些的被隐藏的API和类,称之为hidden API
Internal和hidden API的区别
Hidden API之所以被隐藏,是想阻止开发者使用SDK中那些未完成或不稳定的部分(接口或架构)和框架中不开放给第三方a。举个例子,SmsApplication API和类名用@hide属性隐藏了。某些些API和类被验证和清理后,Google的开发者会移除@hide属性,并让其在API官方化,某些API只允许有手机OEM厂商的调用,为了安全考虑,可以放在系统源码中编译。很多地方在API 版本之间发生了变化。如果你的程序依赖某些隐藏的API,当其在其他android版本上,就有可能陷入困境。
对于internal API来说,从来都没有计划将其开放出来。它就是Android的“内部厨房”,对开发者来说,应该将其视作黑盒。凡事都会有变化的。如果你依赖某些internal API,也有可能在新的Android版本上,这些internal API发生变化,从而令你失望。
总结一下区别:
Hidden API = 进行中的工作;
Internal API = 黑盒;
Internal和hidden API的编译时 和 运行时
当你使用Android SDK进行开发的时候,你引用了一个非常重要的jar文件——android.jar。它位于Android SDK平台的文件夹中(SDK_DIR/platforms/platform-X/android.jar,其中,X表示API等级)。这个android.jar移掉了com.android.internal包中所有的类,也移掉了所有标记有@hide的类,枚举,字段和方法。
但当你在设备上启动应用程序时,它将加载framework.jar(简单来说,它和android.jar等同),而其未移掉internal API和hidden API。(但它对开发者来说,并不能友好地访问,因此,我将向大家展示不通过反射如何使用这些API)。
关于internal API,还有一件事需要说明。Eclipse的ADT插件增加了一个额外的规则,那就是禁止使用com.android.internal包中的任何东西。所以,即便是我们可以拿到最原始的android.jar(未删减版),也没有轻松的办法通过Eclipse使用这些internal API。
如果你是在android手机OEM厂商内部开发,公司在框架内部加的一些新的方法和类,但是并不显让外部的人给使用,就可以加@hide,当然也可以放在框架中internal目录,根据需求来
1. 在你添加的API或者变量前面,增加javadoc 注释@hide。但是要注意的是,并不是简单写个@hide 或者 /*@hide*/ 就可以了,这些都是错误的javadoc注释格式,标准的javadoc都是这样的 /** */ 而且对于 format 变量 应该加上 { }。所以我们应该这样写 /** {@hide} */
2. 你就是想要生成的javadoc里面出现这个方法或者变量,你必须输入:make update-api 但是如果修改的是google没有开放出来的类,比如RIL,PhoneFactory,就不会出现这个问题。
不通过反射使用internal和hidden API
在android源码中编译出来的framework.jar包其实就是完整的android.jar包,没有任何移除。源码编译后的路径如下:
out/target/product/msm8952_64/system/framework/framework.jar
但是该目录下的文件时经过dex优化的
用解压软件打开如下
要把.dex文件转换成.jar格式。你可以使用通用的工具dex2jar。只需要运行:
dev2jar dex后缀文件名
会生成jar文件
Android SDK的android.jar位于ANDROID_SDK/platforms/android-X/android.jar(X表示API等级)。
备份原先android.jar。解压原生android.jar文件夹android。将dev2jar生成的jar文件解压覆盖掉android.jar解压后的文件
然后,压缩android文件jar成android.zip。重命名为android.jar。
然后替换掉目标版本的ANDROID_SDK/platforms/android-X/android.jar包
当然android源码是开放的,你也可以去下载android源码编译,具体去百度和Google,也可以参照清华aosp去下载源码编译,编译后的结果,使用中间编译的未经dex优化的jar包,目录如下
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/class.jar
一般源码编译的jar包都在out/target/common/obj/JAVA_LIBRARIES/,给android编译框架去使用生成,手机中目录中对应的加热棒
把这个class.jar包替换掉android SDK中对应android.jar就可以了
以上是关于android框架Java API接口总注释/**@hide*/和internal API的主要内容,如果未能解决你的问题,请参考以下文章
高焕堂:Android的API设计(应用篇)--HAL框架API