Android 源碼分析工具

來源:互聯網
上載者:User

標籤:

標 題: 【原創】Android源碼分析工具及方法
作 者: MindMac
時 間: 2014-01-02,09:32:35
鏈 接: http://bbs.pediy.com/showthread.php?t=183278

在對 Android 源碼進行分析時,如果有得力的工具輔助,會達到事半功倍的效果。本文
介紹了一些在分析 Android 源碼時使用的一些工具和方法,希望能夠協助到有需要的同學。

Eclipse

在 Android 應用程式開發過程中,一般會使用 Eclipse,當然 Google 在 2013 年也推出了
針對 Android 開發的 IDE 工具 Android Studio。藉助於 Eclipse 可以更好的分析 Android 源碼,
關於 Android 源碼的下載和編譯在此省略,網上有很多相關的教程,當然最好是參考 Google
官方的文檔了,http://source.android.com/source/downloading.html 提供了從源碼下載到編譯運
行的所有步驟。在編譯完 Android 源碼後,可以將源碼匯入到 Eclipse 中方便後續的分析,具
體步驟如下(可參考《深入理解 Android 卷 II》P7-P8):
 

  • 將 Android 源碼目錄下/development/ide/eclipse/.classpath 複製到 Android 源碼根目錄;
    /development/ide 目錄下除了 eclipse 檔案夾以外,還有 intellij,emacs 和 xcode 檔案夾,
    這些檔案夾下提供了相應 IDE 的設定檔;

  • /development/ide/eclipse/.classpath 檔案供 Eclipse 使用,檔案內容是源碼目錄中各個模組
    的路徑,基本內容 1 所示。可以根據自己分析的需要來修改.classpath 的內容,例
    如如果只需要分析 Framework 相關的模組,可以把一些不屬於 Framework 的源碼目錄路
    徑從該檔案中注釋或者刪除掉;


圖 1.classpath 檔案基本內容

  • 在 Eclipse 中單擊 File -> New -> Java Project,在彈出的視窗中填寫 Project Name 並去除
    Use default location 的勾選,將 Location 選擇為 Android 源碼的根目錄, 2 所示。完
    成後點擊 Finish 按鈕,由於 Android 源碼檔案較多,匯入處理程序可能會持續較長一段時間(視
    機器效能而定)。


圖 2 在 Eclipse 中匯入 Android 源碼

需要注意的幾點:

  • 在.classpath 檔案中會有一些指向/out/target/...的路徑,而 out 目錄是在對 Android
    源碼進行編譯後產生的,所以在將 Android 源碼匯入到 Eclipse 之前需要完成對
    Android 源碼的編譯;

  • 匯入源碼前請取消 Eclipse 的自動編譯選項(Android 源碼檔案很多,編譯一遍比較耗
    時),去除功能表列 Project 下的 Build Project Automatically 的勾選即可。


完成 Android 源碼的匯入後,就可以藉助 Eclipse 進行源碼的分析。一般我在分析 A
ndroid 源碼時,主要藉助 Eclipse 的自動定位功能。以分析 ActivityManagerService 為例,
該服務由 system_server 線程建立,在 SystemServer.java(/frameworks/base/services/java/c
om/android/server/SystemServer.java)的 main 函數入口處調用了 System.currentTimeMillis()
函數,那麼如果希望分析該函數的具體實現過程,則可以按住 Ctrl 鍵,將滑鼠移動到調
用的 currentTimeMillis 函數處,單擊滑鼠左鍵,則可以自動定位到 System.currentTimeMi
llis 函數的原始碼處(可能根據快速鍵的設定不同,自動定位的方法有所不同)。有了自動
定位功能,就不需要自己來搜尋尋找源檔案了。

Android SDK Search

在 Android 開發或者源碼分析時,一般會去查看 Google 官方提供的 Android API,如果希
望深入瞭解 API 實現的細節,當然最好的方法就是去看原始碼了。對於線上 API 文檔,如果
在查看時,還能夠查看到原始碼那當然是最好不過的。在 Chrome 瀏覽器下,可以安裝 Android
SDK Search 擴充程式來達到這個目的,該擴充程式在 Chrome 網上應用店如下所示。安
裝完該擴充程式後,再次搜尋 Android API 後,會在相應的搜尋結果後增加一個 view source
連結。例如搜尋 Activity 類,結果 4 所示。點擊 view source 連結,就可以開啟 Activity
類的原始碼, 5 所示,從網頁中可以看出其實是連結到了 Google 的 Android 源碼的 Git 

