xirihanlin 2011.06.03
原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-2-hacking-around/
在上一篇中,我解釋了為什麼我們不通過反射就會很難使用internal和hidden API。這是因為android.jar中就沒包含這些API,因此,沒人能夠在編譯時間引用這些類。
這篇文章將描述如何還原最初的android.jar。這將允許我們像使用公開的API那樣使用internal和hidden API。
如何得到原版android.jar?
我們需要修改android.jar,這樣它才能包含所有的*.class檔案(包括internal和hidden API類)。有兩種辦法:
1) Android是一個開源工程。我們可以下載源碼並搭建編譯環境,這樣它就不能移除那些internal和hidden的類了。這個辦法比較困難;
2) 每個模擬器或真機在運行時都會有一個等同android.jar的東西。我們可以從這裡拿到jar檔案,提取出原始的.class檔案,並拷貝到Android SDK的android.jar中。
我將採用方案2。它易於開始,還不需要搭建Linux環境及編譯環境等。
從裝置上擷取framework.jar
你可以使用命令列(adb pull)從模擬器或裝置上下載檔案,或者使用DDMS(藉助Eclipse或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並解壓到獨立的檔案夾中,看起來是這個樣子的:
classes.dex正是我們需要的。
建立framework-classes.zip
首先,我們需要把.dex檔案轉換成.jar格式。你可以使用通用的工具dex2jar。只需要運行:
dev2jar classes.dex
當轉換結束時,你應該得到了classes.dex.dex2jar.jar檔案。重新命名為framework-classes.zip。使用zip查看器,進入到framework-classes.zip/com/android/internal/:
恭喜你,你已經擁有了所有的.class檔案,包括internal和hidden API(儘管只確認了internal部分)。
建立original-android.jar
Android SDK的android.jar位於ANDROID_SDK/platforms/android-X/android.jar(X表示API等級)。
拷貝android.jar成custom-android.jar。解壓至custom-android檔案夾。將framework-classes.zip中所有的.class檔案拷貝到custom-android檔案夾中(你需要覆蓋所有已經存在的.class檔案)。
然後,壓縮custom-android檔案成original-android.zip。重新命名為original-android.jar。
步驟總結
1. 選擇你的目標平台X
2. 建立目標平台X的模擬器
3. 啟動模擬器,下載/system/framework/framework.jar
4. 重新命名framework.jar -> framework.zip
5. 從framework.zip中抽取classes.dex
6. 使用dex2jar工具,將其轉換成classes.jar
7. 重新命名classes.jar -> framework-classes.zip
8. 拷貝android.jar –> custom-android.zip
9. 解壓custom-android.zip至custom-android檔案夾
10. 將framework-classes.zip中所有檔案拷貝至custom-android檔案夾(覆蓋存在的檔案)
11. 壓縮custom-android檔案夾成original-android.zip
12. 重新命名original-android.zip -> original-android.jar
打完收功。
總結
我們還原了android.jar,使其包含所有的internal和hidden API的.class檔案。這隻是第一步。下一步將建立定製的android平台,使其使用未刪節版的android.jar,並將其添加到Android SDK platforms檔案夾中。