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,那硬碟空間就要更多才行。
  1. 安裝套件
    $ 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
    
  2. 安裝JDK 根據要編譯的AOSP版本不同,所需要的JDK版本也要跟著變換。 這篇以編譯Android 7.0以上的系統作為範例,因此需要安裝openJDK 8。
    $ sudo apt install openjdk-8-jdk


下載AOSP源始碼

  1. 初始化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
    
  2. 設定git
    $ git config --global user.name "Your Name"
    $ git config --global user.email "you@example.com"
    
  3. 選擇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
    
  4. 開始下載 下載時間取決於你的網路速度,但都需要好幾個小時(´_ゝ`)
    $ repo sync

下載Driver

如果要將AOSP系統flash到實體手機上,需要下載對應的driver作安裝(Driver),不安裝的話也可以flash上實體手機,只是會無法偵測到SIM卡。 本篇測試手機為Nexus 5X,AOSP版本為android-7.1.1_r24,所以要下載這個Driver

編譯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系統,其中jN,N代表要使用多少個CPU核心作編譯。
$ make -j4

Clean Build

在某些情況下你可能會需要 Clean Build(我由衷的希望各位不會有這個需要!),如果有這個需要請在設定好的開發環境上輸入以下指令:
$ make clobber
$ make -j4
這個指令會將之前編譯過的東西都清掉,清完後再重新編譯即可

啟動 Emulator

編譯完成後會開到像是 "Build Succeed" 的字樣,這時後只要再輸入就可以打開 Emulator(模擬器)了
$ emulator
如果找不到 emulator 命令
$ emulator
emulator: command not found
請先執行以下命令再執行 emulator 命令
$ set_stuff_for_environment
$ emulator
錯誤解決方法
  1. 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
    
  2. 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
  1. fastboot
    將bootloader解鎖後回到fastboot模式。
    $ adb reboot bootloader
    
  2. 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  )

留言

這個網誌中的熱門文章

python serial 模組使用方法 #1

USB HID 教學 #1(轉載)

USB HID 教學 #2 (轉載)