1. 程式人生 > >Android原始碼開發環境搭建

Android原始碼開發環境搭建

轉自:http://gityuan.com/2016/08/13/android-os-env/

一. 準備

本文介紹採用Android Studio來搭建原始碼除錯環境

1.1 下載Android Studio

**調整記憶體大小: ** Android Studio需要大量的記憶體來載入Android原始碼,所以經常會遇到記憶體不足的問題, 需要加大記憶體. 點選Help-> Edit Custom VM Options, 比如 “-Xms4096m -Xmx4096m”

更多資料:

1.2 下載Android系統原始碼

1.2.1 安裝repo

<span style="color:#404040"><span style="color:#333333"><code><span style="color:#cc7832">mkdir</span> ~/bin PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
<span style="color:#cc7832">chmod</span> a+<span style="color:#cc7832">x</span> ~/bin/repo
</code></span></span>

1.2.2 初始化repo

<span style="color:#404040"><span style="color:#333333"><code>mkdir ~/aosp <span style="color:#808080">//建立目錄,可自己定義</span>
cd ~/aosp
git config --<span style="color:#cc7832">global</span> user.name <span style="color:#6a8759">"Gityuan"</span> <span style="color:#808080">//配置git的使用者名稱</span>
git config --<span style="color:#cc7832">global</span> user.email <span style="color:#6a8759">"
[email protected]
"</span> <span style="color:#808080">//配置git的郵箱</span> </code></span></span>

1.2.3 下載原生Android原始碼

如下第一條是下載master分支程式碼;如果需要下載某條指定分支,可通過第二條命令,比如指定分支android-7.0.0_r1, 其他分支資訊可檢視https://source.android.com/source/build-numbers.html#source-code-tags-and-builds.

<span style="color:#404040"><span style="color:#333333"><code><span style="color:#6a8759">repo</span> init -u https://android.googlesource.com/platform/manifest
repo init -u https://android.googlesource.com/platform/manifest -b android-<span style="color:#6897bb">7</span>.<span style="color:#6897bb">0</span>.0_r1
</code></span></span>

初始完成後,可以開始同步程式碼,其中如下第一條是同步所有可用的project,第二條只同步當前初始化的分支,第三條是隻同步frameworks/base庫。

<span style="color:#404040"><span style="color:#333333"><code><span style="color:#6a8759">repo</span> sync
repo sync -c -j4
repo sync platform/frameworks/base -c -j4
</code></span></span>

相關資料:

1.2.4 編譯Android原始碼

以build aosp的eng版本為例:(當然build前需要先配置jdk環境)

<span style="color:#404040"><span style="color:#333333"><code>make clobber    <span style="color:#808080">//刪除所有先去build所產生的output檔案</span>
source build/envsetup.sh    <span style="color:#808080">//建立環境變數</span>
lunch aosp_arm-eng          <span style="color:#808080">//選擇build target</span>
make -j4                    <span style="color:#808080">//build原始碼</span>
</code></span></span>

二. 搭建原始碼環境

2.1 生成IDE相關檔案

idegen專門為IDE環境除錯原始碼而設計的工具, 依次執行如下命令:

<span style="color:#404040"><span style="color:#333333"><code><span style="color:#6a8759">soruce</span> build/envsetup.sh  
mmm development/tools/idegen/  
./development/tools/idegen/idegen.sh
</code></span></span>

以上3個步驟的含義依次如下:

<span style="color:#404040"><span style="color:#333333"><code>Step <span style="color:#6897bb">1</span>: 用於初始化環境變數
Step <span style="color:#6897bb">2</span>: 生成檔案<span style="color:#cc7832">out</span>/host/linux-x86/framework/idegen.jar
Step <span style="color:#6897bb">3</span>: 原始碼根目錄生成檔案android.ipr(工程相關設定), android.iml(模組相關配置)
</code></span></span>

2.2 原始碼匯入Android Studio

開啟Android Studio, 點選File -> Open,選中前面生成的android.ipr檔案即可, 該過程較耗時

(a) 載入前配置檔案提速:

開啟android.iml檔案,有大量excludeFolder,是指不會匯入到AS的模組,預設除了以下14個資料夾之外的所有檔案都會導致到AS工程, 這顯然還會非常龐大的,那麼我們可以有選擇的匯入 如下:

<span style="color:#404040"><span style="color:#333333"><code><<span style="color:#e8bf6a">excludeFolder</span> url=<span style="color:#6a8759">"file://$MODULE_DIR$/.repo"</span>/>
<<span style="color:#e8bf6a">excludeFolder</span> url=<span style="color:#6a8759">"file://$MODULE_DIR$/external/bluetooth"</span>/>
<<span style="color:#e8bf6a">excludeFolder</span> url=<span style="color:#6a8759">"file://$MODULE_DIR$/frameworks/base/docs"</span>/>
<<span style="color:#e8bf6a">excludeFolder</span> url=<span style="color:#6a8759">"file://$MODULE_DIR$/out/host"</span>/>
<<span style="color:#e8bf6a">excludeFolder</span> url=<span style="color:#6a8759">"file://$MODULE_DIR$/prebuilt"</span>/>
</code></span></span>

