들어가며
이 포스트에서는 안드로이드 운영체제의 소스코드를 받아서 게스트 환경(Ubuntu 18.04)에 맞게 빌드하고, 안드로이드 에뮬레이터에 이미지를 플래싱해서 구동시키는 과정을 기록한다.
안드로이드는 다양한 폼 팩터를 가진 다양한 기기를 위해 만들어진 오픈 소스 소프트웨어 스택이다. 오픈 소스이기 때문에 코드가 누구에게나 공개되어 있다. 사용자들이 자유롭게 빌드할 수 있으며, 하드웨어 구성에 맞게 커스터마이징할 수도 있다.
빌드의 전체 과정은 안드로이드 공식 홈페이지 포스팅(https://source.android.com/docs/setup/start)을 따르지만, 필요에 따라 트러블슈팅, 최적화 과정을 추가하였다.
안드로이드 버전
안드로이드 버전의 네이밍은 디저트 이름을 알파벳 순서로 사용하던 전통에서 숫자로 버전을 명시하는 방법으로 변화했다. 안드로이드 공식 페이지(https://source.android.com/docs/setup/about/build-numbers)에서는 플랫폼 코드명, 버전, API 레벨 및 NDK 릴리스에 대한 정보와 함께 이와 관련된 빌드 ID 정의에 대한 설명을 함께 제공한다.
최소사양
빌드를 위해서는 PC환경을 권장하며 아래의 최소 요구사항을 만족해야 한다.
- Android 2.3(진저브레드) 이상 버전의 경우 64비트 시스템
- 코드를 체크아웃하기 위해 250GB 이상의 저장 공간
- 최소 64GB 이상의 RAM
- Ubuntu 18.04 이상의 운영체제(Windows와 MAC은 미지원)
Google은 최소 64GB의 RAM을 권장하며 그 이하로는 테스트하지 않는다. 이보다 적은 용량을 사용하면 빌드가 OOM 종료됩니다.
2021년 6월 현재 Google은 내부적으로 64GB RAM이 장착된 72코어 머신을 사용하고 있으며, 전체 빌드에는 약 40분이 소요된다고 한다(증분 빌드의 경우 정확히 어떤 파일이 수정되었는지에 따라 몇 분 정도 소요됨). 반면 비슷한 램 용량을 갖춘 6코어 머신은 3시간이 걸린다.
사전 필요 패키지 설치
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
Repo 설치
sudo apt-get update
sudo apt-get install repo
E: Unable to locate package repo 에러 발생 시 직접 다운받아야 한다.
1. 홈 경로에 폴더 생성 및 환경변수 설정
> mkdir ~/bin
> PATH=$PATH:~/bin
2. 다운로드 및 실행권한 부여
> curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
> chmod a+x ~/bin/repo
3. python3 버전만 지원하므로 파이썬에 심볼릭 링크를 걸어준다.
> sudo ln -s /usr/bin/python3 /usr/bin/python
repo version
repo 바이너리의 자세한 실행 명령과 설명은 https://source.android.com/docs/setup/create/repo 에서 확인할 수 있다.
소스코드 다운로드
repo를 설치했다면, 우분투에서 소스 저장소(repository) 설정을 한다. 문서(https://source.android.com/docs/setup/download/downloading)를 참고한다.
1. 빈 경로를 생성하고 작업 공간을 준비한다.
mkdir /DATA
cd /DATA
2. Git에 접근하기 위한 계정정보를 등록한다.
git config --global user.name [Your Name]
git config --global user.email [you@example.com]
3. 'repo init'을 실행해서 가장 최신의 저장소 정보를 불러온다.
repo init -u https://android.googlesource.com/platform/manifest
4. 메인 브랜치를 체크아웃한다.
repo init -u https://android.googlesource.com/platform/manifest -b main
4-1. 또는 원하는 버전의 브랜치를 체크아웃 한다.(https://android.googlesource.com/platform/manifest/+refs)
명령 예시는 현재(2023.09)버전의 가장 최신 버전인 r74를 사용한다.
동시에 용량최적화를 위해 옵션을 사용한다.
git history, 개발자가 남긴 태그까지 전부 받을 필요가 없으니 -c --depth=1 --no-tags 옵션을 사용한다.
-c : 단일 브랜치만 다운로드, 브랜치간 전환 불가
--no-tags: 태그정보 없이 소스코드 다운로드
--depth : log history 개수 지정
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r74 -c --depth=1 --no-tags
repo sync -j4 -q -c --no-tags
repo start android-13.0.0_r74 --all
5. MacOS용 파일 삭제
find ./prebuilts/ -name "*darwin-x86*" -type d
find ./prebuilts/ -name "*darwin-x86*" -type d -exec rm -rf {} \;
find ./.repo -name "*darwin-x86*" -type d
find ./.repo -name "*darwin-x86*" -type d -exec rm -rf {} \;
참고
'Security > Mobile' 카테고리의 다른 글
[AOSP] Ubuntu에서 안드로이드 13 빌드하기 3 (0) | 2023.09.30 |
---|---|
[AOSP] Ubuntu에서 안드로이드 13 빌드하기 2 (0) | 2023.09.23 |
[안드로이드 모의해킹] 안드로이드 정적 분석 실습 Q1 part3 (0) | 2023.07.22 |
[안드로이드 모의해킹] 안드로이드 정적 분석 실습 Q1 part2 (0) | 2023.07.15 |
[안드로이드 모의해킹] 안드로이드 정적 분석 실습 Q1 part1 (0) | 2023.07.08 |