圖 3 Android SDK Search


圖 4 添加 Android SDK Search 擴充程式後的效果


圖 5 View Source 開啟的 Activity 源碼

庫。當然這種在瀏覽器下分析原始碼是有諸多不便的,遠沒有在 Eclipse 等 IDE 下來的方便。
不過我們可以根據網頁上給出的路徑在本地源碼中快速地定位到目標代碼,將圖 5 中兩個
紅框的路徑拼接後得到的/frameworks/base/core/java/android/app/Activity.java 就是本地源碼
對應的路徑,這樣就可以使用 Eclipse 等 IDE 來分析源碼。
對於上述情況,也可以直接在 Eclipse 中關聯 Android 原始碼(主要是 Framework 的源碼)。
例如對於在一個 Android 工程中,希望查看 Activity 源碼,如下代碼所示:

代碼:

1. public class MainActivity extends Activity { 2. @Override3. protected void onCreate(Bundle savedInstanceState) {4. super.onCreate(savedInstanceState);5. setContentView(R.layout.activity_main);6. ......7.   }8. }

可以使用 Eclipse 提供的快速定位功能來查看 Activity 類的源碼,但是點擊後會顯示 Source not
found, 6 所示。對於 Android4.0 以後的版本,在下載 SDK 時,可以同時選擇下載源碼,
 7,下載完成後在 Android SDK 目錄下會有 sources 目錄,其下存在相應版本的 Android
源碼,如 android-17 等。點擊 Attach Source,在出現的對話方塊中,選擇 External location,點
擊 External Folder,選擇下載完的源碼目錄,如.../sources/android-17, 8 所示,點擊 OK
就可以看到 Activity 類的源碼資訊了。

圖 6 Source Not Found Error


圖 7 下載 Android 對應的源碼


圖 8 Eclipse 關聯 Android 源碼

由於只有 Android 4.0 以後的版本存在相應的 source 目錄,所以對於 Android4.0 之前的
版本是無法通過下載 SDK 的方式來獲得源碼的,當然網上也存在一些 4.0 之前的 source 壓
縮包可以使用。另一種更方便的方法是安裝 Android Sources 的 Eclipse 外掛程式(https://code.goo
gle.com/p/adt-addons/),在 Eclipse 中可以 Install New Software,添加的 Location 地址為 http:
//adt-addons.googlecode.com/svn/trunk/source/com.android.ide.eclipse.source.update/。由於外掛程式
較大,大約 240M 左右,可能下載安裝時間較長。安裝完成後對於大部分 Android 版本都可
以查看源碼了。Android Sources 現在支援的版本如下:

  • 14 - Android 4.0.1

  • 10 - Android 2.3.4

  • 9 - Android 2.3

  • 8 - Android 2.2

  • 7 - Android 2.1

  • 6 - Android 2.0.1

  • 4 - Android 1.6

  • 3 - Android 1.5


AndroidXRef

