android studio 除錯 framework 層程式碼
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)
相關文章
- Android Studio程式碼除錯技巧篇Android除錯
- 使用GDB除錯Android Native 層程式碼除錯Android
- Android FrameWork學習(二)Android系統原始碼除錯AndroidFramework原始碼除錯
- Android Apk反編譯系列教程(三)Android Studio除錯smali程式碼AndroidAPK編譯除錯
- android studio中使用adb wifi外掛無線除錯程式AndroidWiFi除錯
- Mac下Android Framework原始碼環境搭建執行及除錯方法MacAndroidFramework原始碼除錯
- 在 Android Studio 上除錯資料庫 ( SQLite )Android除錯資料庫SQLite
- Android Studio怎麼遠端除錯裝置?Android除錯
- Android Studio中編譯除錯Launcher3Android編譯除錯
- Android Framework中的Application Framework層介紹AndroidFrameworkAPP
- 【譯】使用 Visual Studio 除錯外部原始碼除錯原始碼
- android HAL層程式碼Android
- Python 程式碼除錯—使用 pdb 除錯Python除錯
- 自定義Android Studio程式碼模板Android
- 如何在Visual Studio中除錯.NET原始碼除錯原始碼
- GDB 除錯程式碼除錯
- SAP Cloud for Customer Cloud(C4C)Application Studio裡的程式碼除錯CloudAPP除錯
- Android Studio 無線除錯商米T1裝置流程Android除錯
- vue 程式碼除錯神器Vue除錯
- Android Studio 藍芽 示例程式碼(轉)Android藍芽
- 使用 vscode 除錯前端程式碼VSCode除錯前端
- phpstorm 使用 Xdebug 除錯程式碼PHPORM除錯
- VS Code除錯C程式碼除錯C程式
- Python之PySnooper程式碼除錯PythonOOP除錯
- 使用 VSCode 除錯 Electron 主程式程式碼VSCode除錯
- No debuggable processes(Android Studio沒有可除錯應用)問題解決方案Android除錯
- 12個Visual Studio除錯效率技巧除錯
- android 無線除錯Android除錯
- Linux系統程式底層debug除錯及程式原理分析利器Linux除錯
- Android HAL 層框架分析以及程式碼示例Android框架
- phpstorm 遠端除錯 homstead 程式碼PHPORM除錯
- 如何在vscode中除錯程式碼?VSCode除錯
- 推薦程式碼除錯工具 Xdebug除錯
- Android Framework 音訊子系統(12)HAL層分析AndroidFramework音訊
- Android FrameWork 之原始碼編譯AndroidFramework原始碼編譯
- 逮蝦戶!Android程式除錯竟簡單如斯Android除錯
- Android Studio: 除錯的技巧與心得 | AndroidDevSummit 中文字幕視訊Android除錯devMIT
- Android Studio 報錯解決方案 一Android