使用內部(com.android.internal)和隱藏(@hide)API[第2部分,定製android.jar]

來源:互聯網
上載者:User

標籤: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。

步驟總結
  1. 選擇目標平台X(我使用API Leve 9的平台,所以X == 9)
  2. 建立平台X的模擬器
  3. 啟動模擬器,從中下載/system/framework/framework.jar檔案
  4. 重新命名framework.jar為framework.zip
  5. 從framework.zip解壓出classes.dex
  6. 使用dex2jar將classes.dex轉化為classes.jar
  7. 重新命名classes.jar為framework-classes.zip
  8. ANDROID_SDK/platforms/android-X/複製android.jar,重新命名為custom-android.zip
  9. 解壓custom-android.zip到custom-android目錄
  10. 從framework-classes.zip複製所有檔案到custom-android檔案夾(替換已有檔案)
  11. zip壓縮custom-android檔案夾為original-android.zip
  12. 重新命名original-android.zip為original-android.jar

完成。

結論

我們恢複了原始的android.jar,包含內部API和隱藏API的.class檔案。這隻是第一步,下一步是建立定製的平台,使用未裁減版本的android.jar,然後加入到Android SDK platforms目錄。

 

原文:http://mogoweb.net/archives/92

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.