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到一個單獨的目錄,您應該可以得到如下所示的內容:
文件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:
哇,我們得到了內部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。
步驟總結
- 選擇目標平臺X(我使用API Leve 9的平臺,所以X == 9)
- 創建平臺X的模擬器
- 啓動模擬器,從中下載/system/framework/framework.jar文件
- 重命名framework.jar爲framework.zip
- 從framework.zip解壓出classes.dex
- 使用dex2jar將classes.dex轉化爲classes.jar
- 重命名classes.jar爲framework-classes.zip
- 從ANDROID_SDK/platforms/android-X/複製android.jar,重命名爲custom-android.zip
- 解壓custom-android.zip到custom-android目錄
- 從framework-classes.zip複製所有文件到custom-android文件夾(替換已有文件)
- zip壓縮custom-android文件夾爲original-android.zip
- 重命名original-android.zip爲original-android.jar
完成。
結論
我們恢復了原始的android.jar,包含內部API和隱藏API的.class文件。這只是第一步,下一步是創建定製的平臺,使用未裁減版本的android.jar,然後加入到Android SDK platforms目錄。