1. 程式人生 > >Android Studio中除錯Android原始碼

Android Studio中除錯Android原始碼

如果Android程式設計師想往更高一級發展,對Android系統的瞭解深入程度決定了你以後的終點。所以對於系統原始碼的瞭解可謂事半功倍。如果我們死扛原始碼,會浪費很多時間在判斷程式碼走哪個分支上面,對於一些多層巢狀的程式碼,基本上到後面就忘記前面到底走哪個分支了。如果能夠實時看到程式的流程,那麼對於我們理解的吃透程式碼就非常有價值了。

本文將從程式碼下載,編譯,生成AS專案檔案,匯入和除錯入手,讓讀者可以從無到有搭建出一個可用的Android原始碼除錯環境。

環境

AS版本:Android Studio 2.1.1

Ubuntu 版本: ubuntu 14.04 LTS

JDK版本: openjdk version “1.8.0_91”

下載原始碼

清華大學TUNA映象源非常貼心的提供了AOSP程式碼的最新版本,程式碼下載方法參考他們的官方說明文件。下面有一個簡化的命令,方便大家晚上掛機下載,這樣晚上的時間就利用上了。


wget -c -t 0 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar && tar xf aosp-latest.tar && cd AOSP && repo sync 

上面用&&串起來的四條命令用中文描述就是:


用斷點續傳的方式下載aosp-latest.tar檔案,下載完成之後用tar解壓這個檔案,解壓完成進入AOSP資料夾,並且用repo sync來同步最新程式碼

注意參考裡面的文件安裝repo命令。

下載並解壓完之後,使用下面的命令來編譯:


source build/envsetup.sh && lunch 1 && make -j8



其實兩條命令也可以合併,這樣第二天就不用再花時間編譯了。

wget -c -t 0 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
&& tar xf aosp-latest.tar && cd AOSP && repo sync && source build/envsetup.sh && lunch 1 && make -j8

這樣就可以用晚上的非工作時間來下載Android原始碼,下載下來的壓縮過的tar程式碼檔案有26.8G,編譯之後程式碼(包含tar包)有76.1G左右(具體大小要看你選擇編譯的專案,所以最好預留80G,推薦100G空間)。

更新SDK

參考騰訊公司提供的一個SDK更新映象站點。更新所有的API 23下面的內容,包括sdk原始碼,映象那些。因為站點是在國內,所以更新速度也是蠻快的。感謝鵝廠提供這一個方便的途徑升級SDK和AS。

生成AS的專案檔案

如果編譯通過之後,可以使用AOSP程式碼自帶的idegen命令來生成IDE工具用到的專案配置檔案。執行:


mmm development/tools/idegen/

development/tools/idegen/idegen.sh

第二條命令可能耗時稍久,如果執行成功會顯示如下資訊:


Read excludes: 5ms

Traversed tree: 367564ms

會在原始碼根目錄AOSP下面生成android.ipr和android.iml兩個工程配置檔案。對於android.iml需要特別說明,最好在這個裡面新增如下的過濾器,免得AS載入系統原始碼花太長時間。

編輯該檔案,新增:


      <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" />

未驗證的另外一個過濾方式,刪除所有的module-library項。忍受不了的朋友可以試試。

同時因為在載入原始碼並儲存的時候會提示根目錄沒有AndroidManifest檔案,所以在根目錄手動新增一個AndroidManifest.xml檔案,內容為:


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-sdk android:minSdkVersion="23" />

</manifest>

在Android Studio中匯入原始碼

AS記憶體設定

在匯入之前先調整AS的記憶體配置,加大記憶體。修改/home/wubaiyu/android-studio/bin/studio64.vmoptions(如果是32位系統就改studio.vmoptions)檔案的如下幾項:


-Xms1024m

-Xmx1280m

-XX:MaxPermSize=350m

後面的數值取決於你的實體記憶體大小。

AS專案配置

