檢視Android系統的原始碼 線上和離線方式 及閱讀工具
前言
不管是做Android底層(Framework-Linux-驅動)開發,還是做APP開發,對於Android的某一個功能,某一個機制,或者某一個API,它到底是如何實現的,需要 Read the fucking source code,才能瞭然於胸,靠聽第三方講故事是不行的。
線上檢視Android原始碼
http://android.git.kernel.org/已經不能訪問了,可以通過下面的mirrors來線上檢視Android的原始碼:
本地檢視Android原始碼
標 題: 【原創】Android原始碼分析工具及方法
作 者: MindMac
時 間: 2014-01-02,09:32:35
鏈 接:
在對 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. @Override
3. protected void onCreate(Bundle savedInstanceState) {
4. super.onCreate(savedInstanceState);
5. setContentView(R.layout.activity_main);
6. ......
7. }
8. }
可以使用 Eclipse 提供的快速定位功能來檢視 Activity 類的原始碼,但是點選後會顯示 Source notfound,如圖 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 搜尋
- 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系統的原始碼 線上和離線方式 及閱讀工具
前言 不管是做Android底層(Framework-Linux-驅動)開發,還是做APP開發,對於Android的某一個功能,某一個機制,或者某一個API,它到底是如何實現的,需要 Re
win7下VS2015編譯tensorflow原始碼教程(線上和離線)及呼叫配置
這段時間一直用python程式碼import tensorflow和keras的庫,來搭建CNN框架進行影象的訓練和預測,現在想用tensorflow的c++版來改寫實現。故想自己編譯一份tensroflow的lib和dll檔案,建立工程呼叫其來實現相同的功能。本部落格主要
Eclipse外掛安裝(線上和離線方式)
我們都知道Eclipse是基於外掛的,外掛為Eclipse提供了極大的擴充套件能力。我們經常會用到一些Eclipse中沒有給我提供的一些功能,比如SVN,比如Thymeleaf的編輯工具,比如ADTBundle等等,都是通過外掛來完成,那麼我們該如何安裝我們需要的外掛到Ecl
Android系統原始碼情景分析 [羅昇陽著][帶書籤和原始碼]
在組織上,本書劃分為初識Android系統、Android專用驅動系統和Android應用程式框架三大篇。初識Android系統篇介紹了參考書籍、基礎知識以及實驗環境搭建;Android專用驅動系統篇介紹了Logger日誌驅動程式、Binder程序間通訊驅動程
線上看Android系統原始碼,那些相見恨晚的幾種方案
前言:最近在研究MediaCodec,u盤壞了,之前下載的原始碼也就自然沒有了,真是個難過的事情,不能因為沒有原始碼了,就阻擋我的計劃了呀,於是就是今天一文,線上看Android原始碼,加之此前很多人也有向我留言,如何看android系統的原始碼,今天來敲黑
Android 科大訊飛 線上和離線語音聽寫
效果圖: 參考資料 專案裡要用語音聽寫,想到了科大訊飛,參考上面的資料完成了最簡單的線上有UI的語音識別,後面想要改成離線也可以使用。參考下面的文章 下載好語記和離線資源之後,想要改成有UI的RecognizerDialog離線語音聽寫,但是沒
Android系統原始碼編譯 unsupported reloc 43 和 make update-api
Android系統原始碼編譯 unsupported reloc 43 和 make update-api 最近初次接觸到Android系統原始碼的編譯工作,公司內使用的開發板是RK3288平臺的。眾所周知,Android是一個開源、開放的系統平臺,國內的眾多所謂的智慧系統好多都是基
線上看Android系統原始碼,AndroidXRef的簡易使用方法
轉載自:http://blog.csdn.net/hejjunlin/article/details/53454514 前言:最近在研究MediaCodec,u盤壞了,之前下載的原始碼也就自然沒有了,真是個難過的事情,不能因為沒有原始碼了,就阻擋我的計劃了呀,於是就是今
(連載)Android系統原始碼分析--如何下載和閱讀Android原始碼
> ** 這是一個連載的博文系列,我將持續為大家提供儘可能透徹的Android原始碼分析 [github連載地址](https://github.com/foxleezh/AOSP)** ## 前言 閱讀Android原始碼的好處有很多,可以加深我們對系統的瞭解,可
(轉)android系統開發 AP 和 BP 簡要說明
java 純c hal window 用戶界面 部分 上下 arm 配置 手機的AP和BP根據上下文可以指代硬件和軟件兩種意思. 1) 大多數的手機都含有兩個處理器。操作系統、用戶界面和應用程序都在Application Processor(AP)上執行,AP一般采用AR
Android系統原始碼分析之-ContentProvider
距離上一次寫部落格已經半年多了,這半年發生了很多事情,也有了很多感觸,最主要是改變了忙碌了工作,更加重視身體的健康,為此也把工作地點從深圳這個一線城市換到了珠海,工作相對沒有那麼累,身體感覺也好了很多。所以在工作完成之餘,也有了更多的時間來自我學習和提高,後續會用更多時間來寫更多實用的東西,幫助我們理解
Ros入門(1)ubuntu檢視當前系統的版本和核心
下面是一些檢視當前Linux系統的版本的方法: 注:proc目錄下記錄的當前系統執行的各種資料,version記錄的版本資訊可以通過cat檢視到。 1. 使用命令:cat /proc/version proc目錄下記錄的當前系統執行的各種資料,version記錄
iTOP-iMX6開發板Android系統下LVDS和HDMI雙屏異顯方法
迅為iMX6 開發板 android 系統下 LVDS 和 HDMI 雙屏異顯的使用過程。 使用“Mfgtools-Rel-1.1.0_180403_MX6Q_UPDATER”版本的燒寫工具,把系統燒寫進開發板。系統啟動之後,把“.mp4”格式的視訊檔案放到“/sdcard”目錄下,如下圖所示。
【安卓本卓】Android系統原始碼篇之(二)Source Insight
Source Insight(以下簡稱SI) 一、SI簡介 SI是一款面向專案開發的程式編輯器和程式碼瀏覽器,它提供了一個檢視將分散在各個地方的程式碼匯合在一起形成一個虛擬的整體,供開發者方便地閱讀和編輯,如下圖所示。它已經持續維護了10多年了,旨在提
android hardware 簡述(Android系統原始碼情景分析 筆記)
轉自 https://blog.csdn.net/u013377887/article/details/52965988 1.Android原始碼開發的C可執行原始檔一般存在external目錄下 2 Android的幾層框架. &n
Android系統原始碼分析--View繪製流程之-setContentView
上一篇分析了四大元件之ContentProvider,這也是四大元件最後一個。因此,從這篇開始我們分析新的篇章--View繪製流程,View繪製流程在Android開發中佔有非常重要的位置,只要有檢視的顯示,都離不開View的繪製,所以瞭解View繪製原理對於應用開發以及系統的學習至關重要。由於View
Android 系統原始碼不編譯xxxTests模組的mk檔案註釋
1. 編譯xxxTests模組導致的編譯不過 build/core/Makefile:2789: warning: ignoring old commands for target `out/target/product/sp9832e_op54_go/sp9832e_op54_g
使用android studio 檢視 android 的原始碼
以前都使用 source insight 檢視原始碼. 但是一直使用的都是盜版的. 決心改換成studio. &n
Android [Camera 原始碼] 建立和提交請求(Request Creation) Google官方文件(八)
Google原始碼網地址連結:https://source.android.com/devices/camera 該Google Camera的文件為系列文章,文章列表: overview Camera3 HAL Subsystem Metadata and Con
Android [Camera 原始碼] 錯誤和資訊流處理(Errors and Streams) Google官方文件(七)
Google原始碼網地址連結:https://source.android.com/devices/camera 該Google Camera的文件為系列文章,文章列表: overview Camera3 HAL Subsystem Metadata and Con