在上一篇中,我解釋了為什么我們不通過(guò)反射就會(huì )很難使用internal和hidden API。這是因為android.jar中就沒(méi)包含這些API,因此,沒(méi)人能夠在編譯時(shí)引用這些類(lèi)。
這篇文章將描述如何還原最初的android.jar。這將允許我們像使用公開(kāi)的API那樣使用internal和hidden API。
如何得到原版android.jar?
我們需要修改android.jar,這樣它才能包含所有的*.class文件(包括internal和hidden API類(lèi))。有兩種辦法:
1) Android是一個(gè)開(kāi)源工程。我們可以下載源碼并搭建編譯環(huán)境,這樣它就不能移除那些internal和hidden的類(lèi)了。這個(gè)辦法比較困難;
2) 每個(gè)模擬器或真機在運行時(shí)都會(huì )有一個(gè)等同android.jar的東西。我們可以從這里拿到j(luò )ar文件,提取出原始的.class文件,并拷貝到Android SDK的android.jar中。
我將采用方案2。它易于開(kāi)始,還不需要搭建Linux環(huán)境及編譯環(huán)境等。
從設備上獲取framework.jar
你可以使用命令行(adb pull)從模擬器或設備上下載文件,或者使用DDMS(借助Eclipse或SDK中的應用)。
注意:模擬器通常在.dex文件中包含代碼,而真機一般在優(yōu)化版的dex文件中包含代碼——odex文件。操作odex文件比較困難,這也是為什么我選擇模擬器的原因。
與Android SDK中的android.jar等同的文件是framework.jar。這個(gè)文件位于設備的:/system/framework/framework.jar
adb pull /system/framework/framework.jar
當framework.jar從設備上下下來(lái)之后,重命名為framework.zip并解壓到獨立的文件夾中,看起來(lái)是這個(gè)樣子的:
classes.dex正是我們需要的。
創(chuàng )建framework-classes.zip
首先,我們需要把.dex文件轉換成.jar格式。你可以使用通用的工具dex2jar。只需要運行:
dex2jar classes.dex
當轉換結束時(shí),你應該得到了classes.dex.dex2jar.jar文件。重命名為framework-classes.zip。使用zip查看器,進(jìn)入到framework-classes.zip/com/android/internal/:
恭喜你,你已經(jīng)擁有了所有的.class文件,包括internal和hidden API(盡管截圖只確認了internal部分)。
創(chuàng )建original-android.jar
Android SDK的android.jar位于A(yíng)NDROID_SDK/platforms/android-X/android.jar(X表示API等級)。
拷 貝android.jar成custom-android.jar。解壓至custom-android文件夾。將framework- classes.zip中所有的.class文件拷貝到custom-android文件夾中(你需要覆蓋所有已經(jīng)存在的.class文件)。
然后,壓縮custom-android文件成original-android.zip。重命名為original-android.jar。
步驟總結
1. 選擇你的目標平臺X
2. 創(chuàng )建目標平臺X的模擬器
3. 啟動(dòng)模擬器,下載/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文件。這只是第一步。下一步將創(chuàng )建定制的android平臺,使其使用未刪節版的android.jar,并將其添加到 Android SDK platforms文件夾中。
原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-2-hacking-around/



