在使用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不被破壞,等於你的代碼跳出瞭兼容圈。慎用~