android studio 除錯 framework 層程式碼

峻峰飛陽發表於2018-08-10

sdk 裡面自帶的原始碼(前提是你已經下載了)像 Activity , Service 等是可以直接除錯的。

sdk_source_code.png

但這不是 framework 層所有的程式碼,要除錯其它的程式碼,要先下載 android 系統原始碼。

source_code.png

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

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

執行 make 編譯

make idegen

make 不帶引數是編譯整個系統,也可以單獨編譯一個 module

module 名哪裡來的?? android 是基於 Android.mk(類似 makefile) 進行構建編譯的, 檢視 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/ 執行  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)

在這裡也可以動態的 exclude 或 include 一些程式碼,直接選中要改變的原始碼資料夾然後點選 Excluded 的就行了

ignore_ui.png

接下來就可以打斷點除錯了,我們來除錯一下系統設定,先啟動模擬器。

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

AS 中有一個全域性搜尋快捷鍵,按兩下 shift 建可以方便的搜尋檔案

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

breakpoint.png

你怎麼知道系統設定是這個類???我也是猜測的! 我在 onStart 打個斷點肯定能斷下來吧

之後點選上面的那個綠色的小 bug (Attach debugger to Android process) 在程式列表裡面選擇 settings 程式。

注意剛上來可能沒有 settings 程式,你可以先在模擬器中開啟系統設定

之後當你在模擬器再次開啟系統設定時順利斷到了 onStart 中

break.png

模擬器預設是可除錯的,你自己用 Nexus 或 Pixel 刷的工程版或測試版應該也是可以除錯的。 我用小米6 (MIUI 開發版)壓根就讀取不到程式資訊。




(原文連結:https://www.jianshu.com/p/5a0e15e4edb3)
 

相關文章