android studio 調(diào)試 framework 層代碼

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

sdk_source_code.png

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

source_code.png

接下來就可以編譯 idegen 模塊了

很多人說需要先全編譯整個系統(tǒng),其實是不用全編譯系統(tǒng)的,只要編譯 idegen 這個模塊就行了

執(zhí)行 make 編譯

make idegen

make 不帶參數(shù)是編譯整個系統(tǒng),也可以單獨編譯一個 module

module 名哪里來的?? android 是基于 Android.mk(類似 makefile) 進行構(gòu)建編譯的, 查看 idegen 的 Android.mk 文件

LOCAL_MODULE:= idegen
include $(BUILD_HOST_JAVA_LIBRARY)

模塊名叫 idegen, 會被編譯成 jar 包

make idegen 編譯時會遍歷所有的模塊找到 idegen 的 Android.mk, 然后計算所有的依賴的庫,如果依賴庫沒有編譯會先編譯所有的依賴庫, 所以 make 編譯時較慢。

make.png

可以看到 1 分鐘就編譯完了,同時在 out/host/<target_cpu_arc>/framework 下面生成了 idegen.jar

如果是非首次編譯可以用 mmm 或 m 進行編譯

cd 到 development/tools/idegen/ 執(zhí)行  mm  或
mmm development/tools/idegen/

mmm 和 mm 都只編譯當前模塊,不會編譯依賴庫,所以第一次還得用 make 編譯。 mm 是編譯當前路徑下的模塊。 mmm 是編譯指定路徑下的模塊。

接下來 source development/tools/idegen/idegen.sh 就會在源碼根目錄生成 android.ipr 和 android.iml 了。

ipr.png

直接用 Android Studio 打開這個 android.ipr 就行了。但由于源碼較多,會花很長的時間建立索引,所以打開之前我們可以先 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 后幾分鐘就建立好了索引

ignore.png

橙色的是 exclude 掉的, 灰色的是建立索引的源碼

之后配置 android sdk

sdk.png

這個 sdk 最好配置成跟源碼一致吧,因為我還沒有下載 7.0 的 sdk 所以配置成了 API 25 (8.0 的sdk)

在這里也可以動態(tài)的 exclude 或 include 一些代碼,直接選中要改變的源碼文件夾然后點擊 Excluded 的就行了

ignore_ui.png

接下來就可以打斷點調(diào)試了,我們來調(diào)試一下系統(tǒng)設(shè)置,先啟動模擬器。

模擬器的 SDK 也要是 7.0 的,否則兩邊的代碼不一致會造成行號不一致或根本就斷不下來

AS 中有一個全局搜索快捷鍵,按兩下 shift 建可以方便的搜索文件

接下來在 SettingsActivity.java 的 onStart 中打個斷點

breakpoint.png

你怎么知道系統(tǒng)設(shè)置是這個類???我也是猜測的! 我在 onStart 打個斷點肯定能斷下來吧

之后點擊上面的那個綠色的小 bug (Attach debugger to Android process) 在進程列表里面選擇 settings 進程。

注意剛上來可能沒有 settings 進程,你可以先在模擬器中打開系統(tǒng)設(shè)置

之后當你在模擬器再次打開系統(tǒng)設(shè)置時順利斷到了 onStart 中

break.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容