Android10.0 系統解析(02)——搭建Android源代碼編譯調試環境

1、前言

Android的編譯環境作爲深入學習Android的基礎,不可或缺,能夠完整下載Android源代碼並編譯成功,對深入學習Android是非常關鍵和重要的一步。Android環境搭建比較繁瑣和枯燥,大家需要有足夠的耐心,去一步一步的解決問題,否則就很容易會編譯失敗或者沒有辦法在Google手機上調試通過。

2、構建編譯環境

根據AOSP官網中關於“構建編譯環境”中描述,我們可以瞭解到目前只能使用Linux或者macOS進行源碼級的開發。

路徑:https://source.android.google.cn/setup/build/initializing

構建編譯環境

本部分介紹瞭如何設置本地工作環境來編譯 Android 源代碼文件。您必須使用 Linux 或 macOS;目前不支持在 Windows 環境下編譯。

2.1、虛擬機選擇

如果您有Linux或者Mac操作系統的開發設備,那麼部分就可以直接跳過。
如果您常用的開發設備是Windows操作系統的話,那麼可以考慮用虛擬機去學習或者研究Android源代碼。

目前市面上有兩款虛擬機軟件,大家自行選擇其中一款即可。

2.1.1、下載VirtualBox及其擴展包

在VirtualBox的下載頁中下載最新的安裝包和擴展包,下載完成後將得到以下兩個文件:

  • VirtualBox-6.1.8-137981-Win.exe
  • Oracle_VM_VirtualBox_Extension_Pack-6.1.8.vbox-extpack

2.1.2、安裝VirtualBox

雙擊可執行文件 “VirtualBox-6.1.8-137981-Win.exe”,
這個部分只需要您做出肯定的回答就可以完成虛擬機的安裝。

2.1.3、添加擴展包

按照以下的步驟,完成擴展工具包的添加。

  • 啓動VirtualBox,然後點擊扳手圖標按鈕“全局設定(P)”
  • 在左邊的Tab頁找到“擴展”選項卡,然後在右側中部點擊“+”圖片按鈕。
  • 在彈出的文件選擇對話框裏,選擇前面獲取到的擴展包“Oracle_VM_VirtualBox_Extension_Pack-6.1.8.vbox-extpack”。
  • 在"虛擬電腦控制檯 - 問題"畫面中,點擊“安裝”按鈕。
  • 在"Virtual Box 許可" 畫面中,將許可證書滑動到最後,點擊“我同意(A)”按鈕。
  • 完成擴展包的安裝。

2.2、安裝Ubuntu

那我們應該下載什麼版本的Ubuntu操作系統呢,根據AOSP官網的提示,64位的Ubuntu LTS (14.04) 風險小一些。

路徑:https://source.android.google.cn/setup/build/initializing

設置 Linux 編譯環境 以下說明適用於所有分支(包括 master)。
 
我們會定期在 Ubuntu LTS (14.04) 和 Debian 測試版本中對 Android
編譯系統進行內部測試。其他大多數分發版本都應該具有所需的編譯工具。
 
如果是 Gingerbread (2.3.x) 及更高版本(包括 master 分支),需要使用 64 位環境。如果是較低的版本,則可以在 32 位系統中編譯

筆者安裝了64位的Ubuntu LTS (14.04)版本,遺憾的是出現了崩潰,嘗試幾次都沒有沒有安裝成功。
所以下面以安裝最新的Ubuntu桌面版Ubuntu LTS (20.04)進行說明。

2.2.1、下載最新的Ubuntu桌面版(Ubuntu 20.04 LTS)

接下來我們需要下載最新版本的Ubuntu桌面版,建議使用加載工具,直接網頁下載速度非常的慢。
路徑:https://ubuntu.com/download/desktop

下載完成以後,您將獲得以下可執行文件:

  • ubuntu-20.04-desktop-amd64.iso

2.2.2、Ubuntu安裝過程

