brunch

You can make anything
by writing

C.S.Lewis

by 시류아 Jul 22. 2020

하이퍼V+우분투 20.04
안드로이드 GSI 빌드하기

윈도우 환경에서 가상머신을 통해서 안드로이드 트레블 GSI 빌드하기



글을 시작하기 앞서..


본 글은 개인적으로 안드로이드 트레블(Android Treble) 펌웨어 빌드 관련하여 여러 가지 사항을 공부하면서 남겨두는 정리 노트 개념의 글입니다. 시간이 흘러감에 따라서 더 이상 맞지 않게 되는 부분이 있을 수도 있으며, 잘 못 이해하여 다르게 적혀있는 부분이 있을 수도 있습니다. 이 점 참고 부탁드리며, 잘못 작성된 부분에 있어서는 설명과 함께 댓글로 말씀 부탁드리겠습니다.


그동안 약 2년 주기로 갱신해왔던 안드로이드 빌드 가이드와는 사뭇 다르게 진행합니다.


여러 가지 사항을 고려해서 네이트브 환경에서 빌드하는 것을 기준으로 삼고 권장했지만, 이번 글에서는 Windows 10 Pro에 추가되어있는 Hyper-V를 통한 가상화된 우분투 환경에서 빌드를 진행하며, 특정 하드웨어에서 동작하는 안드로이드 펌웨어를 빌드하는 것을 목표로 하는 것이 아닌, 안드로이드 트레블을 통한 지원되는 단말기라면 공통적으로 사용할 수 있는 펌웨어를 빌드하는 것을 목표로 합니다.


가상 환경 구성 전, 하드웨어 권장 사양

가상 환경을 구성하기 전, 최소 하드웨어의 권장 사양은 다음과 같습니다.   

64 bit Quad Core 이상의 CPU

250 GB 이상의 저장공간 (500GB 이상의 SSD 사용 추천)

16 ~ 32 GB 이상의 RAM


만약, 위의 조건을 충족하지 못하는 저사양 하드웨어를 사용 중이라면, 우분투를 가상화할 것이 아닌 네이티브 환경으로 설치해서 진행하는 것을 권장합니다.


가상 환경 구성시 요구되는 사양   

64 bit 가상화

Dual Core 이상 프로세서 할당

250 GB 이상의 저장공간

16GB 이상의 RAM / Swap


추가. 가상화 환경이 아닐 경우 하드웨어 권장사항   

64 bit CPU

250 GB 이상의 저장공간

8 ~ 16 GB RAM / Swap





Hyper-V 설정 및 Ubuntu VM 설치하기

1. Ubuntu 20.04 LTS 설치파일 받기

https://releases.ubuntu.com/20.04/ 에서 64-bit PC 용 Desktop Image 파일을 다운로드합니다.

파일 명은 ubuntu-20.04-desktop-amd64.iso입니다.


2. Hyper-V 활성화

Hyper-V를 활성화시키기에 앞서서, UEFI 또는 BIOS에서 CPU 가상화 기능을 활성화합니다.


Intel CPU는 Virtualization 또는 Intel Virtualization Technology이며, AMD Ryzen CPU는 SVM Mode입니다.


가상화 기능 활성화가 완료되었으면, Windows의 제어판 → 프로그램 → Windows 기능 켜기/끄기 에서 Hyper-V 옵션 클릭 후 확인을 누릅니다.


3. 가상 컴퓨터 생성

Hyper-V 관리자를 실행한 이후 새로 만들기 → 가상 컴퓨터를 클릭하여 새로운 가상 컴퓨터를 생성합니다.


이름은 편한 대로 설정합니다. (차후 변경이 가능합니다.)


세대 지정은 2세대로 설정합니다. 1세대를 사용해도 상관없으나 성능 측면에서 2세대를 사용하는 것이 더 유리합니다.


시작 메모리는 8GB (8192 MB) 이상 지정합니다. 안드로이드 공식 권장은 가상 환경일 경우 Swap 메모리 포함 16 GB로 설정하는 것을 권장하고 있습니다.


