手把手 AOSP 編譯入門
設置編譯環境
1.安装 JDK
輸入以下指令,參考https://source.android.com/setup/build/older-versions#for-ubuntu-15-04
1 | sudo apt-get update |
2.安裝工具包
輸入以下指令,參考https://source.android.com/setup/build/initializing#installing-required-packages-ubuntu-1804
1 | sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig |
3.安裝 python2
Ubuntu20.04 沒有 python2,若直接編譯會出現該錯誤。
1 | /usr/bin/env: 'python': No such file or directory |
輸入以下指令
1 | sudo apt-get install python2 |
下載 AOSP
1.安裝 Repo
參考https://source.android.com/setup/develop#installing-repo
1 | mkdir ~/bin |
2.初始化 Repo
參考https://source.android.com/setup/build/downloading#initializing-a-repo-client
1 | 建立資料夾,名稱自定,這裡命名為android |
選定 AOSP 版本和分支,如下圖這裡選擇的是 android-7.1.0_r7,參考https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds
Repo 要用 python3 運行,但編譯時還是需要用到 python2,因此透過 python3 去呼叫 repo 較合適。
sync 同步到本地,過程需要一些時間。
1 | python3 ~/bin/repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.0_r7 |
3.(可選) 清空輸出資料夾
清空 out 目錄
1 | m clean |
編譯 AOSP
1.初始化相關指令
每次重開指令視窗都要先呼叫,否則會找不到指令 m 和 emulator。
1 | source build/envsetup.sh |
2.選擇編譯目標
參考https://source.android.com/setup/build/building#choose-a-target
1 | lunch aosp_arm-eng |
3.開始編譯
使用 m -jN 指令來編譯,此處的 N 一般建議設置為 cpu 核心數的 1-2 倍,參考https://source.android.com/setup/build/building#build-the-code
1 | m -j8 |
在編譯期間,將防毒軟體關閉,可以增進檔案系統的效能。
4.錯誤處理
報錯: FAILED: /bin/bash -c “prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll”
編譯前執行
1 | export LC_ALL=C |
報錯: SSL error when connecting to the Jack server. Try ‘jack-diagnose’
修改/etc/java-8-openjdk/security/java.security,找到 jdk.tls.disabledAlgorithms,取消 TLSv1, TLSv1.1
1 | jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \ |
重啟 jack 服務
1 | ./prebuilts/sdk/tools/jack-admin kill-server |
報錯: GC overhead limit exceeded. Try increasing heap size with java option ‘-Xmx‘.
運行 jack-server 編譯 AOSP 需要 3G 的記憶體配置,若電腦總記憶體小於 16G,會產生該錯誤,可使用以下指令查看可配置的記憶體大小。
1 | java -XshowSettings 2>&1 | grep Heap |
例如在總記憶體 8G 的電腦輸出結果為 1.77G,參考https://2net.co.uk/blog/jack-server.html
1 | sudo vim ~/.bash_profile |
重啟 jack 服務
1 | ./prebuilts/sdk/tools/jack-admin kill-server |
運行模擬器
1 | emulator |
成功!
安裝 KVM
參考https://developer.android.com/studio/run/emulator-acceleration#vm-linux-check-kvm
輸入以下指令查看 CPU 是否支持硬體虛擬化,如果輸出結果大於 0 表示支持;如果為 0,則先去 BIOS 將功能打開,例如 ASUS 主機板選項為 Intel 虛擬化技術。
1 | 安裝cpu-checker |
輸入以下指令查看 KVM 狀態
1 | sudo kvm-ok |
若結果為成功,接著輸入以下指令安裝 KVM
1 | sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils |
(可選) 重置 AOSP 異動
參考https://stackoverflow.com/questions/5012163/how-to-discard-changes-using-repo
1 | 重置異動 |
參考資料