(1)創建虛擬機:
  • 啓動VirtualBox,在管理器的右側的面板上,點擊“新建(N)”圖片按鈕。
  • 在“新建虛擬電腦”畫面上,填寫一下信息:
    • 名稱:Ubuntu 20.04 LTS(填入名稱以後,類型和版本會自動填寫,默認即可)
    • 文件夾:選擇空間足夠的磁盤存放
    • 類型:Linux
    • 版本:Ubuntu(64-bit)
  • 內存大小:筆者的筆記本電腦內存爲16G,分配一半(8192M)給虛擬機.點擊“下一步(N)”按鈕。
  • 虛擬硬盤:填寫極限使用時的虛擬硬盤大小(比如256G),選擇“現在創建虛擬硬盤(C)”單選按鈕,然後點擊“創建”按鈕。
  • 虛擬硬盤文件類型:選擇"VDI(VirtualBox磁盤映像)"單選按鈕,點擊“下一步(N)”按鈕。
  • 磁盤分配類型:選擇“動態分配(D)”單選鈕,點擊“下一步(N)”按鈕。
  • 文件位置和大小:選擇虛擬硬盤的保存位置並設置虛擬硬盤大小,然後單擊“創建”按鈕。

完成虛擬機的創建,選中虛擬機後,單擊“設置”按鈕,在彈出的虛擬機設置對話框中可以查看並修改虛擬機的各個參數。

(2)安裝Ubuntu 系統軟件
  • 管理器的右側的面板上,點擊“啓動(T)”按鈕。
  • 在彈出的“選擇啓動盤”對話框中,單擊右側文件夾小圖標。
  • 選擇虛擬光盤文件“ubuntu-20.04-desktop-amd64.iso”,單擊“啓動”。
  • 進入安裝界面。 選擇“中文簡體”,選擇“安裝Ubuntu”。
    • 鍵盤佈局:一般來說來說,我們的鍵盤佈局爲英文鍵盤,選擇“English(US) -English(US) ”,選擇“繼續”。
    • 更新和其他軟件:選擇“最小安裝”和“安裝Ubuntu時下載更新”(網絡狀況不好可以不選),選擇“繼續”。
    • 安裝類型:選擇“清除整個磁盤並安裝Ubuntu”,單擊“現在安裝(I)”按鈕,彈出警告框,選擇“繼續”。
    • 您在什麼地方:時區選擇,用鼠標單擊地圖中的“中國”,就會選擇“上海”,單擊“繼續”。
    • 您是誰?:新建賬戶信息,比如用戶名,密碼等信息,單擊“繼續”。
  • 等待安裝完成。
(3)安裝增強功能

屏幕分辨率較低,需要安裝增強功能。

  • 點擊菜單“設備”
  • 點擊“安裝增強功能”,在彈出的對話框裏,點擊“運行” 。
  • 輸入登錄系統的密碼,點擊授權,就開始自動安裝。
  • 在系統的左側右擊光盤,選擇“彈出”光盤 。
  • 雙擊虛擬機窗口,驗證屏幕分辨率,完成安裝增強功能。

2.3、安裝OpenJDK

從Android 5.0 開始,使用OpenJDK編譯源碼。

Android 版本 JDK 備註
Android 5.x ~ Android 6.x OPenJDK 7
Android 7.x ~ Android 10.0 OPenJDK 8

根據提示,無需另行安裝OpenJDK,那麼跳過此步驟。

路徑:https://source.android.google.cn/setup/build/requirements

AOSP 中的 Android master 分支帶有預編譯版本的 OpenJDK;因此無需另行安裝。

舊版 Android 需要單獨安裝 JDK。在 Ubuntu 上,請使用 OpenJDK。

2.4、更改鏡像源

(1)先執行以下命令:

lsb_release -c
sudo cp -v /etc/apt/sources.list /etc/apt/sources.list.backup
sudo chmod 777 /etc/apt/sources.list
sudo gedit /etc/apt/sources.list
#vim /etc/apt/sources.list

(2)更改鏡像源
國內有很多鏡像源,比如有清華源和阿里雲源等,選擇其中一個就可以了。
筆者選擇了阿里雲源。

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

(3)修改完軟件源後,更新軟件列表和軟件

sudo apt update
sudo apt upgrade

# 更新有失敗項的話,執行下面語句以後重複上面兩句命令
# sudo apt-get update
# sudo apt update
# sudo apt upgrade

2.5、Ubuntu系統工具包更新升級

路徑:https://source.android.google.cn/setup/build/initializing
標題:安裝所需的軟件包 (Ubuntu 14.04)

$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip

因爲網絡異常或者其他異常,這次工具包一次不能下載或者更新。
可以重複執行幾次,直到控制檯提示均已經安裝或者更新完畢。

3、Android 源代碼下載及編譯過程

3.1 、源代碼下載

3.1.1 、安裝python

由於repo腳本是Android項目編寫的Python腳本,用來統一管理Android項目的代碼倉庫,
所以首先要確保安裝了Python 2.7。