*P.S. Swap 메모리 없이 8GB로 설정한다고 하더라도 빌드는 문제없이 가능합니다.


네트워킹 구성은 Default Switch로 설정합니다. 네트워킹 구성이 설정되어있지 않을 경우 빌드 환경 설정부터 빌드까지 전부 진행이 불가능합니다.


*P.S. 네트워킹 구성을 Default Switch로 했음에도 불구하고 가상 컴퓨터에서 네트워크가 잡히지 않는 경우 네트워크 어댑터 옵션에서 Ethernet과 vEthernet(Hyper-V)가 정상적으로 공유되고 있는지 확인합니다.


가상 하드 디스크는 250 GB 이상으로 설정합니다.


만약, pass-through를 통해서 가상 디스크 대신 실제 디스크에 구성하고 싶다면 나중에 가상 하드 디스크 연결을 선택합니다.


설치 옵션에서는 부팅 가능 이미지 파일에 ubuntu-20.04-desktop-amd64.iso 파일을 선택합니다. 이후 마침을 눌러 가상 컴퓨터 생성을 마무리합니다.


4. 가상 컴퓨터 설정

생성된 가상 컴퓨터를 우클릭하여 설정 창을 실행합니다.


프로세서 항목에서 가상 프로세서 수를 추가합니다.


최대 설정 가능한 개수는 전체 스레드 개수와 동일하며, 평균적으로 3분의 1에서 절반 정도 할당하는 것이 안정적으로 사용할 수 있습니다.


만약, 사용하고 있는 CPU의 스레드 개수가 평소 사용하는 데 있어서 부족함 없이 넉넉하시다면 더 할당하셔도 상관없습니다.


보안 항목에서 보안 부팅 사용을 체크 해제합니다. 리눅스 계열 가상화 같은 경우, 보안 부팅 사용을 사용하면 정상적으로 설치 프로세스가 진행되지 않을 수 있습니다.


검사점 항목에서 검사점 사용을 체크 해제합니다. 검사점 기능은 스냅샷으로 OS가 설치되어있지 않은 상태에서는 설치 과정에서의 오류를 발생시키는 원인 중 하나로 동작합니다.


만약, 검사점 기능을 사용하시려고 하신다면 OS 설치를 완료한 이후 하시는 것을 권장합니다.


이외 하드 / DVD / 공유 드라이브가 필요로 한다면 SCSI 컨트롤러 항목에서 추가 작업을 진행합니다.


5. pass-through를 이용해서 가상 디스크 대신 실제 하드웨어 SSD / HDD를 사용하기

pass-through를 이용해서 가상 디스크 대신 실제 SSD나 HDD를 사용하려면 먼저 디스크 관리 옵션에서 사용할 디스크를 오프라인으로 변경해야 됩니다.


만약, 오프라인으로 전환이 되지 않는다면 관리자 권한으로 실행된 PowerShell에서 아래의 명령어를 통해서 강제 전환이 가능합니다.


$ Get-Disk $ Get-Disk -Number <N> | Set-Disk -IsOffline $true
// <N> 은 Disk 의 번호


오프라인 전환이 완료되었다면, SCSI 컨트롤러 항목에서 하드 드라이브를 추가 한 뒤, 실제 하드 디스크를 선택하여 오프라인 전환한 디스크를 지정 후 확인을 눌러서 적용합니다.


6. 설치 ISO 를 인식하지 못하는 경우

SCSI 컨트롤러 항목에서 DVD 드라이브가 정상적으로 추가되어있는지 확인해보고, 없다면 추가를 진행합니다.


이후 가상 CD/DVD 드라이브에서 사용할 미디어 지정에 ubuntu-20.04-desktop-amd64.iso 파일을 지정합니다.


마지막으로 펌웨어 항목에서 부팅 순서를 DVD 드라이브가 가장 먼저 이루어지도록 설정합니다.





Ubuntu 20.04 LTS 에
Android 빌드 환경 설정하기


$ 가 붙은 항목은 터미널에서 입력하는 항목입니다.


1. JAVA 설치