在上一小節中,我們生成了專案配置檔案,這個是idegen指令碼生成的整個系統原始碼的配置檔案,所以我們開啟AS的時候,選擇匯入已有專案這個選項,匯入AOSP這個原始碼目錄。

剩下的就是等等等了!!!匯入之後,會顯示有很多錯誤資訊,無視即可,我們後面也是可以跳轉到相關的程式碼的。

載入完成之後,點選下圖扳手圖示右邊的圖示(Project Structure)。
這裡寫圖片描述

會彈出Project Structure的設定視窗,設定Android API 23 Platform為僅對當前專案有效。(注,不需要使用1.8 noLibrary。在參考的文章裡面有,但是我這裡並沒有用到。)
這裡寫圖片描述

同時在該介面的Project中設定SDK和JDK:
這裡寫圖片描述

並且在Modules介面設定如下:
這裡寫圖片描述

選中中間的android,然後點+號會在下拉里面顯示有Android這個選項,選擇Android就可以新增到下面了。右邊的Dependencies裡面先刪掉除了最上面兩項之外的所有list,然後點選+號,選JARs or directories”,將原始碼目錄裡面的external資料夾和frameworks資料夾新增進來。AS會掃描這兩個資料夾下面的所有JAR檔案,所以會花一些時間。

建立對應版本的模擬器

特別注意,我們上面建立的都是Android API 23和JDK 1.8的配置,所以我們建立模擬器的時候,一定要建立對應SDK版本的,否則肯定是沒法正常除錯的。如下所示,建立第二個Nexus 5X API 23模擬器.
這裡寫圖片描述

在AS中除錯原始碼

我們一Settings模組為例,演示如何除錯。更詳細的內容參考weishu的文章如何除錯Android Framework?,非常詳細,人非常好,幫我解決了很多疑問。

找對程式碼打斷點

各位老司機應該不用我說就知道怎麼找Settings模組的入口了吧。對於新手的話,分下面兩步就可以找到入口了:

第一步. 找Settings模組的AndroidManifest檔案,找裡面的包含如下intent-filter的項



<intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.DEFAULT" />

                <category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

第二步,找到這個類,順藤摸瓜找到他的父類SettingsActivity,並在其onCreate和onResume函式中打斷點。因為有時候你的Settings模組是先執行過的,所以onCreate函式並不一定會跑到,所以在onResume裡面再打一個斷點保險一些。
這裡寫圖片描述

將debugger附加上正確的程序

也就是將debugger附上com.android.settings這個程序,一般模擬器剛開始執行的時候,沒有啟動settings模組,所以並沒有執行該執行緒,我們先點選Settings,啟動之後。點選”Attach Debugger to Android process”圖示這裡寫圖片描述,並選擇com.android.settings程序。如下所示:
這裡寫圖片描述

一定要選中上面的“Show all processes”複選框,否則下面的程序資訊是不會顯示出來的。點選OK,這樣偵錯程式就附加到settings程序上面了,當模擬機上的Settings模組再次執行的時候,偵錯程式就可以截獲到該程序的資訊,並且跳轉到對應的語句上了。見如下介面。
這裡寫圖片描述

注意,左下角的Debugger標籤裡面顯示了當前斷點所處的程式碼在onResume函式。在Run選單下面有對應的除錯命令,比如Step Over/Step Into等等。詳細方法同樣參考上面提到的weishu的那篇博文。

模擬器還是處於onResume的狀態,如下:
這裡寫圖片描述

總結

所以,綜上所示,我們已經可以成功除錯Android原始碼了。成功走出了第一步,下面的就好辦了。如果想了解更多,請綜合閱讀參考文獻裡面的博文。

參考文獻

  1. weishu–如何除錯Android Framework?

  2. Lefter–如何使用Android Studio開發/除錯Android原始碼

  3. 雲濤–使用Android Studio除錯Android Framework程式碼

  4. 知乎上的相關回答–Android Studio如何除錯Framework層的程式碼?