$ python
---
Command 'python' not found, did you mean:

  command 'python3' from deb python3
  command 'python' from deb python-is-python3
---
$ sudo apt-get install python
$ python
---
Python 2.7.18rc1 (default, Apr  7 2020, 12:05:55) 
[GCC 9.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
---

3.1.2 、安裝 Repo

Repo 是一款工具,可讓您在 Android 環境中更輕鬆地使用 Git。

  • 確保您的主目錄中有一個 bin/ 目錄,並且它包含在您的路徑中:
	mkdir ~/bin
	vim ~/.bashrc
	# 在文件的最後添加下面一行代碼,保存退出
	PATH=~/bin:$PATH 
	# 生效修改
	source ~/.bashrc
  • 下載 Repo 啓動器,並確保它可執行:
	curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
	# curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
	# export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
	chmod a+x ~/bin/repo

3.1.3、工作目錄設置

創建一個空目錄來存放您的工作文件。
爲其提供一個您喜歡的任意名稱:

    mkdir WORKING_DIRECTORY # mkdir -p aosp/Android10
    cd WORKING_DIRECTORY # cd aosp/Android10

3.1.4、配置git個人信息

配置git賬戶信息,用於提交代碼到Gerrit上,進行代碼審查。

    git config --global user.name "Your Name"
    git config --global user.email "[email protected]"
    
    // 查看配置的git信息
    cat ~/.gitconfig
    ---
	[user]
		name = Your Name
		email = [email protected]
    ---

3.1.5、獲取源碼分支

運行 repo init 以獲取最新版本的 Repo 及其最新的問題修復。您必須爲清單指定一個網址,該清單用於指定 Android 源代碼中包含的各個代碼庫將位於工作目錄中的什麼位置。

    repo init -u https://android.googlesource.com/platform/manifest
    # repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

路徑:https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds

Build 標記 版本 支持的設備 安全補丁程序級別
QQ2A.200501.001.B3 android-10.0.0_r36 Android10 Pixel 2、Pixel 2 XL 2020-05-05
6440158 android-9.0.0_r56 Pie 2018-08-05

要檢出 master 之外的其他分支,請使用 -b 指定此分支。

    repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r36 
    # repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-10.0.0_r36

同步源代碼:

repo sync -jx(x一般是CPU核心的2倍爲佳)
# 支持續傳
repo sync

3.1.6、常見問題

(1)虛擬機存儲不足
關閉當前虛擬機,回到VirtualBox管理頁面。這種調整方案將會導致一直黑屏啓動不了。
這種設置只有在虛擬機創建完成後,操作系統還沒有安裝的情況下調整的。
只有在設置動態存儲空間的時候設置一個足夠的虛擬空間是必要的,要千萬注意。

介質(M)–> 屬性(P)
     --> 虛擬機文件選擇 --> 屬性(P)
     --> 拖動滑塊,調整大小

3.2 、編譯源代碼

源代碼下載完成以後,就可以開始編譯源代碼。

  • 整體編譯:初次編譯的時候,需要整體編譯。初次編譯時間較長,筆者是編譯了一下午。
  • 模塊編譯:局部修改的時候,只需要編譯當前模塊就可以了。

3.2.1、整體編譯

make:不帶任何參數,用於編譯整個系統,編譯時間比較長,除非是進行初次編譯否則不建議此種做法。

$ cd ~/aosp/Android10
$ source build/envsetup.sh(或者 . build/envsetup.sh)
$ lunch
...
Which would you like? (輸入編譯的產品名字或者輸入前面的數字)
$ make -jx(x爲CPU核心的2倍爲佳)

3.2.2、模塊編譯

模塊編譯分三種:make、mmm、mm
導入編譯環境:

	cd ~/aosp/Android10
	source build/envsetup.sh
  • make module name:只知道目標模塊的名稱,則可以在代碼根目錄下執行 “make 模塊名 ”的方式編譯目標模塊。
	make SystemUI
  • mmm module path:該命令編譯指定目錄下的目標模塊,而不編譯它所依賴其他模塊。
	mmm frameworks\base\packages\SystemUI
  • mm: 進入對應的應用模塊代碼所在目錄執行mm命令,mm和mmm編譯的速度都很快。
	cd frameworks\base\packages\SystemUI
	mm

以上三個命令都可以用-B選項來重新編譯所有目標文件。

雖然從編譯速度上mmm,mm都差不多,因爲mmm不涉及目錄的切換,
所以建議使用 “make 模塊名” 的方式分模塊編譯。

4、參考文獻

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