在使用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不被破坏,等于你的代码跳出了兼容圈。慎用~




Logo

更多推荐