Android——@hide和internal API
在使用eclipse编译android工程时,有时会碰到找不到引用的错误,但是在linux下又是能编译过的。这是因为eclipse编译通过SDK无法访问到com.android.internal包中的API,以及标记为@hide属性的类和方法。一般网上下载的android-sdk-linux安装好之后 会在android-sdk-linux/platforms/android-17/ (我
在使用eclipse编译android工程时,有时会碰到找不到引用的错误,但是在linux下又是能编译过的。
这是因为eclipse编译通过SDK无法访问到com.android.internal包中的API,以及标记为@hide属性的类和方法。
一般网上下载的android-sdk-linux安装好之后 会在android-sdk-linux/platforms/android-17/ (我的是api 17 android 4.2)下有一个android.jar
这个android.jar移掉了com.android.internal包中所有的类,也移掉了所有标记有@hide的类,枚举,字段和方法的。
比如 :
package android.content.pm;
/**
* See {@link PackageManager} for documentation on most of the APIs
* here.
*
* {@hide}
*/
public interface IPackageManager extends android.os.IInterface
这个作为 PackageManager的实现接口 其中有很多@hide方法 比如比较实用的静默安装API :
public void installPackage(android.net.Uri packageURI, android.content.pm.IPackageInstallObserver observer, int flags, java.lang.String installerPackageName)
同样 com.android.internal.content中的PackageHelper.java 也是无法调用的。
下面记录一下如何制作完整的 android.jar 的方法:
1:下载源码编译过的,在/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates中有javalib.jar 也就是 framework.jar
或者 通过 eclipse adb 连接真机获取 adb pull /system/framework/framework.jar
2:重命名framework.jar为framework.zip 解压获得 classes.dex。 使用 dex2jar 反编译 得到 classes_dex2jar.jar(反编译脚本 dex2jar.sh),classes_dex2jar.jar中有所有的@hide以及internal的class。
3:重命名然后解压sdk中的android.jar,将classes_dex2jar.jar中的.class 拷贝覆盖过去。然后再压缩成.zip ,重命名为android.jar。
此时的android.jar 完整!
eclipse安装的ADT会限制com.android.internal的使用,所以需要修改如下:
从eclipse中的plugins中拷贝出adt文件:com.android.ide.eclipse.adt_22.0.1.v201305230001--685705.jar(根据个人版本而定)
重命名××.zip 解压 找到com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.class文件。
使用编辑器打开 搜索到关键的 internal/** , 用 “com/android/internax/**” 替换“com/android/internal/**” 将internal改成internax 只要不是internal 就行,但是字母数不变。
改好之后,压缩,重命名回去。重启eclipse,
至此,eclipse上就没有限制了!
这样做,无法保证在下一次的Android更新时,这些API不被破坏,等于你的代码跳出了兼容圈。慎用~
更多推荐
所有评论(0)