$ sudo apt-get purge openjdk-* icedtea-* icedtea6-*
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk


정상적으로 설치가 되었다면 아래와 같이 java 버전이 확인 가능합니다.

java version "1.8.0_91" 


2. Android Build 환경 구성

$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt install openssh-server screen git bc bison build-essential curl flex \\  g++-multilib gcc-multilib gnupg gperf imagemagick lib32ncurses-dev lib32readline-dev \\  lib32z1-dev  liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils \\ lzop pngcrush rsync schedtool squashfs-tools xsltproc yasm zip zlib1g-dev libtinfo5 \\ libncurses5 make android-tools-adb android-tools-fastboot -y 

안드로이드 빌드 환경 구성을 위한 도구를 설치하기 전, apt-get update & upgrade를 통해서 사전에 기존 설치되어있는 도구 및 라이브러리에 대해서 미리 업데이트를 해주는 것이 좋습니다.


2-1. Python 설치

$ sudo apt-get install python 

빌드를 진행하기 위해서는 Python 2.7 이상이 필요로 합니다. 다른 도구들과 같이 설치를 진행하게 될 경우, 간혹 오류가 발생되는 경우가 있으니 별도 설치를 권장합니다.


2-2. repo 설치 및 권한 부여

$ sudo wget '<https://storage.googleapis.com/git-repo-downloads/repo>' -P /usr/local/sbin/
$ sudo chmod +x /usr/local/sbin/repo 

repo는 구글에서 제공하고 있는 Git 레파지토리 관리 유틸리티입니다.

repo 명령어에 관련된 설명은 https://source.android.google.cn/setup/develop/repo 를 참고하시길 바랍니다.


2-3. git 설정

git config --global user.email "example@email.com"
git config --global user.name "Your Name" 

본인이 소스 코드의 문제점을 발견해서 수정하고 Request를 보내지 않을 것이라면 딱히 설정하지 않아도 상관은 없습니다만, 설정하는 것을 권장합니다.


2-4. (선택사항) Android USB Driver 설정

$ sudo gedit /etc/udev/rules.d/51-android.rules 

gedit, nano, vim 등 에디터를 통하여 아래와 같이 android.rules를 작성합니다.


SUBSYSTEM=="usb", ATTR{idVendor}=="0502", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0b05", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="413c", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0489", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="091E", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="12d1", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="24e3", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="2116", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0482", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="17EF", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="1004", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0409", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="2080", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0955", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="2257", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="10A9", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0471", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="04da", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="1f53", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="04dd", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0fce", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="0930", MODE="0666" SUBSYSTEM=="usb", ATTR{idVendor}=="19D2", MODE="0666"
$ sudo chmod a+r /etc/udev/rules.d/51-android.rules

android.rules 작성이 다 되었다면 권한을 부여합니다.





Google Android GSI Source 받기

$ mkdir gsi
$ cd gsi

구글에서 제공하고 있는 Android GSI의 소스를 다운로드하기 위해 폴더를 생성하고, 해당 폴더로 진입합니다.


// Android 10 GSI 를 타겟으로 하고 있는 Repo 설치
$ repo init -u https://android.googlesource.com/platform/manifest -b android10-gsi

// Android 9 (Pie) GSI 를 타겟으로 하고 있는 Repo 설치
$ repo init -u https://android.googlesource.com/platform/manifest -b pie-gsi 

2020년 07월 21일 기준 구글에서 제공해주고 있는 안드로이드 GSI의 소스 코드는 Android 10과 Android 9 Pie 가 있으며, 빌드하고자 하는 안드로이드 OS 버전에 맞추어서 repo 설치를 진행하면 됩니다.


$ repo sync

repo 설치가 완료되었다면 repo sync을 통해서 소스 코드를 내려받습니다.





Google Android GSI Build

1. Google Android GSI Build Target 설정

$ source buiid/envsetup.sh $ lunch XXXXX-YYYYY 

Google에서 제공하고 있는 GSI에는 아키텍처의 종류와 사용하고 있는 비트 체계, 그리고 어떤 조건으로 빌드할 것인가에 따라서 다양한 빌드 타깃을 제공해주고 있습니다.


