本文首發(fā)于微信公眾號(hào)「劉望舒」
相關(guān)系列文章
Android系統(tǒng)啟動(dòng)系列
應(yīng)用進(jìn)程啟動(dòng)系列
Android深入四大組件系列
Android深入理解Context系列
Android深入理解JNI系列
Android解析WindowManager
Android解析WMS系列
Android解析AMS系列
Android包管理機(jī)制系列
Android輸入系統(tǒng)系列
前言
在上一篇文章Android AOSP基礎(chǔ)(三)Android系統(tǒng)源碼的整編和單編中,我們對(duì)系統(tǒng)源碼進(jìn)行了編譯,這篇文章我們接著來學(xué)習(xí)如何將系統(tǒng)源碼導(dǎo)入到編輯器中,以便于查看和調(diào)試源碼。關(guān)于查看源碼,可以使用Android Studio、Eclipse、Sublime、Source Insight等軟件,這里我推薦使用Source Insight,但是有的同學(xué)可能不是很習(xí)慣,而且Source Insight是Windows平臺(tái)的軟件,Mac平臺(tái)用不了,那么使用Android Studio是一個(gè)不錯(cuò)的選擇,而且使用Android Studio還可以調(diào)試源碼。
1. Source Insight導(dǎo)入系統(tǒng)源碼
在《Android進(jìn)階解密》的第一章,我講解了Source Insight如何導(dǎo)入系統(tǒng)源碼,可能有的同學(xué)沒有買這本書,這里再來講一遍。
Source Insight只能查看源碼,不能調(diào)試源碼,如果只想在Source Insight中查看源碼,可以直接從百度網(wǎng)盤:https://pan.baidu.com/s/1ngsZs 將源碼下載下來。如果想在Android Studio中查看源碼,那么最好還是在Linux環(huán)境下將AOSP源碼下載下來。
新建源碼項(xiàng)目
安裝軟件后,首先要新建源碼項(xiàng)目。通過菜單項(xiàng)Project→New Project會(huì)彈出提示框。

這里我們指定源碼項(xiàng)目的名稱為Android_8.0.0,然后點(diǎn)擊OK按鈕進(jìn)入“New Project Settings”界面。

上圖箭頭指向的Browse按鈕來選擇本地系統(tǒng)源碼所在的路徑,比如我的系統(tǒng)源碼路徑為:D:/Android/android-8.0.0_r1 。選擇好加載路徑后點(diǎn)擊OK按鈕會(huì)進(jìn)入“Add and Remove Project Files”界面,在這個(gè)界面可以向項(xiàng)目中添加整個(gè)Android系統(tǒng)源碼,也可以只把源碼部分目錄添加到項(xiàng)目中,以后再根據(jù)需要添加其他目錄。如果向項(xiàng)目添加整個(gè)Android系統(tǒng)源碼加載時(shí)會(huì)非常慢,這里我們只添加如下源碼目錄:frameworks/、libcore/、packages/、system/、art/和libnativehelper/,這幾個(gè)目錄基本上可以滿足日常的系統(tǒng)源碼閱讀了,如下圖所示。

點(diǎn)擊Add Tree按鈕就會(huì)將選擇的目錄源碼加載到Android_8.0.0項(xiàng)目中,這個(gè)時(shí)候會(huì)彈出加載進(jìn)度條,加載完畢后點(diǎn)擊窗口的關(guān)閉按鈕就可以了。
定位文件
Source Insight的定位文件功能十分強(qiáng)大,我們只需要知道源碼文件名就可以輕松找到它,比如我們要找MediaPlayer.java,只要在文件搜索框輸入MediaPlayer.java即可:

全局搜索
Source Insight另一個(gè)好用的功能就是全局搜索,默認(rèn)快捷鍵為:CTRL+/,或者點(diǎn)擊最上面工具欄類似R的圖標(biāo)。在Search in的輸入選項(xiàng)中我們可以自定義搜索的范圍,比如我們想查找所有Java文件中引用MediaPlayer類的情況,就可以像下圖一樣進(jìn)行操作。

