sdk 里面自帶的源碼(前提是你已經(jīng)下載了)像 Activity , Service 等是可以直接調(diào)試的。

但這不是 framework 層所有的代碼,要調(diào)試其它的代碼,要先下載 android 系統(tǒng)源碼。

接下來(lái)就可以編譯 idegen 模塊了
很多人說(shuō)需要先全編譯整個(gè)系統(tǒng),其實(shí)是不用全編譯系統(tǒng)的,只要編譯 idegen 這個(gè)模塊就行了
執(zhí)行 make 編譯
make idegen
make 不帶參數(shù)是編譯整個(gè)系統(tǒng),也可以單獨(dú)編譯一個(gè) module
module 名哪里來(lái)的?? android 是基于 Android.mk(類似 makefile) 進(jìn)行構(gòu)建編譯的, 查看 idegen 的 Android.mk 文件
LOCAL_MODULE:= idegen
include $(BUILD_HOST_JAVA_LIBRARY)
模塊名叫 idegen, 會(huì)被編譯成 jar 包
make idegen 編譯時(shí)會(huì)遍歷所有的模塊找到 idegen 的 Android.mk, 然后計(jì)算所有的依賴的庫(kù),如果依賴庫(kù)沒有編譯會(huì)先編譯所有的依賴庫(kù), 所以 make 編譯時(shí)較慢。

可以看到 1 分鐘就編譯完了,同時(shí)在 out/host/<target_cpu_arc>/framework 下面生成了 idegen.jar
如果是非首次編譯可以用 mmm 或 m 進(jìn)行編譯
cd 到 development/tools/idegen/ 執(zhí)行 mm 或
mmm development/tools/idegen/
mmm 和 mm 都只編譯當(dāng)前模塊,不會(huì)編譯依賴庫(kù),所以第一次還得用 make 編譯。 mm 是編譯當(dāng)前路徑下的模塊。 mmm 是編譯指定路徑下的模塊。
接下來(lái) source development/tools/idegen/idegen.sh 就會(huì)在源碼根目錄生成 android.ipr 和 android.iml 了。

直接用 Android Studio 打開這個(gè) android.ipr 就行了。但由于源碼較多,會(huì)花很長(zhǎng)的時(shí)間建立索引,所以打開之前我們可以先 exclude 掉一些代碼。打開 android.iml 搜索 exclude ,把不想查看的代碼排除掉。
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />
<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" />
第一次可以只保留 framework 文件夾下的代碼
用 AS 打開 android.ipr 后幾分鐘就建立好了索引

橙色的是 exclude 掉的, 灰色的是建立索引的源碼
之后配置 android sdk

這個(gè) sdk 最好配置成跟源碼一致吧,因?yàn)槲疫€沒有下載 7.0 的 sdk 所以配置成了 API 25 (8.0 的sdk)
在這里也可以動(dòng)態(tài)的 exclude 或 include 一些代碼,直接選中要改變的源碼文件夾然后點(diǎn)擊 Excluded 的就行了

接下來(lái)就可以打斷點(diǎn)調(diào)試了,我們來(lái)調(diào)試一下系統(tǒng)設(shè)置,先啟動(dòng)模擬器。
模擬器的 SDK 也要是 7.0 的,否則兩邊的代碼不一致會(huì)造成行號(hào)不一致或根本就斷不下來(lái)
AS 中有一個(gè)全局搜索快捷鍵,按兩下 shift 建可以方便的搜索文件
接下來(lái)在 SettingsActivity.java 的 onStart 中打個(gè)斷點(diǎn)

你怎么知道系統(tǒng)設(shè)置是這個(gè)類???我也是猜測(cè)的! 我在 onStart 打個(gè)斷點(diǎn)肯定能斷下來(lái)吧
之后點(diǎn)擊上面的那個(gè)綠色的小 bug (Attach debugger to Android process) 在進(jìn)程列表里面選擇 settings 進(jìn)程。
注意剛上來(lái)可能沒有 settings 進(jìn)程,你可以先在模擬器中打開系統(tǒng)設(shè)置
之后當(dāng)你在模擬器再次打開系統(tǒng)設(shè)置時(shí)順利斷到了 onStart 中

模擬器默認(rèn)是可調(diào)試的,你自己用 Nexus 或 Pixel 刷的工程版或測(cè)試版應(yīng)該也是可以調(diào)試的。 我用小米6 (MIUI 開發(fā)版)壓根就讀取不到進(jìn)程信息。