$ lunch에서 XXXXX는 4-1과 4-2를 참고하고, YYYYY는 4-3을 참고하여 입력, 빌드 타깃을 지정하면 됩니다. 사용 예시는 4-4를 통해서 확인이 가능합니다.


2-1. Android GSI 빌드 타깃 (Android 9 이상 출시 기기)


2-2. Legacy GSI 빌드 타깃 (Android 8.0 ~ 8.1 출시 기기)


2-3. 빌드 조건


2-4. 빌드 타깃 지정 예시

// Android GSI Example
$ lunch aosp_arm64-userdebug

// Legacy GSI Example
$ lunch aosp_arm64_ab-userdebug


3. GSI 빌드

$ make 

빌드 타깃을 정상적으로 지정했다면 위의 이미지와 같이 타깃 대상에 대한 정보가 올라오며, 이후 make 명령어를 입력하는 것으로 GSI 빌드가 진행됩니다.


빌드에 걸리는 시간은 구성되어있는 환경에 따라서 크게 차이나며, i5-2430M(2C 2T) / RAM 16GB / 우분투 네이티브 설치 기준 약 9~10 시간 소요됩니다.



4. 기타사항

코어 및 쓰레드 갯수 조절을 통한 빌드 성능 조절 방법

$ make -j<N>
// N은 코어 갯수 x 쓰레드 갯수
// Ex ->make -j4 


캐시를 사용하여 빌드 속도 향상 방법

$ export USE_CCACHE=1
$ export CCACHE_COMPRESS=1
$ prebuilts/misc/linux-x86/ccache/ccache -M 50G 


lexer.cpp 또는 LC_TIME 관련 오류 발생 시 대응 방법

$ export LC_ALL=C 


빌드 결과물 위치

~/android/out/target/product/”기기 명” 경로 


빌드 결과물 한 번에 묶기

$ make otapackage 


빌드 초기화 방법

$ make clean 


빌드 결과물 압축하기

xz -c system.img > system.img.xz 

빌드 결과물 폴더로 이동한 이후 위의 명령어를 실행합니다.





GSI 플래싱(설치)

빌드한 GSI를 설치하기 앞서, 설치할 단말기에서 아래의 사항이 충족되는지 확인합니다.   

Treble 지원

부트로더 언락(Bootloader Unlock)

Fastboot 사용 가능 유무

자체 검사 부팅 사용 중지 가능 여부


문제없이 설치가 가능한 단말이라면 아래와 같은 프로세스로 설치를 진행합니다.   

Fastboot 모드로 부팅

부트로더 언락

자체 검사 부팅 사용 중지

현재 시스템 파티션 포맷 후 GSI 를 시스템 파티션으로 플래싱(설치)

사용자 데이터 및 캐시 파티션 일괄 포맷

기기 재부팅


1. Pixel 기준 예시

Fastboot 모드로 부팅 후 부트로더 언락

$ fastboot reboot fastboot
$ fastboot flashing unlock 


vbmeta.img 를 플래싱하여 자체 검사 부팅 사용 중지

$ fastboot --disable-verification flash vbmeta vbmeta.img 


시스템 파티션 포맷 후 GSI 를 시스템 파티션에 플래싱

$ fastboot erase system
$ fastboot flash system system.img 


사용자 데이터 및 캐시 파티션 일괄 포맷

$ fastboot -w 


단말기 재부팅

$ fastboot reboot 


2. (선택사항) ADB를 통해 단말기 부팅 과정에서의 에러 로그 확인 방법

$ adb devices $ adb logcat *:E 


3. Android 10 기기에서 아래와 같은 오류가 발생할 때 대응 (다이나믹 파티션 적용 단말기 한정)

Resizing 'system_a'    FAILED (remote: 'Not enough space to resize partition') fastboot: error: Command failed 
$ fastboot delete-logical-partition product_a 

