首页 > 代码库 > android框架Java API接口总注释/**@hide*/和internal API

android框架Java API接口总注释/**@hide*/和internal API

Android有两种类型的API是不能经由SDK访问的

第一种是位于com.android.internal包中的API我,位于frameworks/base/core/java/com/android/internal/。我将称之为internal API

第二种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 = 黑盒;

Internalhidden 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 APIhidden API。(但它对开发者来说,并不能友好地访问,因此,我将向大家展示不通过反射如何使用这些API)。

 

关于internal API,还有一件事需要说明。EclipseADT插件增加了一个额外的规则,那就是禁止使用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没有开放出来的类,比如RILPhoneFactory,就不会出现这个问题。

不通过反射使用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 SDKandroid.jar位于ANDROID_SDK/platforms/android-X/android.jarX表示API等级)。

 

备份原先android.jar。解压原生android.jar文件夹android。将dev2jar生成的jar文件解压覆盖掉android.jar解压后的文件

然后,压缩android文件jarandroid.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