본문 바로가기
SW 개발/Android

Ubuntu에서 Android 10 빌드하기

by 모바일 SW 개발자 Kibua20 2020. 6. 4.
반응형

지난 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

 

 

AOSP Device Name List

 

 

소스 코드 상에서는 android/device/google 하위에 device 가 구성되어 있다. Android 10 은 taimen, wahoo, marlin, coral 등의 product 가 소스에 포함되어 있다.   device/google/taimen/AndroidProducts.mk​ 을 열어보면 COMMON_LUNCH_CHOICES 가 lunch의 해당 product의 이름이다.

 

 

 

Android 10 의 Device  list

 

 

$ 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가 적당하다.

 

 

 

Android Q-OS 빌드

 

 

 

빌드 에러  #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를 2G4G로 늘림
$ export _JAVA_OPTIONS=-Xmx4g​

 

 

 

Android Q-OS JDK 의 Java Heap size

 

4. 빌드 성공

몇 일간의 노력 끝에 드디어 빌드 성공하였다.   빌드 결과 파일은 /out 에 저장되고  boot.img, system.img, system_other.img, user_data.img, vbmeta.img 가 생성된다. 

 

 

Ubuntu 20.04 에서 Androiid 10 빌드 성공
/out 폴더 생성된 AOSP 빌드 결과 이미지

 

 

 

<관련글>

[개발환경] [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 사용하기

[모바일/Android] - Android 10 (Q-OS) 소스 다운로드

[모바일/Android] - Ubuntu 20.04 에서 Android 10 빌드하기

반응형



댓글12

  • 나그네 2020.06.18 18:23

    지나가다 보게 되네요...clean full 빌드 시간이 저정도 나오는건가요?
    혹시 ssd 환경인가요?
    답글

  • 클린 빌드 맞고요. i5 cpu, 8기가 램, 8gb 램, hdd 5600RPM 이라 컴파일 엄청 오래 걸려요. (반나절 이상) 파워풀 스펙의 서버에서 돌리면 3시간에서 4시간 정도 소요됩니다.
    답글

    • 나그네 2020.06.18 21:05

      아 실제 3~4시간 걸리신거군요..
      캡쳐본에 시간이 1시간 16분으로 보이길래 무지 빠르다 싶어서요...
      안그래도 빌드 컴파일 최적화를 위해 이것저거 해보고 있는데 1시간 내외로 끊어지지가 않네요...
      저는 i9에 32램 환경입니다. 이제 남은건 ssd인가 싶은데...

  • 1시간 16분은 중간에 Java Heap 에러 나서 다시 돌린 시간입니다. 구글은 Cloud 로 분산 빌드를 한다고 하고 있더라구요. 빌드한 obj 를 cloud 올리고 가져오는 방식이라도 부트 캠프 동영상에 올라와 있는데 구체적인 방법은 아직 몰라요.

    컴퓨터가 좋기는 하지만 그래도 1시간 정도로 빌드하시면 대단한데요. AOSP make을 수정을 하셨나요? 방법 좀 공유해주세요.

    답글

    • 나그네 2020.06.19 15:23

      1시간 내외는 소망사항이고 ㅠ 실제는 2시간정도죠... 남은건 ssd정도네요...
      인텔 pc만 써봤는데 amd도 core 많은거로 하면 성능이 좀 나올지 궁금하기도 합니다.. j 옵션 최대로 하고...

  • jj 2020.07.07 11:37

    안녕하세요 ㅜㅜ 저도 빌드 3 똑같이 오류가 나서 따라해봤는데도
    그대로 오류가 떠서요..! 이 부분 해결방법은 따로 없을까요?
    답글

    • Java heap 에러 말씀하시는거죠?
      터미널에서 아래 처럼 java heap 늘리면 정상 빌드 됩니다. export 터미널이 변경될 때 마다 입력해줘야 합니다.

      $ export _JAVA_OPTIONS=-Xmx4g​

  • 2020.07.07 11:59

    비밀댓글입니다
    답글

  • 정성윤 2020.07.17 18:51

    설치는 잘 되나요?
    답글