접미사 _a는 시스템 파티션의 슬롯 ID와 일치해야 됩니다. 즉, a 파티션이면 _a 가 되어야 하며, b 파티션이면 _b 가 되어야 합니다.






번외. Custom script 사용 GSI 빌드

Custom script는 구글이 배포하고 있는 GSI 빌드가 아닌, XDA의 phhusson 님께서 진행 중인 안드로이드 트레블 펌웨어 빌드 프로젝트를 이용하는 방법입니다. 기본적으로 빌드 환경 구성이 필요하니, 본 글의 2번 항목까지 동일하게 진행한 후, 아래의 설명에 따라서 진행하면 됩니다.


$ mkdir phh
$ dir phh 

Source를 받을 폴더를 생성 한 이후 진입합니다.


$ git clone <https://github.com/phhusson/treble_experimentations> 

git clone을 통해서 treble_experimentations 소스를 받습니다.

이후 아래의 세 가지 방법 중 한 가지 방법을 통해서 GSI 빌드를 진행하면 됩니다.


번외 1. phhusson's script 사용 GSI 빌드 (build-rom.sh)

$ mkdir <ROM 이름>
// Ex -> mkdir AOSP10 / mkdir lineage / mkdir rr / mkdir carbon

$ cd <ROM 이름> 

소스를 받아 둔 폴더 내 <ROM 이름> 폴더를 생성하고 진입합니다.


bash ../treble_experimentations/build-rom.sh <안드로이드 버전> <ROM 이름>

// Ex -> bash ../treble_experimentations/build-rom.sh android-8.1 romname
// Ex -> bash ../treble_experimentations/build-rom.sh android-10.0 

<ROM 이름>에 맞추어서 bash로 build-rom.sh를 실행합니다. 자동으로 repo 초기화 후 펌웨어 소스를 받은 뒤 패치 및 빌드를 진행합니다.


완료된 결과물은 out/target/product/phh_* 에서 확인이 가능합니다.


번외 2. phhusson's second script 사용 빌드 (build.sh)

$ gedit treble_experimentations/build.sh
// or -> $ nano treble_experimentations/build.sh 

gedit, nano, vim 등의 에디터를 통해서 build.sh 파일을 열어 아래와 같이 수정합니다.


if [ "$1" = "android-10.0" ];then
         #buildVariant treble_arm64_afS-userdebug quack-arm64-aonly-floss
        #buildVariant treble_arm64_avS-userdebug quack-arm64-aonly-vanilla
        #buildVariant treble_arm64_agS-userdebug quack-arm64-aonly-gapps
        buildVariant treble_arm64_aoS-userdebug quack-arm64-aonly-go
        #buildVariant treble_arm64_bfS-userdebug quack-arm64-ab-floss
        #buildVariant treble_arm64_bvS-userdebug quack-arm64-ab-vanilla
        #buildVariant treble_arm64_bgS-userdebug quack-arm64-ab-gapps
        #buildVariant treble_arm64_boS-userdebug quack-arm64-ab-go 

빌드하고자 하는 항목을 제외한 나머지 항목에 대해서 # 처리합니다. (주석 처리)


$ mkdir <ROM 이름>
$ cd <ROM 이름>
$ bash ../treble_experimentations/build.sh android-10.0 

<ROM 이름> 폴더를 생성하고 진입, 이후 bash로 build.sh를 실행합니다. 자동으로 repo 초기화 후 펌웨어 소스를 받은 뒤 패치 및 빌드를 진행합니다.


완료된 결과물은 out/target/product/phh_* 에서 확인이 가능합니다.


번외 3. dakkar's script 사용 GSI 빌드

bash ../treble_experimentations/build-dakkar.sh <ROM 이름> <빌드 옵션> 

bash로 <ROM 이름>과 <빌드 옵션>을 지정하여 build-dakkar.sh를 실행합니다.

자동으로 repo 초기화 후 펌웨어 소스를 받은 뒤 패치 및 빌드를 진행합니다.


<ROM 이름>과 <빌드 옵션> 은 아래의 항목을 참고하시길 바라며, 완료된 결과물은 out/target/product/phh_* 에서 확인이 가능합니다.