當(dāng)然,Source Insights的功能遠(yuǎn)不只以上幾種,相信隨著使用次數(shù)的增多,你就會(huì)熟練掌握它的大部分功能,這里就不過多介紹了。
2. Android Studio導(dǎo)入系統(tǒng)源碼
Source Insight導(dǎo)入源碼不需要對(duì)源碼進(jìn)行編譯,但是Android Studio導(dǎo)入整個(gè)系統(tǒng)源碼需要對(duì)源碼進(jìn)行編譯,生成AS的項(xiàng)目配置文件。
生成AS的項(xiàng)目配置文件
如果你整編過源碼,查看out/host/linux-x86/framework/idegen.jar是否存在,如果不存在,進(jìn)入源碼根目錄執(zhí)行如下的命令:
source build/envsetup.sh
lunch [選擇整編時(shí)選擇的參數(shù)或者數(shù)字]
mmm development/tools/idegen/
如果沒整編過源碼,可以直接執(zhí)行如下命令單編idegen模塊:
source build/ensetup.sh
make idegen
關(guān)于Android系統(tǒng)源碼的編譯可以查看Android AOSP基礎(chǔ)(三)Android系統(tǒng)源碼的整編和單編這篇文章。
idegen模塊編譯成功后,會(huì)在 out/host/linux-x86/framework目錄下生成idegen.jar,執(zhí)行如下命令:
sudo development/tools/idegen/idegen.sh
這時(shí)會(huì)在源碼根目錄生成android.iml 和 android.ipr 兩個(gè)文件,這兩個(gè)文件一般是只讀模式,這里建議改成可讀可寫,否則,在更改一些項(xiàng)目配置的時(shí)候可能會(huì)出現(xiàn)無法保存的情況。
sudo chmod 777 android.iml
sudo chmod 777 android.ipr
配置AS的項(xiàng)目配置文件
由于要將所有源碼導(dǎo)入AS會(huì)導(dǎo)致第一次加載很慢,可以在android.iml中修改excludeFolder配置,將不需要看的源碼排除掉。等源碼項(xiàng)目加載完成后,還可以通過AS對(duì)Exclude的Module進(jìn)行調(diào)整。如果你的電腦的性能很好,可以不用進(jìn)行配置。
在android.iml中搜索excludeFolder,在下面加入這些配置。
<excludeFolder url="file://$MODULE_DIR$/bionic" />
<excludeFolder url="file://$MODULE_DIR$/bootable" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/cts" />
<excludeFolder url="file://$MODULE_DIR$/dalvik" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/hardware" />
<excludeFolder url="file://$MODULE_DIR$/kernel" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/test" />
<excludeFolder url="file://$MODULE_DIR$/toolchain" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
<excludeFolder url="file://$MODULE_DIR$/.repo" />
導(dǎo)入系統(tǒng)源代碼到AS中
在AS安裝目錄的bin目錄下,打開studio64.vmoptions文件,根據(jù)自己電腦的實(shí)際情況進(jìn)行設(shè)置,這里修改為如下數(shù)值:
-Xms1024m
-Xmx1024m
如果你是在VirtualBox中下載的系統(tǒng)源碼,那么將VirtualBox中的系統(tǒng)源碼拷貝到共享文件夾中,這樣源碼就會(huì)自動(dòng)到Windows或者M(jìn)ac上,如果你不知道如何設(shè)置VirtualBox共享文件夾,可以查看Android AOSP基礎(chǔ)(一)VirtualBox 安裝 Ubuntu這篇文章。
通過AS的Open an existing Android Studio project選項(xiàng)選擇android.ipr 就可以導(dǎo)入源碼,這里我用了大概7分鐘就導(dǎo)入完畢。導(dǎo)入后工程目錄切換為Project選項(xiàng)就可以查看源碼。

配置項(xiàng)目的JDK、SDK
由于我們下載的是9.0的AOSP源碼,SDK版本也應(yīng)該對(duì)應(yīng)為API 28,如果沒有就去SDK Manager下載即可。
點(diǎn)擊File -> Project Structure-->SDKs配置項(xiàng)目的JDK、SDK。
創(chuàng)建一個(gè)新的JDK,這里取名為1.8(No Libraries),刪除其中classpath標(biāo)簽頁下面的所有jar文件。

接著設(shè)置將Android SDK的Java SDK設(shè)置為1.8(No Libraries),這樣Android源碼使用的Java就是Android源碼中的。

確保的項(xiàng)目的SDK為源碼對(duì)應(yīng)的SDK。

Exclude不需要的代碼目錄
File -> Project Structure -> Modules中可以通過Excluded來篩選代碼目錄,比如我們選擇bionic目錄,點(diǎn)擊Excluded,bionic目錄會(huì)變?yōu)槌壬?,bionic字段會(huì)出現(xiàn)在右側(cè)視圖中,說明該目錄已經(jīng)被Excluded掉,通俗來講就是被排除在工程之外。如果不希望bionic目錄被Excluded掉,再次點(diǎn)擊Excluded,bionic目錄會(huì)變?yōu)榛疑?/p>

總結(jié)
這篇我們學(xué)習(xí)了Source Insight和Android Studio導(dǎo)入系統(tǒng)源碼的方法,但是具體的查看源碼的方式?jīng)]有講解,這些需要讀者在使用中逐步去掌握,下一篇我們會(huì)學(xué)習(xí)如何使用Android Studio去調(diào)試系統(tǒng)源碼。
分享大前端、Android、Java等技術(shù),助力5萬程序員成長進(jìn)階。