AOSP Source code download and compiler
#AOSP(Android Open Source Project)
AOSP(Android Open Source Project)是由Google推出的Android系統原始碼,從官網下載原始碼編譯後的Android系統可以安裝到Nexus系列的手機,雖然官網有建立環境跟編譯的說明,但資料比較分散,因此這篇就來整理一下,順便作個記錄。#Ubuntu 18.04環境建置
由於整個原始碼非常龐大,加上編譯之後資料夾大小會超過100GB,因此如果使用虛擬主機的話盡量將硬碟空間超過200GB比較保險,假如要編譯多個不同版本的AOSP,那硬碟空間就要更多才行。
- 安裝套件
$ sudo apt update $ sudo apt install git 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
- 安裝JDK 根據要編譯的AOSP版本不同,所需要的JDK版本也要跟著變換。 這篇以編譯Android 7.0以上的系統作為範例,因此需要安裝openJDK 8。
$ sudo apt install openjdk-8-jdk
- Android 7.0 (Nougat) - Android 8.0 (Oreo): Ubuntu - OpenJDK 8, Mac OS - jdk 8u45 or newer
- Android 5.x (Lollipop) - Android 6.0 (Marshmallow): Ubuntu - OpenJDK 7, Mac OS - jdk-7u71-macosx-x64.dmg
- Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat): Ubuntu - Java JDK 6, Mac OS - Java JDK 6
- Android 1.5 (Cupcake) - Android 2.2.x (Froyo): Ubuntu - Java JDK 5
下載AOSP源始碼
- 初始化repo
$ mkdir ~/bin $ echo 'export PATH=~/bin:$PATH' >> ~/.bashrc $ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo
- 設定git
$ git config --global user.name "Your Name" $ git config --global user.email "you@example.com"
- 選擇AOSP版本到 Source Code Tags and Builds 選擇要下載的AOSP版本,測試手機是Nexus 5X,版本為7.1.1,所以選擇android-7.1.1_r24來編譯。
$ mkdir android-7.1.1_r24 $ cd android-7.1.1_r24 $ repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r24
- 開始下載 下載時間取決於你的網路速度,但都需要好幾個小時(´_ゝ`)
$ repo sync
編譯AOSP
開始編譯之前要選擇你的 device Code Name ,如Nexus 5X的Code Name為
bullhead
。 AOSP系統可選擇三種系統格式,分別是user、userdebug及eng,詳細可以參考 Target。$ cd android-7.1.1_r24
$ source build/envsetup.sh
$ lunch aosp_bullhead-user
$ lunch
You're building on Linux
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. aosp_deb-userdebug
8. aosp_flo-userdebug
9. full_fugu-userdebug
10. aosp_fugu-userdebug
11. mini_emulator_arm64-userdebug
12. m_e_arm-userdebug
13. mini_emulator_mips-userdebug
14. mini_emulator_x86_64-userdebug
15. mini_emulator_x86-userdebug
16. aosp_flounder-userdebug
17. aosp_angler-userdebug
18. aosp_bullhead-userdebug
19. aosp_hammerhead-userdebug
20. aosp_hammerhead_fp-userdebug
21. aosp_shamu-userdebug
Which would you like? [aosp_arm-eng]
這邊我推薦使用
aosp_x86_64-eng
(模擬器開發)或者是 aosp_hammerhead-userdebug
(Nexus 5 實機開發)三種 Build Type 的差別
Build Type | 說明 |
---|---|
user | 正式的產品會用這個 Build Type,也因為是正式產品要用的所以權限上有限制(不能 root 之類的) |
userdebug | 同 user,但將權限全開。做產品時推薦的 Build Type |
eng | 開發用的 Build Type,有追加許多不存在於 userdebug 版本中的除錯工具。我們主要是要研究所以就用這個 |
顯然的,因為我們是要開發和研究 AOSP,所以就選 userdebug 或 eng,而 Linux 上因為 HAXM 支援度問題,建議使用 Nexus 5 實機開發
aosp_hammerhead-userdebug
以上設定完沒有出錯就可以開始編譯AOSP系統,其中j
N
,N代表要使用多少個CPU核心作編譯。$ make -j4
Clean Build
在某些情況下你可能會需要 Clean Build(我由衷的希望各位不會有這個需要!),如果有這個需要請在設定好的開發環境上輸入以下指令:
$ make clobber
$ make -j4
這個指令會將之前編譯過的東西都清掉,清完後再重新編譯即可
$ make clobber
$ make -j4
啟動 Emulator
編譯完成後會開到像是 "Build Succeed" 的字樣,這時後只要再輸入就可以打開 Emulator(模擬器)了
$ emulator
如果找不到 emulator 命令
$ emulator
emulator: command not found
請先執行以下命令再執行 emulator 命令
$ set_stuff_for_environment
$ emulator
$ emulator
$ emulator
emulator: command not found
$ set_stuff_for_environment
$ emulator
錯誤解決方法
- LC_ALL
FAILED: out/target/product/fugu/obj/STATIC_LIBRARIES/libedify_intermediates/lexer.cpp /bin/bash -c “prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/target/product/fugu/obj/STATIC_LIBRARIES/libedify_intermediates/lexer.cpp bootable/recovery/edify/lexer.ll” flex-2.5.39: loadlocale.c:130:_nl_intern_locale_data: ?? ‘cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ ??? Aborted (core dumped) [ 6% 3452/56388] //frameworks/base/libs/androidfw:libandroidfw clang ResourceTypes.cpp [linux] ninja: build stopped: subcommand failed. 09:56:41 ninja failed with: exit status 1
去除所有本地化的設定,讓指令能正確執行:$ export LC_ALL=C
- jack-server
[ 45% 16221/35670] Building with Jack:...k_intermediates/with-local/classes.dex FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@google.com)). GC overhead limit exceeded. Try increasing heap size with java option '-Xmx'. Warning: This may have produced partial or corrupted output. [ 45% 16221/35670] Building with Jack:...colorpicker_intermediates/classes.jack ninja: build stopped: subcommand failed. build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed make: *** [ninja_wrapper] Error 1 #### make failed to build some targets (01:26:54 (hh:mm:ss)) ####
修改~/.jack-settings
,新增一行下列的指令JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
接著重啟jack-server$ prebuilts/sdk/tools/jack-admin kill-server $ prebuilts/sdk/tools/jack-admin start-server
Flashing a device
在重新flash Android系統前需要將手機的bootloader解鎖,可以參考 Unlocking the bootloader。
- fastboot將bootloader解鎖後回到fastboot模式。
$ adb reboot bootloader
- flash AOSP
$ fastboot flashall -w
最後重開機進Android畫面就代表成功更換成AOSP系統了!
疑難排解
我無論如何都無法編譯!快救救我!
由於每個人下載時間不同,拿到的AOSP原始碼可能會有點差異(因為我們都是拿最新的程式碼,Android的更新速度也很快,基本上不同天下載拿到的程式碼就不一樣了)。萬一不幸發生你拿到的程式碼完全編譯不過的事情,那麼可以使用別人確定能編譯的原始碼版本。請參考附錄:終端機工具及指令並在本章節資料夾內找一個喜歡的manifest使用。
fingerprint
error: ro.build.fingerprint cannot exceed 91 bytes: Android/mini_emulator_x86_64/mini-emulator-x86_64:6.0.1/MASTER/cha12208042258:userdebug/test-keys (97)
CURL
Unsupported curl, please use a curl not based on SecureTransport
jack-server 無法啟動
#執行途中如果顯示jack-server start failed,請依以下指令移除後重新安裝。
$ cd [path/to/aosp/root]
$ jack-admin kill-server
$ jack-admin uninstall-server
$ cd prebuilts/sdk/tools
$ jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar
#請先下ls確定jack-server-[version].jar檔案名稱
java 版本不符合
如果同時安裝OpenJDK或OracleJDK多個版本,請執行以下指令並選擇正確版本的JDK路徑
$ sudo update-alternatives --config javac
$ sudo update-alternatives --config java
$ sudo update-alternatives --config keytool
如果仍然出現版本不符,請移除其他JDK版本的套件
資料來源
https://tabacowang.me/2019/04/18/build-aosp-on-ubuntu/[Day11] 什麼是AOSP?我應該學習嗎?
https://github.com/TADSG/aosp-study/tree/master/ch3_build#ubuntu1404( https://ithelp.ithome.com.tw/articles/10200897 )
留言
張貼留言