使用內部(com.android.internal)和隱藏(@hide)API手記

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://vaero.blog.51cto.com/4350852/861758

使用內部(com.android.internal)和隱藏(@hide)API手記

 
內部API和隱藏API的不同
  隱藏API隱藏是爲了防止開發人員使用SDK中未完成或者未穩定(接口和架構方面看)的部分。比如,Bluetooth API在API Level 5(android 2.0)之前就存在,但在API Level 3和4(android 1.5和1.6)中使用@hide隱藏起來了。當該API穩定下來,google的開發人員移除@hide屬性,在API Level 5中就有Bluetooth API了。還有很多東西在Level 4和5之間發生了變化。如果程序依賴於某些隱藏API,可能會在新版本的Android OS上運行出現問題。
  而內部API則不計劃對外開放。這是android的內部餐廳,開發人員可以視爲黑盒子。這裏面的東西同樣可能發生改變。同樣的,如果您的程序依賴於內部API,在新的Android發佈後,可能遇到麻煩。
 
  下面總結它們之間的不同:隱藏API = 正在開發中;內部API = 黑盒
 
1)配置SDK路徑
1.1)Ubuntu:
Ctrl+Alt+T打開終端
gedit ~/.bashrc
export SDK_HOME=<SDK路徑>
export PATH=$PATH:$SDK_HOME/platform-tools:$SDK_HOME/tools
source ~/.bashrc
 
1.2)Windows:
我的電腦->右鍵屬性->高級->環境變量
選擇系統變量新建:SDK_HOME=<SDK路徑>
選擇系統變量Path編輯:%SDK_HOME%\platform-tools;%SDK_HOME%\tools;<原Path>
 
  不一定要配置,只是爲了方便啓動某些工具==
 
  以下是在Windows XP下操作的~
 
2)AVD Manager創建模擬器並啓動
  以下以2.3.3平臺爲例了~
 
3)從模擬器獲取framework.jar
  每個模擬器或者真實設備都有一個與android.jar等價的包用於運行時。我們可以取得此jar,解出原始的.class文件,然後複製到android.jar。
 
adb pull /system/framework/framework.jar C:\
 
4)解壓framework.jar獲取classes.dex
5)dex2jar反編譯得到原classes
  classes.dex放到<dex2jar目錄>內或指定絕對路徑,例如爲C:\classes.dex時:
 
進入<dex2jar目錄>
dex2jar C:\classes.dex
 
  得到classes_dex2jar.jar。
 
6)創建SDK定製平臺
  進入<SDK路徑>\platforms,複製一份對應平臺。2.3.3爲API-10,所以如下:
 
複製android-10,重命名爲android-10-internals。並如下修改:
1. 把上述classes_dex2jar.jar移動至android-10-internals目錄
2. 解壓android.jar&classes_dex2jar.jar進各自目錄
3. 複製classes_dex2jar.jar解壓內容全部替換android.jar解壓內容
4. 重新壓縮android.jar解壓內容至zip,刪除冗餘東西,重命名回android.jar
5. 修改build.prop文件,具體如下:
ro.build.version.sdk=10 –> ro.build.version.sdk=-10
6. 修改source.properties文件,具體如下:
Platform.Version=2.3.3 –> Platform.Version=2.3.3.extended
 
  此時重啓Eclispe,即可看到我們定製的擴展SDK平臺了,此時其實使用隱藏API已經足夠了。
 
  注意:重新壓縮成的android.jar,看一下目錄結構,不要把外層目錄也加進去了。
 
7)定製ADT,去除ForBidden
  到目前爲止,ADT仍然禁止使用com.android.internals包中的類。
  右鍵任一Android工程->Properties->左側Java Build Path->右側Libraries標籤->Android XXX->android.jar->Access rules->Forbidden: com/android/internal/**
 
  越過該限制規則,最簡單的方式是修改ADT字節碼。只需替換"com/android/internal/**”字符串爲其它的字符串,比如"com/android/internax/**”。
 
1. 關閉Eclipse
2. 在<Eclipse目錄>\plugins目錄,按名稱排下序,按c,找到com.android.ide.eclipse.adt_*.jar
3. 複製到外部,解壓修改再打包回去,修改如下:
  找出com\android\ide\eclipse\adt\internal\project\AndroidClasspathContainerInitializer.class文件
  記事本打開文件,查找com/android/internal/**,替換爲com/android/internal/**爲com/android/internax/**。
4. 回到plugins目錄,重命名原先的添加_bak,備份下,把新jar放入。
5. 打開Eclipse,再檢查下^^
 
  報錯:parseSdkContent failed
com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer : Unsupported major.minor version 8241.8224
 
  不能以記事本打開,ASNI?字節碼變掉了應該==
 
  用一些Editor以16進制方式打開搜索**,即2A 2A。把l->x,即6C->78。重弄遍,ok^^。備份是好習慣啊!
 
8)後記
  本文源於如下網址:http://mogoweb.net/?s=%40hide;共有四部分,明細地址如下:
  第1部分,介紹:http://mogoweb.net/archives/87
  第2部分,定製android.jar:http://mogoweb.net/archives/92
  第3部分,定製android平臺:http://mogoweb.net/archives/104
  第4部分,定製ADT:http://mogoweb.net/archives/117
 
  當然,也有其他使用隱藏API的方式,不過覺着這個方式更優秀^^。
 
  還有,AndroidManifest.xml內會是<uses-sdk android:minSdkVersion="-10" />。
 
  補充:發現4.0模擬器內的framework.jar分出了個odex了==。
  以下是反編譯好的兩個framework.jar(classes):
  1)4.0.1(模擬器導出):framework_4.0.1.jar
  2)4.0.3(源碼編譯得):framework_4.0.3.jar
  具體如何操作,參見《Android混淆、反編譯以及反破解的簡單回顧》最後的補充^^。

本文出自 “-_--___---_-” 博客,出處http://vaero.blog.51cto.com/4350852/861758,感謝作者。

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