自己動手調試Android源碼

自己動手編譯Android最新源碼一文中,我們爲自己編譯了一份最新的Android源碼.很多時候,我們編譯源碼的目的不僅僅是嘗試一番,而是希望對其進行調試,並修改源碼,看看其中一些關鍵機制的運行原理.比如你對AMS掌握不深,那麼就來單獨的調試一下;又或者是說你想看看launcher的實現原理,同樣也可以自己動手調試.更或者說,你覺得某個模塊很不理想,想自己修改一番,那就更好了.

下面,我們來說說如何調試源碼.同樣這裏的工作平臺還是ubuntu 16.04和Android Studio.另外,本文參考源碼中developent/tools/idegen/README文檔.


基礎準備

源碼編譯完整之後,我們就可以導入源碼到Android Studio中進行調試了.那麼如何調試呢?
在源碼中,存在idegen模塊,該模塊專門用來爲idea工具生成系統源碼的project.

在開始編譯該模塊之前,首先確保你已經編譯過Android源碼了,如果沒有,可以參考上篇文章進行編譯.
和編譯普通的模塊一樣,我們用mmm命令編譯idegen.在開始編譯之前,檢查out/host/linux-x86/framework/目錄下是否存在idegen.jar文件,存在則說明你已經編譯過該模塊,否者,則需要編譯.執行如下命令即可:

soruce build/envsetup.sh
mmm development/tools/idegen/
sudo ./development/tools/idegen/idegen.sh

其中mmm development/tools/idegen/執行完成後會生成idegen.jar,而sodo ./development/tools/idegen/idegen.sh則會在源碼目錄下生成IEDA工程配置文件:android.ipr,android.iml及android.iws.

簡單的說明一下這三個文件的作用:

android.ipr:通常是保存工程相關的設置,比如編譯器配置,入口,相關的libraries等
android.iml:則是主要是描述了modules,比如modules的路徑,依賴關係等.
android.iws:則主要是包含了一些個人工作區的設置.

到目前爲止,我們就完成了源碼準備工作.


源碼導入

2.1 修改AS配置文件

編譯成功後,現在我們就可以將源碼導入Android Studio了.但是在導入之前,我們先修改一下Android studio的配置:32位系統下修改idea.vmoptions,64位下修改idea64.vmotions
調整其中的-Xms和-Xmx參數值,官方要求至少在748m以上,根據實際情況進行配置即可.
然後進入android-studio目錄下的bin文件夾,執行如下命令啓動Android Studio

./studio.sh

2.2 導入源碼

接下來,我們導入源碼:打開Android Studio,點擊File->Open,選擇剛纔生成的android.ipr文件即可,然後就是漫長的等待,注意此時是將源碼完全導入到AS中了,不出意外,你會覺得AS運行非常之慢.那麼該如何做呢?繼續往下看吧.

很多情況下,我們希望不導入某些模塊,那麼就可以在導入前修改android.iml文件,通過添加配置的方式告訴AS不導入某些模塊,比如現在我不想導入art模塊,那麼就在android.iml文件中添加:

<excludeFloder url="file://$MODULE_DIR$"/abi>

不難發現,其格式爲:<excludeFloder url="file://$MODULE_DIR$"/模塊名>
注:編譯生成的android.iml文件中已經默認排除了一下模塊,通過搜索excludeFolder關鍵字可找到.

我這裏只保留了framworks和packages模塊,將其他模塊全部排除了,因此在android.iml中添加了以下配置:

<excludeFolder url="file://$MODULE_DIR$/.repo" />
<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" />
<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$/libcore" />
<excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
<excludeFolder url="file://$MODULE_DIR$/ndk" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/tools" />

此時導入AS後的結果如下所示:
這裏寫圖片描述

如果已經將全部項目導入到AS中,而又想排除一些模塊該怎麼辦呢?
此時可以在Project Scureture的Mobules中進行排除.比如這裏我想排除art模塊,那麼做法如下圖:
這裏寫圖片描述

2.3 源碼查看

導入的過程是很漫長滴.導入完成之後,現在我們就可以在android studio中查看源碼,如圖:
這裏寫圖片描述

2.4 解決源碼跳轉錯誤問題

爲了編碼Android源碼跳轉錯誤問題,還需要做以下兩點:配置SDK,JDK及修改依賴,具體操作如下:

2.4.1 配置SDK和JDK

我們需要爲當前項目配置JDK和SDK:點擊Project Structure,進入到項目配置界面,在SDKs設置中加入必須的JDK和SDK:
這裏寫圖片描述
爲了確保使用的是Android源碼庫中的文件,我們將新添加的這個JDK的Classpath中的內容全部刪掉,也就是需要刪掉Classpath標籤頁下的所有jar包,然後在下面Android API 24 platform中指定使用剛纔新增的JDK,
最後在右側選中Project標籤,在Project SDK中選擇對應的Android API版本.

2.4.2 修改依賴

同樣打開Projects Stucture,選擇Modules.首先將所有的依賴刪除(爲了方便,後邊如果缺少,可以自行添加進來)
這裏寫圖片描述

刪除完成之後(保留下圖所示的兩項),並點擊右邊的”+”添加Frameworks和external目錄,結果如下圖所示:
這裏寫圖片描述

到現在爲止,你就可以正常的查看源碼,並在源碼間進行跳轉了.


源碼調試

搞定上面之後,現在我們來看看如何用Android Studio一步一步調試代碼.
首先爲剛纔導入的工程添加Framework,以便讓AS將它作爲一個Android工程,從而能讓我們進行調試,如果項目已經是Android工程了(目前最新的android源碼導入到as中就是作爲一個android工程,因此不需要在做這一步了)則不需要再次進行添加了.

在Project Structure中的Mouble中,爲其添加Framework,如下圖所示:
這裏寫圖片描述

接下來就可以用debugger進行調試跟蹤代碼了.首先使用emulator命令啓動我們的虛擬機.接下來選擇Attache debugger to Android process,在彈出的Choose Process框內必須選擇Show all processes,否則看不到相關的進程:
這裏寫圖片描述

調試演示

這裏我一調試com.android.settings模塊爲例進行說明.
在SettingActivity中下斷點,如圖:
這裏寫圖片描述

選擇com.android.settings
這裏寫圖片描述

做完這些後,我們點擊android 虛擬機中的設置,隨後就可以一步一步調試了
這裏寫圖片描述


總結

要想調試源碼,不難發現,一共需要以下幾個步驟:
1. 編譯好的源碼
2. 使用idegen模塊生成必要的項目工程文件
3. 導入源碼到AS中
現在呢,你可以放心的去調試了,在這期間出現問題可自行Google解決,一般都能找到答案.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章