使用內部(com.android.internal)和隱藏(@hide)API[第2部分,定製android.jar]

ZT:http://mogoweb.net/archives/92

本文翻譯自https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-2-hacking-around/

在前一篇文章中,我解釋了爲什麼不通過反射機制,不太容易使用com.android.internal包的內部API和標記爲@hide的隱藏API,這是由於android.jar文件沒有包含內部API和隱藏API的類,這樣在編譯時刻就沒有辦法引用這些類了。

本文將說明如何恢復原始的android.jar,這樣就可以使用內部API和隱藏API了,就如同使用公開API一樣。

如何獲得原始(未裁減)的android.jar?

我們需要修改android.jar,讓它包含所有原始的類文件(包括內部和隱藏API)。有兩種方法:

1)Android是一個開源項目。我們可以下載源代碼,定製構建系統,不從android.jar中移除內部和隱藏類。這種方法比較難。

2)每個模擬器或者真實設備都有一個與android.jar等價的包用於運行時。我們可以取得此jar,解出原始的.class文件,然後複製到android.jar。

我傾向於第二種方法,它比較容易,不需要linux機器(如果您是在windows下工作),也不需要編譯所有的源碼、定製構建系統,等等。

從設備獲取framework.jar

您可以用命令行(adb pull)或者DDMS(從eclipse,或者android sdk單獨啓動)從設備或者模擬器中下載文件。

(注:模擬器總是在.dex文件中包含代碼,而真實設備通常將代碼包含在優化版的dex-odex文件。使用odex文件通常比較難,所以本文推薦用模擬器)

運行時刻和Android SDK中android.jar等價的文件是framework.jar. 該文件位於/system/framework/framework.jar。

adb pull /system/framework/framework.jar

當framework.jar下載後,重命名爲framework.zip,然後unzip到一個單獨的目錄,您應該可以得到如下所示的內容:

image3 

文件classes.dex就是我們要的。

創建framework-classes.zip

首先我們需要將.dex文件轉化爲.jar文件格式。這可以用一個小工具dex2jar做到,您僅需要運行:

dex2jar classes.dex

當轉化完成後,會得到classes.dex.dex2jar.jar文件,將其命名爲framework-class.zip。使用zip文件查看器,進到framework-class.zip/com/android/internal:

image4

哇,我們得到了內部API和隱藏API的.class文件(雖然截圖只確認了內部API)。

創建original-android.jar

Android SDK中的android.jar位於ANDROID_SDK/platforms/android-X/android.jar(這裏X代表API Level,比如X==9)。

複製android.jar爲custom-android.zip。unzip到custom-android文件夾。從framework-class.zip中複製所有.class文件到custom-android文件夾(您需要替換所有已有的.class文件)。

然後zip文件夾custom-android爲original-android.zip,重命名爲original-android.jar。

步驟總結

  1. 選擇目標平臺X(我使用API Leve 9的平臺,所以X == 9)
  2. 創建平臺X的模擬器
  3. 啓動模擬器,從中下載/system/framework/framework.jar文件
  4. 重命名framework.jar爲framework.zip
  5. 從framework.zip解壓出classes.dex
  6. 使用dex2jar將classes.dex轉化爲classes.jar
  7. 重命名classes.jar爲framework-classes.zip
  8. ANDROID_SDK/platforms/android-X/複製android.jar,重命名爲custom-android.zip
  9. 解壓custom-android.zip到custom-android目錄
  10. 從framework-classes.zip複製所有文件到custom-android文件夾(替換已有文件)
  11. zip壓縮custom-android文件夾爲original-android.zip
  12. 重命名original-android.zip爲original-android.jar

完成。

結論

我們恢復了原始的android.jar,包含內部API和隱藏API的.class文件。這只是第一步,下一步是創建定製的平臺,使用未裁減版本的android.jar,然後加入到Android SDK platforms目錄。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章