지원되는 <ROM 이름> 항목 (2020년 07월 21일 기준)

aex-pie / aicp-oreo / aokp-oreo / aosmp-pie / aosp80 / aosp81 / aosp90 / aosp10 \
aquarios / carbon-oreo / crdroid-oreo / e-pie / e-oreo / havoc-pie / komodo-pie \
lineage151 / lineage160 / mokee-oreo / pixel81 / pixel90 / potato-pie \
rebellion-pie / rr-oreo / slim-oreo / graphene9 / graphene10 \


빌드옵션


build-dakker.sh 사용 예시

// Ex ->
$ bash ../treble_experimentations/build-dakkar.sh aosp10 arm-aonly-vanilla-nosu-user
$ bash ../treble_experimentations/build-dakkar.sh aosp10 arm64-ab-gapps-su
$ bash ../treble_experimentations/build-dakkar.sh aosp10 a64-aonly-go-nosu


번외 4. phhusson's script 수동 빌드

지금부터 하는 방법은 수동 빌드입니다. 위의 방법으로 진행이 안 되는 경우 사용하는 것을 권장하며, 빌드하고자 하는 것에 따라서 정상적으로 진행되지 않을 수 있습니다. 본 글에서 다루는 예시는 Lineage-17.1을 기준으로 하고 있으며, 빌드 과정에서 약간의 오류 수정이 있었습니다.


$ mkdir rom $ cd rom 

Source를 받을 폴더를 생성 한 이후 진입합니다.


$ repo init -u <https://github.com/LineageOS/android.git> -b lineage-17.1 

Lineage-17.1을 타깃으로 하고 있는 repo를 설치합니다.


$ git clone <https://github.com/phhusson/treble_manifest> .repo/local_manifests -b android-10.0 

phh의 treble_manifest를 local_manifest로 git clone 하여 받습니다.


$ repo sync 

repo sync을 통해서 소스 코드를 내려받습니다.


$ git clone <https://github.com/phhusson/treble_patches> -b android-10.0 

phh의 treble_patches를 git clone 하여 받습니다.


$ patch -p1 < patch 

패치를 진행합니다.

- 만약 정상적으로 진행되지 않는다면,
  다음의 항목을 cherry-pick 변경 및 최신 분기를 선택합니다.
  (phhusson's Github)

platform_build → platform_external_selinux → platform_frameworks_av
 → platform_frameworks_base → platform_frameworks_native
 → platform_frameworks_opt_telephony → platform_system_bt
 → platform_system_core → platform_system_libvintf → platform_system_vold

- git fetch repo branch && git cherry-pick commit
$ . build/envsetup.sh
$ lunch treble_arm64_avN-userdebug // 옵션 변경 가능, 변경 옵션은 build.sh 참고
$ WITHOUT_CHECK_API=true make systemimage

패치가 완료되었으면, phh device repo에서. mk 파일을 수정합니다. 이후 위의 명령어를 통해 빌드를 시작합니다. 완료된 결과물은 out/target/product/phh_* 에서 확인이 가능합니다.





참고문서

http://blog.naver.com/searphiel9/221355258568

https://thesolving.com/virtualization/how-to-configure-a-pass-through-disk-with-hyper-v/

https://source.android.com/setup/build/requirements

https://source.android.com/setup/build/initializing

https://source.android.com/setup/develop/

https://source.android.com/setup/build/downloading

https://developer.sony.com/develop/open-devices/guides/aosp-build-instructions

https://back2basics.io/2020/05/creating-a-android-aosp-build-machine-on-ubuntu-20-04/

https://source.android.com/setup/build/gsi#building-gsis

https://android.googlesource.com/platform/manifest/+refs

https://github.com/phhusson/treble_experimentations/wiki/How-to-build-a-GSI%3F

https://github.com/phhusson/treble_experimentations/blob/master/build-rom.sh

https://github.com/phhusson/treble_experimentations/blob/master/build.sh

https://github.com/phhusson/treble_experimentations/blob/master/build-dakkar.sh

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari