2025-04-22

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

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *