0%

[Android] Ubuntu20.04編譯Android7.1

手把手 AOSP 編譯入門

設置編譯環境

1.安装 JDK

輸入以下指令,參考https://source.android.com/setup/build/older-versions#for-ubuntu-15-04

1
2
sudo apt-get update
sudo apt-get install openjdk-8-jdk

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
2
sudo apt-get install python2
sudo ln -s /usr/bin/python2 /usr/bin/python

下載 AOSP

1.安裝 Repo

參考https://source.android.com/setup/develop#installing-repo

1
2
3
mkdir ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

2.初始化 Repo

參考https://source.android.com/setup/build/downloading#initializing-a-repo-client

1
2
3
4
5
6
7
# 建立資料夾,名稱自定,這裡命名為android
mkdir android
cd android

# 設置git的使用者名稱和email
git config --global user.name $your_name
git config --global user.email $your_email

選定 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
2
python3 ~/bin/repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.0_r7
python3 ~/bin/repo sync

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
2
3
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves

重啟 jack 服務

1
2
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-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
2
3
4
5
sudo vim ~/.bash_profile
# 最後一行加上
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
# 儲存並離開後
source ~/.bash_profile

重啟 jack 服務

1
2
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server

運行模擬器

1
emulator

成功!

安裝 KVM

參考https://developer.android.com/studio/run/emulator-acceleration#vm-linux-check-kvm

輸入以下指令查看 CPU 是否支持硬體虛擬化,如果輸出結果大於 0 表示支持;如果為 0,則先去 BIOS 將功能打開,例如 ASUS 主機板選項為 Intel 虛擬化技術。

1
2
3
# 安裝cpu-checker
sudo apt-get install cpu-checker
egrep -c '(vmx|svm)' /proc/cpuinfo

輸入以下指令查看 KVM 狀態

1
2
3
4
5
6
7
sudo kvm-ok
# 成功
INFO: /dev/kvm exists
KVM acceleration can be used
# 失敗
INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used

若結果為成功,接著輸入以下指令安裝 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
2
3
4
# 重置異動
python3 ~/bin/repo forall -vc "git reset --hard"
# 檢查異動
python3 ~/bin/repo status

參考資料

  1. ubuntu 20.04 运行 repo init 提示 /usr/bin/env: ‘python’: No such file or directory 解决方案
  2. Ubuntu18.04 编译 Android 源码报[run_soong_ui] Error 1 错误
  3. Android FrameWork 学习(一)Android 7.0 系统源码下载\编译
  4. KVM/Installation
  5. 如何在 Ubuntu 18.04 中安裝 KVM 和管理虛擬機