지난 Post 에서 Android 10 (Q-OS) 소스를 다운로드하는 방법과 명령어를 설명하였다. 구글은 Ubuntu 14.04 64bit 환경을 기준으로 설명하고 있어, 최신 Ubuntu 20.04 64bit (8GB RAM)에서도 ASOP 가 빌드 가능한지 확인하고자 한다. 결과적으로 몇가지 에러만 수정하면 Ubuntu 20.04 (8 GB RAM)에서도 Andorid 10 빌드가 가능하다.
요약:
- Ubuntu 20.04 에서 Android 10 (Q-SO) 빌드가 가능하다. 추가 Lib 설치 및 16G 이상 RAM 확보가 필수
- 빌드를 원하는 Tag 정보 및 Device Name 정보은 Google 사이트 및 소스에서 확인 후 빌드
- Android NDK 와 PDK 사용해서 개발하는 경우 AOSP 빌드가 필요하다.
※ 이전 블로그:
[모바일/Android] - Android 소스 최적화 (100GB에서 65GB로 줄이기)
[모바일/Android] - Android 10 (Q-OS) 소스 다운로드
# 최신의 repo 소스 다운로드
# Q-OS 최신 branch로 checkout
# https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds
$ repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r36
# 소스 다운로드
$ repo sync -j4 --no-tags
# checkout branch
repo start android-10.0.0_r36 --all
1. lunch aosp_taimen-userdebug
Android 10 소스를 다운로드한 폴더(/aops)로 이동해서 build/envsetup.sh 와 빌드하고자 하는 target device 와 release 옵션으로 lunch 옵션을 설정해야 한다. AOSP Tag 정보는 source.android.com/setup/start/build-numbers#source-code-tags-and-builds 에서 확인할 수 있고, 가장 최신 tag인 android-10.0.0_r36 로 설정하였다.
Target Device Name 은 https://source.android.google.cn/setup/build/running?hl=ko 에서 선택할 수 있다. android-10.0.0_r36 tag에 해당하는 단말은 Pixel2 와 Pixel 2XL 이다. Pixel 2XL 의 빌드 ID인 asop_taimen 와, 개발용으로 루팅이 가능한 userdebug 를 선택하여 aosp_taimen-userdebug 로 lunch 한다.
#cd <android folder>
$ cd asop
# build env setup
$ . build/envsetup.sh
# lunch device-release_option
$ lunch aosp_taimen-userdebug
# make -j (multi thread option)
$ m -j16
ASOP Google Device Name:
소스 코드 상에서는 android/device/google 하위에 device 가 구성되어 있다. Android 10 은 taimen, wahoo, marlin, coral 등의 product 가 소스에 포함되어 있다. device/google/taimen/AndroidProducts.mk 을 열어보면 COMMON_LUNCH_CHOICES 가 lunch의 해당 product의 이름이다.
$ vi device/google/taimen/AndroidProducts.mk
# AndroidProducts.mk 의 내용
COMMON_LUNCH_CHOICES := \
aosp_taimen-userdebug
2. 빌드 환경 구성
Google에서 가이드하는 빌드 환경 구성은 https://source.android.google.cn/setup/build/initializing?hl=ko 에 Ubuntu 14.04 64bit 기준으로 소개되어 있다. 우분투 기본 설치 lib 이외에 안드로이드 빌드에 필요한 lib를 설치하는 것으로 Ubuntu 20.04 에도 그대로 설치한다.
$ sudo apt-get install 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
3. 빌드 시작 ( m -j16)
빌드는 make 명령이나 짧게는 m 명령어를 사용한다. 빌드 속도를 향상하기 위해서 -j 옵션을 사용 할 수 있고 일반적으로 CPU개수×1.5가 적당하다.
빌드 에러 #1: 메모리 부족 (원인을 몰라 수정에 오래 걸림)
1) 에러 메시지: ninja killed message 출력
make: *** [out/build-aosp_arm.ninja] Killed
2) 해결: 현재 8RAM + 2GB Swap 상태에서 8GM RAM + 12GB Swap 로 늘림, Swap을 늘리는 방법은 이전 게시물(링크 )에 정리하였다. Android의 시스템 requirement를 보면 Swap 포함하여 16GB 이상이니 안전하게 20 GB 로 설정한다.
* 우분투 Swap 늘리는 방법:
[개발환경] - [Tips] Ubuntu 20.04 에서 swap file 늘리기
빌드 에러 #2 (libncurses.so.5 로딩 실패)
1) 에러 메시지: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
/bin/bash -c "PWD=/proc/self/cwd prebuilts/clang/host/linux-x86/clang-3289846/bin/clang -Iframeworks/rs/script_api/include -Iexternal/clang/lib/Headers -MD -DRS_VERSION=24 -std=c99 -c -O3 -fno-builtin -emit-llvm -target renderscript64-linux-android -fsigned-char -Wno-deprecated -Werror -Werror -Wall -Wextra -Iframeworks/rs/cpu_ref -DRS_DECLARE_EXPIRED_APIS -DARCH_ARM64_HAVE_NEON -x renderscript frameworks/rs/driver/runtime/rs_f16_math.c -o out/target/product/taimen/obj/RENDERSCRIPT_BITCODE/libclcore.bc_intermediates/rs_f16_math.bc"
prebuilts/clang/host/linux-x86/clang-3289846/bin/clang.real: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
18:50:43 ninja failed with: exit status 1
2) 해결: libncurses5 추가 설치 (32bit 버전은 필요 없으나 혹시 몰라서 설치함)
$ sudo apt install libncurses5
$ sudo apt install libncurses5:i386
빌드 에러 #3: Java VM Heap 부족
1) 에러 메시지 : Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
FAILED: //frameworks/base:api-stubs-docs Metalava [common]
Outputs: out/soong/.intermediates/frameworks/base/api-stubs-docs/android_common/api-stubs-docs-stubs.srcjar out/soong/.intermediates/frameworks/base/api-stubs-docs/android_common/api-stubs-
(중략)
Error: exited with code: 1
Command: rm -rf "out/soong/.intermediates/frameworks/base/api-stubs-docs/android_common/out" "out/soong/.intermediates/frameworks/base/api-stubs-docs/android_common/srcjars" "out/soong/.intermediates/frameworks/base/api-stubs-docs/android_common/stubsDir" && mkdir -p "out/soong/.intermediates/frameworks/base/api-stubs-docs/android_common/out" (중략)
Output:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.intellij.psi.impl.source.CharTableImpl.createSequence(CharTableImpl.java:88)
at com.intellij.psi.impl.source.CharTableImpl.intern(CharTableImpl.java:72)
at com.intellij.lang.impl.PsiBuilderImpl.createLeaf(PsiBuilderImpl.java:1697)
at com.intellij.lang.impl.PsiBuilderImpl.collapseLeaves(PsiBuilderImpl.java:1246)
at com.intellij.lang.impl.PsiBuilderImpl.bind(PsiBuilderImpl.java:1206)
at com.intellij.lang.impl.PsiBuilderImpl.buildTree(PsiBuilderImpl.java:913)
(생략)
2) 해결
api-stub-docs 의 Java 실행 시 HeapSize 에 대한 명시적 선언없이 default 값으로 사용된다. JDK 9 의 Java Heap Size의 default는 2GB 로 설정되어 있고, 이를 4GB를 늘려서 수정하였다. exort 명령어를 사용하기 때문에 BASH 셜이 변경되면 다시 export _JAVA_OPTIONS=-Xmx4g 을 설정해야 한다. Java Heap size는 $ ./prebuilts/jdk/jdk9/linux-x86/bin/java -XX:+PrintFlagsFinal -version | grep 'HeapSize'로 확인할 수 있다. java Max Heap은 실제 메모리은 1/4 로 설정된다.
# java heap size를 2G→4G로 늘림
$ export _JAVA_OPTIONS=-Xmx4g
4. 빌드 성공
몇 일간의 노력 끝에 드디어 빌드 성공하였다. 빌드 결과 파일은 /out 에 저장되고 boot.img, system.img, system_other.img, user_data.img, vbmeta.img 가 생성된다.
<관련글>
[개발환경] [Tips] Ubuntu 20.04 에서 swap file 늘리기
[개발환경] 9. git 사용하기 #1 (부제: GitHub)
[개발환경] - 3. Ubuntu 에서 개발 Tool 설치
[모바일/Android] - Android 11 (R-OS) Emulator에 설치하기
[모바일/Android] - Android 11 변경 기능 소개
[모바일/Android] - Ubuntu 20.04 에서 Android 10 빌드하기
[모바일/Android] - Android Studio 4.0 사용하기
댓글