(b) 載入後提速:

如果已經把全部專案匯入到Android Studio,又想刪除怎麼辦,其實有一個簡單的方法就是進入目錄Project Structure -> Modules, 可快速去除某些模組, 其中紅色程式碼Exclueded選項(即代表已刪除的目錄), 如下圖:

as_modules

2.3 配置原始碼正確跳轉

這裡的配置JDK/SDK,是用於解決在分析和除錯原始碼的過程,能正確地跳轉到目標原始碼,而非SDK中的程式碼。 點選File選單下的Project Structure.

Step 1 新建JDK

Project Structure -> SDKs, 新建 JDK(None), 其中JDK目錄可選擇跟原本JDK一致即可, 然後刪除其classpath和SourcePath的內容,確保使用Android系統原始碼檔案

jdk_none

Step 2 配置SDK

Project Structure -> SDKs, 選中Android API 25 Platform, 然後選擇其Java SDK為前面新建的JDK(None)

sdk_none

Step 3 選擇SDK

Project Structure -> Project -> 選中Project SDK, 選擇前面的Android API 25 Platform

project_sdk

Step 4 建立依賴

Project Structure -> Modules -> android -> Dependencies: 先刪除Android API 25 Platform之外的所有依賴, 然後點選下圖綠色的+號來選擇Jars or directories,將frameworks新增進來, 也可新增其他所關注的原始碼;

project_dependencies

下圖便是新增後的結果圖:

project_result

三. 線上除錯

前面已搭建好了Android的原始碼除錯環境, 接下來可以線上除錯原始碼. 首先,需要一臺具有debug版的手機, 開啟開發者選項, 允許USB除錯.

3.1 attach系統程序

frameworks各大核心服務執行在system_server程序, 在偵錯程式上名字為system_process,通過如下操作attach到我們要除錯的目標程序, 同理, 要除錯其他app程序也是這個方式.

as_attach

3.2 進入除錯

首先需要設定斷點, 一旦進入斷點便會停下來, 可以檢視當時各個執行緒/變數值. 關於除錯下一步等快捷鍵, 只需點選Tools即可看到.

as_debugger

四. 相關知識點

搭建原始碼過程涉及一些知識點,這裡再進一步說明,在原始碼開發過程一定離不開repo和git命令,其中關於Git命令的用法,大家可以看如下:

4.1 build型別

build型別有eng, userdebug, user這3者的區別:

型別 eng userdebug user
ro.debuggable 1 1 0
ro.kernel.android.checkjni 1 0 0
ro.secure 0 0 1
adb(預設狀態) 開啟 開啟 關閉

eng/userdebug版本會開啟不同的debug屬性以及預設開啟adb; 而user版本則關閉debug屬性且預設關閉adb功能。

4.2 Repo命令說明

Android系統原始碼是有非常多的git庫組成的,為例更加便捷方便地管理所有的git庫,便有了repo存在的價值。 Repo是一個庫管理工具,是建立在git之上,為了更好的管理具有多個git庫的工具。

init:

<span style="color:#404040"><span style="color:#333333"><code>repo init -u <<span style="color:#e8bf6a">URL</span>> [<<span style="color:#e8bf6a">OPTIONS</span>>]
</code></span></span>
  • -u: manifest所在URL,例如 https://android.googlesource.com/platform/manifest;
  • -b: 指定版本,例如 android-7.0.0_r1
  • -m: manifest名,預設為 default.xml.

sync:

<span style="color:#404040"><span style="color:#333333"><code>repo sync <span style="color:#808080">//同步所有的可用project</span>
repo sync PROJECT0 PROJECT1 ... <span style="color:#808080">//同步一個或多個project</span>
</code></span></span>

upload:

<span style="color:#404040"><span style="color:#333333"><code>repo upload [<<span style="color:#e8bf6a">PROJECT_LIST</span>>]
</code></span></span>

diff:

<span style="color:#404040"><span style="color:#333333"><code><span style="color:#6a8759">repo</span> diff
</code></span></span>

download: 從review系統 下載指定的change, 到本地project.

<span style="color:#404040"><span style="color:#333333"><code>repo download <<span style="color:#e8bf6a">TARGET</span>> <<span style="color:#e8bf6a">CHANGE</span>>
</code></span></span>

例如:從庫platform/build中將change 23823 拉到本地:

<span style="color:#404040"><span style="color:#333333"><code><span style="color:#6a8759">repo</span> download platform/build <span style="color:#6897bb">23823</span>
</code></span></span>

forall: 讓每一個git庫都執行相應的command

<span style="color:#404040"><span style="color:#333333"><code>repo forall [<<span style="color:#e8bf6a">PROJECT_LIST</span>>] -c <<span style="color:#e8bf6a">COMMAND</span>>
</code></span></span>