標籤:android class int width http c
本文翻譯自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目錄。
原文:http://mogoweb.net/archives/92