藉助 Eclipse 以及本地源碼可以比較方便地分析 Android 源碼,但是對於 Native 代碼的調
用就無法通過 Eclipse 的快速定位來查看相應的 Native 源碼了,而且 Android 源碼中對 Native
庫的載入一般不是通過在 Static 塊裡調用 System.loadLibrary 來載入庫檔案並完成 Native 函數
註冊的,所以定位這類代碼比較困難。一個可以採取的方法是使用 UltraEdit 等工具來在檔案
中搜尋特定的字串,如函數名,對於 JNI 函數來說,一般存在於/frameworks/base/core/jni
目錄下。在檔案數目較多的情況下,使用這種方法搜尋起來還是比較忙的,所以這裡介紹下
AndroidXRef。
AndroidXRef(http://androidxref.com/)項目提供 Android 源碼的交叉索引,可以快速的搜尋
符合特定條件的 Android 原始碼,後台是基於 OpenGrok 引擎,OpenGrok 主要用來在源碼中搜
索、交叉索引以及進行導航。AndroidXRef 提供了完整的 Android 源碼的索引,包括核心源碼。
在 AndroidXRef 首頁的右側顯示了可用的源碼版本, 9 所示,點擊相應的源碼版本連結
就可以進入對應的源碼分支, 10 所示。 


圖 9 AndroidXRef 首頁


圖 10 AndroidXRef KitKat4.4-r1 分支

圖 10 右側提供在特定目錄下搜尋,例如在分析 Framework 時,可以選擇 frameworks 目
錄,這樣可以減少搜尋範圍,能夠更加精確地定位到需要的原始碼。左側則是提供了一些搜
索的條件,其意義如下(在指定的 Project(s)下):

  • Full Search: 進行全文檢索搜尋,會匹配所有的單詞、字串、標識符以及數字等,例如在
    frameworks 下通過 Full Search 搜尋”activity”,則會顯示所有包含 activity 字元(忽略大小寫)
    的結果,即使是注釋也會顯示出來, 11 所示。點擊綠色背景的連結會開啟包含
    activity 字串檔案所在的檔案夾;點擊左側檔案名稱如 WidgetAdder.java 連結會開啟包含
    activity 字串檔案;點擊右側每一行的搜尋結果連結同樣會開啟相應的檔案內容;


圖 11 Full Search 搜尋

  • Definition:搜尋符號定義相關的代碼,例如搜尋 startActivityIfNeeded 函數的定義,顯示
    結果 12 所示,從搜尋結果可以看到,右側綠色字型表明了是位於 Activity 類中的 
    方法;


圖 12 Definition 搜尋

  1. Symbol:搜尋符號,例如可以搜尋類中的成員變數等,圖 13 顯示了通過 Symbol 搜尋
    WINDOW_HIERARCHY_TAG 的結果;


圖 13 Symbol 搜尋

  • File Path:搜尋源碼檔案名稱中包含給定字串的檔案,例如想要搜尋檔案名稱包含 Activity
    的源碼檔案,則可以在 File Path 中填入 Activity 進行搜尋,結果如所示;


圖 14 File Path 搜尋

  • History:在 Git 庫中的 history log comments 中搜尋給定的字串,這個用處應該不是特
    別大,只是從 Android 源碼提交者的 comments 中搜尋資訊。例如搜尋 god 字串,顯
    示結果 15 所示,但是點擊源碼檔案連結,只是會顯示源碼內容,並不會附加 history
    log comments 內容;


圖 15 History 搜尋

當然可以通過組合的方式使用上述提到的搜尋方法,例如想在 Activity.java 檔案中搜尋
finish 函數的定義,則可以在 Definition 中填入”finish”,在 File Path 中填入”Activity.java”,搜尋
結果 16 所示。

圖 16 組合搜尋
因為 AndroidXRef 使用的是 OpenGrok 引擎,因此還支援一些其他的搜尋方式:

  • + 表示包含此字串,- 表示包含此字串。例如在 Full Search 中搜尋包含 activity
    字串但是不包含 service 字串的源檔案,可以填入+”activity” -“service”(去掉雙引
    號同樣可以,但是對於不可分割的詞且兩者間包含空格則雙引號不可去,此規則適
    用於所有的搜尋規則,例如 Full Search “final String”,雙引號去除表示或的關係,這
    個與 Google 的搜尋規則是一樣的);

  • 布爾操作,可以使用 AND(&&),”+”,OR(||),NOT(!)以及”-”(AND 等必須全部大寫),例如搜
    索既包含 final 又包含 String 的源碼檔案,可以 Full Search 中填入”final” AND “String”;

  • 使用萬用字元,”?”代表一個字元,”*”代表多個字元(“?”和”*”不可用於字串的開頭);

  • 模糊查詢,可以使用”~”搜尋包含與提供的字串拼字類似的源碼檔案等內容;

  • 逸出字元,OpenGrok 中使用到的特殊字元包括+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ ,因此如果需要搜尋的內容中包含這些特殊字元,可以使用\進行轉義,例如搜尋(1+1):2,
    可以這樣\(1\+1\)\:2。


更加詳細的使用規則可以參考 AndroidXRef 的 Help(http://androidxref.com/4.4_r1/help.jsp)。

個人覺得 AndroidXRef 適合用來搜尋定位源碼檔案的路徑,至於源碼的實際分析當然借
助於 Eclipse 等 IDE 會更加方便。

總結

本文主要總結了我個人在 Android 源碼分析過程中使用到的一些工具及基本方法,純屬
一家之言,權當拋磚引玉,如果有更好的方法歡迎交流學習!


註:本帖由看雪論壇志願者PEstone 重新將pdf整理排版,若和原文有出入,以原作者附件為準 



關於在Android源碼分析過程中使用的一些工具以及基本方法的總結,純屬一家之言,當然還有更多更好的方法,歡迎交流!

下載點這裡:Android源碼分析工具及方法.pdf*轉載請註明來自看雪論壇@PEdiy.com 


Android 源碼分析工具

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.