이 튜토리얼에서는 Android 운영체제 개발을 처음으로 시도해 볼 수 있습니다.
Android 개발 설정
Android 소스의 main
브랜치를 다운로드하고 빌드하기 전에 하드웨어가 필수 요구사항을 충족하는지, 필수 소프트웨어가 올바르게 설치되어 있는지 확인해야 합니다. 다음 용어도 알고 있어야 합니다.
- Git
- Git은 오픈소스로 배포된 무료 버전 제어 시스템입니다. Android는 브랜칭, 커밋, diff, 수정사항과 같은 로컬 작업에 Git를 사용합니다. Git에 관한 자세한 내용은 Git 문서를 참고하세요.
- Repo
- Repo는 여러 Git 저장소에 걸쳐 복잡한 작업의 실행을 간소화하는 Git의 Python 래퍼입니다. Repo는 모든 버전 제어 작업에서 Git을 대체하지 않으며 복잡한 Git 작업을 쉽게 달성할 수 있도록 할 뿐입니다. Repo는 매니페스트 파일을 이용하여 Android 슈퍼 프로젝트에 Git 프로젝트를 집계합니다.
- 매니페스트 파일
- 매니페스트 파일은 Android 소스의 다양한 Git 프로젝트가 AOSP 소스 트리 내에 배치되는 위치를 지정하는 XML 파일입니다.
하드웨어 요구사항 충족
개발 워크스테이션은 다음 하드웨어 요구사항을 충족하거나 초과해야 합니다.
64비트 x86 시스템
코드를 체크아웃하고 빌드하려면 디스크 여유 공간이 400GB 이상 있어야 합니다(체크아웃하는 데 250GB, 빌드하는 데 150GB).
64GB 이상의 RAM. Google에서는 RAM이 64GB인 72코어 머신을 사용하여 Android를 빌드합니다. 이 하드웨어 구성을 사용하면 Android 전체 빌드에 약 40분이 소요되며 Android의 증분 빌드에는 몇 분밖에 걸리지 않습니다. 이와 대조적으로 RAM이 64GB인 6코어 머신을 사용하면 전체 빌드에 약 6시간이 걸립니다.
운영체제 요구사항 충족
개발 워크스테이션은 GNU C 라이브러리(glibc)가 2.17 이상인 64비트 Linux 배포판을 실행해야 합니다.
필수 패키지 설치
Ubuntu 18.04 이상을 위한 필수 패키지를 설치하려면 다음 명령어를 실행하세요.
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
필수 소프트웨어 설치
AOSP를 사용하려면 OpenJDK, Make, Python 3, Repo가 설치되어 있어야 합니다. Android의 AOSP main 브랜치는 사전 빌드된 버전의 OpenJDK, Make, Python 3가 함께 제공되므로 설치 단계가 추가로 필요하지 않습니다. 다음 섹션에서는 Repo 설치 방법을 설명합니다.
Repo 설치
Repo를 설치하려면 다음 단계를 따르세요.
현재 패키지 정보를 다운로드합니다.
sudo apt-get update
다음 명령어를 실행하여 Repo 런처를 설치합니다.
sudo apt-get install repo
Repo 런처가 제공하는 Python 스크립트를 사용하여 체크아웃을 초기화하고 전체 Repo 도구를 다운로드합니다.
성공하면 4단계로 건너뜁니다.
(선택사항) 일련의 다음 명령어를 사용하여 수동으로 Repo를 설치합니다.
export REPO=$(mktemp /tmp/repo.XXXXXXXXX) curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo gpg --recv-keys 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65 curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo
처음 세 개의 명령어는 임시 파일을 설정하여 파일에 Repo를 다운로드하고 제공된 키가 필수 키와 일치하는지 확인합니다. 이러한 명령어가 성공하면 마지막 명령어는 Repo 런처를 설치합니다.
Repo 런처 버전을 확인합니다.
repo version
출력에는 버전 2.4 이상이 표시되어야 합니다. 예를 들면 다음과 같습니다.
repo launcher version 2.45
Android 소스 다운로드
Android 소스는 Google에서 호스팅한 Git 저장소 모음에 있습니다. 각 Git 저장소에는 소스 변경사항과 변경이 이루어진 시기 등 Android 소스의 전반적인 기록이 포함되어 있습니다. Android 소스를 다운로드하려면 다음 단계를 따르세요.
홈 디렉터리로 이동합니다.
cd ~
홈 디렉터리 내에 다음과 같이 로컬 작업 하위 디렉터리를 만듭니다.
mkdir aosp
다음과 같이 디렉터리로 이동합니다.
cd aosp
다음과 같이 AOSP 저장소 소스 코드 메인 브랜치를 초기화합니다(기본값).
repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
Git 사용자 인증 정보(이름, 이메일 주소)를 입력하거나 수락합니다.
다음과 같이 소스 코드를 동기화합니다.
repo sync -c -j8
다운로드 중에 문제가 발생하면 동기화 문제 해결을 참고하세요.
코드 빌드
코드를 빌드하는 방법은 다음과 같습니다.
작업 디렉터리 내에서
envsetup.sh
스크립트를 제공하여 빌드 환경을 설정합니다.source build/envsetup.sh
lunch
명령어로 빌드할 타겟 기기 유형을 지정합니다. 타겟은 특정 모델이나 폼 팩터와 같은 기기 순열입니다. 다음 타겟을 지정합니다.lunch aosp_cf_x86_64_phone-trunk_staging-userdebug
타겟과 빌드 환경의 개요가 표시됩니다.
============================================ PLATFORM_VERSION_CODENAME=VanillaIceCream PLATFORM_VERSION=VanillaIceCream PRODUCT_INCLUDE_TAGS=com.android.mainline TARGET_PRODUCT=aosp_arm TARGET_BUILD_VARIANT=eng TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=generic HOST_OS=linux HOST_OS_EXTRA=Linux-6.5.13-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete HOST_CROSS_OS=windows BUILD_ID=AOSP.MAIN OUT_DIR=out ============================================
타겟을 빌드합니다.
m
첫 빌드는 몇 시간이 걸릴 수 있습니다. 후속 빌드에서는 빌드 시간이 많이 짧아집니다. 빌드의 출력이 $OUT_DIR
에 표시됩니다.
Cuttlefish 실행
Cuttlefish는 빌드를 테스트할 때 사용하는 Android 에뮬레이터입니다.
다음 명령어를 실행하여 호스트 Debian 패키지를 다운로드, 빌드, 설치합니다.
sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl
git clone https://github.com/google/android-cuttlefish
cd android-cuttlefish
for dir in base frontend; do pushd $dir # Install build dependencies sudo mk-build-deps -i dpkg-buildpackage -uc -us popd done
sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
sudo usermod -aG kvm,cvdnetwork,render $USER
sudo reboot
재부팅하면 추가 커널 모듈 설치가 트리거되고
udev
규칙이 적용됩니다.Cuttlefish를 실행합니다.
launch_cvd --daemon
웹브라우저에서
https://localhost:8443
으로 이동해 Cuttlefish 기기에 연결하세요. 가상 Android 기기가 표시됩니다.
변경하기
이 변경 목록 예에 따라 소스 코드를 업데이트합니다.
체크아웃의 루트(
aosp/
디렉터리)에서frameworks/native
Git 프로젝트로 이동합니다.cd frameworks/native
다음 명령어를 사용하여 임시 프로젝트를 시작합니다.
repo start <some-name> .
편집기를 사용하여 다음 위치에서
SurfaceFlinger.cpp
를 수정합니다.aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
다음 줄을 찾습니다.
void SurfaceFlinger::updateColorMatrixLocked() {
updateColorMatrixLocked()
의 시작 부분에 다음 줄을 추가합니다.mClientColorMatrix = mat4(vec4{1.0f, 0.0f, 0.0f, 0.0f}, vec4{0.0f, -1.0f, 0.0f, 0.0f}, vec4{0.0f, 0.0f, -1.0f, 0.0f}, vec4{0.0f, 1.0f, 1.0f, 1.0f});
다음과 같이 코드를 빌드합니다.
m
기기에서 빌드를 업데이트합니다.
adb root
adb remount -R
adb root
adb sync
adb reboot
그림 1과 같이 선택한 기기에서 색상이 변경되는지 확인합니다.
그림 1. 성공적인 색상 변경 후 화면 모습
테스트 수정
Codelab의 이 부분에서는 소스 트리에 있고 실패하게 되는 테스트 예를 활용합니다.
테스트를 실행, 디버그, 수정하려면 다음 안내를 따르세요.
실행:
atest DevCodelabTest
테스트가 실패합니다.
실패한 테스트의 스택 트레이스를 검토합니다.
STACKTRACE: java.lang.AssertionError at org.junit.Assert.fail(Assert.java:87) at org.junit.Assert.assertTrue(Assert.java:42) at org.junit.Assert.assertTrue(Assert.java:53) at android.test.example.devcodelab.DevCodelabTest.testHelloWorld(DevCodelabTest.java:29)
스택 트레이스의 마지막 줄에는 실패하는 테스트(
testHelloWorld
)가 표시됩니다. 이 테스트는DevCodelabTest.java
라는 파일에 있습니다.수정할 테스트의 위치를 확인하려면 스택 트레이스의 마지막 줄에 테스트 파일 이름까지
WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/
를 추가합니다. 따라서android.test.example.devcodelab.DevCodelabTest
는WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
가 됩니다.platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
을 수정하고Assert.assertTrue(false)
를Assert.assertTrue(true)
로 바꿉니다.테스트를 다시 실행하여 문제가 해결되었는지 확인합니다.
atest DevCodelabTest
검토를 위해 코드 업로드
Repo는 여러 Git 저장소(또는 프로젝트)에서 동시에 작업할 수 있도록 git clone
과 같은 명령어를 번들로 묶어 Git 사용을 간소화합니다.
Git에서 프로젝트의 코드를 검토하려면 Gerrit 웹 기반 코드 검토 시스템을 사용하세요.
frameworks/native
프로젝트를 변경했다고 가정하고 다음 명령어를 실행하여 변경사항을 업로드합니다.cd frameworks/native
repo start codelab .
git add .
git commit
커밋 메시지로 다음을 입력합니다.
Android codelab change Test: manual atest
변경사항을 업로드합니다.
repo upload
성공적으로 완료되면 다음과 같은 메시지가 표시됩니다.
Upload project frameworks/native/ to remote branch main: branch codelab ( 1 commit, Wed Aug 7 09:32:33 2019 -0700): ff46b36d android codelab change to https://android-review.googlesource.com/ (y/N)? y remote: Processing changes: refs: 1, new: 1, done remote: remote: SUCCESS remote: remote: https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432 android codelab change [NEW] remote: To https://android-review.googlesource.com/platform/frameworks/native * [new branch] codelab -> refs/for/main
Gerrit에서 변경사항 확인
Gerrit에서 변경사항을 보려면 터미널에서 링크 출력으로 이동합니다. 링크는 다음과 유사합니다.
https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432
변경사항 되돌리기
일반적으로 테스트 후 검토 및 승인 시 Gerrit에 변경사항을 제출하고 저장소에 병합합니다. 대신 이 Codelab의 목적에 맞게 작업을 되돌립니다.
Gerrit에서 Abandon을 클릭합니다.
frameworks/native
프로젝트 디렉터리(또는 하위 디렉터리)에서 연결된 임시 브랜치를 폐기합니다.repo abandon codelab .
테스트 파일의 변경사항을 되돌립니다. 테스트 변경사항에
repo start
,git commit
,repo upload
를 실행하지 않았으므로 파일 자체를 재설정할 수 있습니다.aosp/platform_testing directory
에 있다고 가정하고 다음 명령어를 사용하여 파일을 재설정합니다.git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
git checkout .
Android 플랫폼 개발을 위한 Codelab을 완료했습니다.
도움말 확인
Codelab을 진행하는 동안 오류가 발생하면 페이지 하단에 있는 Issue Tracker 링크를 사용하여 오류를 신고해 주세요. android-building 그룹에 질문을 보낼 수 있습니다.
ps -A | grep crosvm
를 입력하여 crosvm
가 이미 실행 중인지 확인합니다. crossvm
가 실행 중인 경우 프로세스 PID와 함께 stop_cvd || true
또는 kill crosvm
프로세스를 입력합니다.