創建區分大小寫的磁盤映像
Mac系統默認磁盤,文件系統運行不區分大小寫。Git 並不支持此類文件系統,而且此類文件系統會導致某些 Git 命令(例如 git status)的行爲出現異常。因此,建議始終在區分大小寫的文件系統中對 AOSP 源文件進行操作。
有兩種方式可以創建磁盤映像,具體操作如下:
由於AOSP比較大,但是我們存放在移動硬盤上,更大的空間能夠更好地滿足未來的需求,所以預留200G+的空間。
可以通過 shell 使用以下命令創建磁盤映像:
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 220g /Volumes/zza/aosp/android.dmg
在雙擊這個鏡像,將其掛載。這樣在Mac Finder中就可以看到我們剛剛的創建的鏡像了。
Android源碼下載更新
Android 源代碼樹位於由 Google 託管的 Git 代碼庫中。Git 代碼庫中包含 Android 源代碼的元數據,其中包括與對源代碼進行的更改以及更改日期相關的元數據。下面介紹瞭如何下載特定 Android 代碼流水線的源代碼樹。
安裝 Repo
Repo 是一款工具,可讓您在 Android 環境中更輕鬆地使用 Git。要安裝 Repo,請執行以下操作:
mkdir ~/bin # 創建文件夾
PATH=~/bin:$PATH #設置環境變量
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo #下載repro 到/bin/repo文件裏
chmod a+x ~/bin/repo # 給repo 文件權限
更新 Repo
repo的運行過程中會嘗試訪問官方的git源更新自己,如果想使用tuna的鏡像源進行更新,可以將如下內容複製到你的~/.bashrc
裏
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
並 source ~/.bashrc
。
替換國內清華的鏡像
用第三方工具打開repo文件,替換國內清華的鏡像
將 https://android.googlesource.com/
全部使用 https://aosp.tuna.tsinghua.edu.cn/
代替即可。
由於使用 HTTPS 協議更安全,並且更便於靈活處理,所以強烈推薦使用 HTTPS 協議同步 AOSP 鏡像。
由於 AOSP 鏡像造成CPU/內存負載過重,限制了併發數量,因此建議:
- sync的時候併發數不宜太高,否則會出現 503 錯誤,即
-j
後面的數字不能太大,建議選擇4。 - 請儘量選擇流量較小時錯峯同步。
使用每月更新的初始化包(使用該方法)
由於首次同步需要下載約 30GB 數據,過程中任何網絡故障都可能造成同步失敗,強烈建議使用初始化包進行初始化。
下載 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar (可以使用三方工具下載,支持斷點續傳),下載完成後記得根據 checksum.txt 的內容校驗一下。
由於所有代碼都是從隱藏的 .repo
目錄中 checkout 出來的,所以我們只保留了 .repo
目錄,下載後解壓 再 repo sync
一遍即可得到完整的目錄。
使用方法如下:
wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下載初始化包
tar xf aosp-latest.tar
cd AOSP # 解壓得到的 AOSP 工程目錄
# 這時 ls 的話什麼也看不到,因爲只有一個隱藏的 .repo 目錄 ,可以使用ls -al
repo sync # 正常同步一遍即可得到完整目錄
# 或 repo sync -l 僅checkout代碼
此後,每次只需運行 repo sync
即可保持同步。
可以選擇該命令同時發起四個併發請求,之所以選擇4是因爲清華的鏡像的併發請求的限制的上限就是4個。
repo sync -j4
注意:出現奇奇怪怪得bug,可以重複執行一下,很多bug是由網絡原因造成的。
一定要確保文件都下載成功,否則編譯時會出現一些問題。
也可以寫個腳本,自動執行
#!/bin/bash repo sync -j4 while [ $? = 1 ]; do echo "================sync failed, re-sync again =====" sleep 3 repo sync done
傳統初始化方法(不推薦)
建立工作目錄:
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY
初始化倉庫:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
如果提示無法連接到 gerrit.googlesource.com,請參照“更新 Repo”。
同步源碼樹(以後只需執行這條命令來同步):
repo sync
切換版本
如果需要某個特定的 Android 版本:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-10.0.0_r30
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
默認是master,是android11版,我選擇了Android10。我使用Android11
Android 編譯
設置文件描述符限制
在macOS中,默認限制的同時打開的文件數量很少,不能滿足編譯過程中的高併發需要,因此需要在shell中運行命令:
$ ulimit -S -n 2048
環境設置
在源碼根目錄下調用下面的命令:
$ source build/envsetup.sh
選擇設備
在命令行輸入下面的命令選擇打算編譯的源碼類型
$ lunch
You're building on Darwin
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. full_fugu-userdebug
8. aosp_fugu-userdebug
9. mini_emulator_arm64-userdebug
10. m_e_arm-userdebug
11. m_e_mips-userdebug
12. m_e_mips64-eng
13. mini_emulator_x86-userdebug
14. mini_emulator_x86_64-userdebug
15. aosp_dragon-userdebug
16. aosp_dragon-eng
17. aosp_marlin-userdebug
18. aosp_sailfish-userdebug
19. aosp_flounder-userdebug
20. aosp_angler-userdebug
21. aosp_bullhead-userdebug
22. hikey-userdebug
23. aosp_shamu-userdebug
Which would you like? [aosp_arm-eng]
根據後綴可以判斷出使用的場景如下:
類型 | 用途 |
---|---|
user | 權限少,用於刷機使用 |
userdebug | 和“user”類似,但可以root,並且可以調試 |
eng | 具有開發配置,並且有額外的調試工具 |
根據需要選擇對應的類型,比如我選擇arm “1”。(推薦採用x86的,模擬器速度快一些)
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=10
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_OS=darwin
HOST_OS_EXTRA=Darwin-17.7.0-x86_64-10.13.6
HOST_BUILD_TYPE=release
BUILD_ID=QQ2A.200305.002
OUT_DIR=out
============================================
開始編譯
爲了加快編譯的速度,最好併發來編譯
$ make -j4
我的機器比較老,2線程,所以採用了-j4。
編譯結束以後,會顯示下面的日誌:
#### build completed successfully (11:16:35 (hh:mm:ss)) ####
啓動模擬器
emulator
Android Studio查看源碼
編譯源碼idegen模塊
mmm development/tools/idegen/
這行命令的意思是編譯idegen這個模塊項目,然後生成idegen.jar文件。
編譯結束以後,會顯示下面的日誌:
#### build completed successfully (27:28 (mm:ss)) ####
mmm指令就是用來編譯指定目錄。通常來說,每個目錄只包含一個模塊。
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
生成AS配置文件
接着執行如下腳本:
development/tools/idegen/idegen.sh
這行命令的意思是在根目錄生成對應的android.ipr、android.iml IEDA工程配置文件。
等待片刻得到類似如下信息說明OK:
Read excludes: 217ms
Traversed tree: 3605277ms
推薦採用x86的,模擬器速度快一些。我這個機器啓動arm架構的模擬器花費很長時間。
導入源碼
啓動Android Studio,然後選擇打開一個已存在的Android Studio工程,選擇源碼根目錄的android.ipr
,經過的加載過程以後,Android 源碼就已經成功的加載到了Android Studio中。
OK,至此我們就完成了在macOS上下載AOSP並編譯導入Android Studio的完整過程。
參考:
1.https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
2.https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/
3.https://blog.csdn.net/YuDBL/article/details/86129195
4.https://blog.csdn.net/YuDBL/article/details/86496890
歡迎關注我的公衆號,持續分析優質技術文章