Android 개발자 Codelab

Codelab을 통해 역사상 가장 널리 설치된 운영체제의 개발을 지원할 수 있습니다. 여러분은 여기에서 Android 플랫폼 엔지니어가 되기 위한 여정을 시작하게 됩니다.

쉬운 길은 아니지만, Android팀에서는 새 버전을 출시할 때마다 여러분의 여정을 간소화하기 위해 노력하고 있습니다. 또한 Android 오픈소스 프로젝트(AOSP)에 직접 참여하며 매일 발전을 거듭하고 있습니다.

이제 편하게 앉아 터미널을 켜고 역사를 만들어 보세요.

목표

이 Codelab의 목표는 다음의 두 가지입니다.

  1. 플랫폼(운영체제)에서 작업하는 Android 엔지니어가 어떤 개발자 워크플로를 거치는지 엿봅니다.
  2. 개발을 기초 단계부터 시작할 때 활용하는 Android 도구, 문서 및 개발자 워크플로에 관한 의견을 제공하게 됩니다.

기본 요건

다음은 일반 플랫폼(AOSP) 개발의 요구사항에서 파생된 이 Codelab용 요구사항의 전체 목록입니다.

이 Codelab을 수강하려면 다음을 설정해야 합니다.

환경

일반적으로 사용자는 워크스테이션에서 직접 빌드하고 개발합니다. 다양한 터미널에서 작업할 수 있고 사용되는 명령어 중 다수가 터미널마다 다르므로 각 터미널 세션에서 명령어를 다시 실행해야 합니다. 구체적으로는 source build/envsetup.shlunch 명령어가 포함됩니다.

워크스테이션 설정

  1. 워크스테이션에 필수 패키지를 설치합니다.
  2. 터미널을 실행 중일 때 Repo를 설치하고 모든 Git 저장소의 사용자 인증 정보를 받습니다.

코드 초기화 및 동기화

  1. 홈 디렉터리로 이동합니다.

    cd ~
    
  2. 홈 디렉터리 내에 다음과 같이 로컬 작업 하위 디렉터리를 만듭니다.

    mkdir aosp
    
  3. 다음과 같이 디렉터리로 이동합니다.

    cd aosp
    
  4. 다음과 같이 AOSP 저장소 소스 코드 마스터 브랜치를 초기화합니다(기본값).

    repo init -u https://android.googlesource.com/platform/manifest
    
  5. Git 사용자 인증 정보(이름, 이메일 주소)를 입력하거나 수락합니다.

  6. 다음과 같이 소스 코드를 동기화합니다.

    repo sync -j16
    

초기 동기화에는 1시간 이상 걸릴 수 있습니다. 기다리는 동안 다운로드 안내에서 관련 세부정보를 확인하세요.

각 Repo 체크아웃은 매니페스트 파일에 의해 표현됩니다. Repo 체크아웃이 서로 다른 디렉터리에 존재한다면 한 번에 두 개 이상의 Repo 체크아웃이 있을 수 있습니다. 하지만 각 체크아웃과 빌드는 약 300GB에 달하며 계속 늘어나고 있으므로 체크아웃을 2개로 제한하거나 시스템에 보조 드라이브를 장착해야 합니다.

도움말: 공간을 확보하려면 다음과 같이 분기 디렉터리를 삭제하고 디렉터리 생성부터 새로 시작하세요.

rm -rf aosp2

코드 빌드

Android를 빌드하려면 타겟 기기 유형을 선택하여 lunch 명령어로 빌드해야 합니다. 타겟은 특정 모델 또는 폼 팩터와 같은 기기 순열입니다.

아래에 포함된 기기 타겟 aosp_cf_x86_phone-userdebug를 사용하면 실제 기기 없이 테스트할 수 있는 Cuttlefish 가상 Android 기기를 빌드할 수 있습니다.

대신 실제 기기를 빌드하고 업데이트하려면 다른 타겟을 선택한 후 기기 플래싱 관련 안내를 따르세요.

  1. 소스 코드 체크아웃의 루트에서 다음 명령어를 실행하여 Android 기기의 빌드 환경을 설정합니다.

    source build/envsetup.sh
    
  2. 다음과 같이 빌드 타겟을 lunch 명령어에 전달합니다.

    lunch aosp_cf_x86_phone-userdebug
    
  3. 다음을 이용하여 체크아웃 내 어디서나 코드를 빌드하세요.

    m
    

첫 빌드는 몇 시간이 걸릴 수 있습니다. 후속 빌드에서는 빌드 시간이 크게 짧아집니다.

Acloud 인스턴스 만들기

Acloud는 AOSP의 명령줄 도구로 사용자가 가상 Android 기기(여기서는 Cuttlefish)를 생성하도록 지원합니다.

코드를 빌드하는 데 사용된 세션과 동일한 터미널 세션을 실행 중이라면 계속 진행합니다. 그렇지 않다면, envsetup.sh 스크립트 및 처음에 사용했던 명령어와 동일한 lunch 명령어를 다시 실행합니다. 그리고 다음 단계를 진행합니다.

  1. 다음을 사용하여 Acloud 로컬 인스턴스를 만듭니다.

    acloud create --local-image --local-instance
    
  2. 필수 패키지 업데이트를 수락합니다.

  3. 메시지가 표시되면 워크스테이션을 다시 시작하여 모든 변경사항이 적용되도록 합니다.

  4. Cuttlefish 기기를 선택합니다.

Android 기기가 포함된 VNC 세션이 표시됩니다.

워크스테이션에서 마우스와 키보드를 사용하여 가상 기기와 상호작용할 수 있습니다. 다음과 같이 Android 디버그 브리지(adb)의 logcat 명령어로 기기를 사용하는 동안 로그에서 활동을 추적할 수 있습니다.

adb logcat

변경사항 적용

변경 목록 예에 따라 소스 코드를 업데이트합니다.

  1. 체크아웃의 루트(aosp/ 디렉터리)에서 frameworks/native Git 프로젝트로 이동합니다.

    cd frameworks/native
    
  2. 다음과 같이 임시 프로젝트를 시작합니다.

    repo start <some-name> .
    
  3. SurfaceFlinger.cpp를 수정하여 다음 위치에서 변경 목록의 업데이트를 포함합니다.

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
    
  4. 다음과 같이 코드를 빌드합니다.

    m
    
  5. 기기에서 빌드를 업데이트합니다.

    adb root
    adb remount
    adb sync
    adb reboot
    acloud reconnect
    

기기에서 색상이 변경된 것을 볼 수 있습니다.

코드 테스트

Codelab의 이 부분에서는 실패하도록 구현된 소스 트리의 테스트 예를 살펴보겠습니다. 로컬에서 테스트를 실행하기 위해 Atest를 사용하여 코드를 테스트합니다.

테스트를 사용하려면 다음 단계를 따릅니다.

  1. 다음을 실행합니다.

    atest DevCodelabTest
    
  2. 테스트가 실패합니다. 이제 문제를 해결해 보겠습니다. 다음과 같이 실패한 테스트의 소스 코드를 찾습니다.

    atest --info android.test.example.devcodelab.DevCodelabTest#testHelloWorld
    
  3. 다음 내부를 살펴봅니다.

    platform_testing/tests/example/devcodelab
    
  4. 수정하려는 파일의 이름으로는 테스트 이름을 사용하고 ./로 바꿉니다.

    android.test.example.devcodelab.DevCodelabTest
    

    위의 내용이 아래와 같이 변합니다.

    src/android/test/example/devcodelab/DevCodelabTest.java
    
  5. 이제 다음 파일을 수정합니다.

    platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
    

    다음 코드를

    Assert.assertTrue(false)
    

    아래로 대체합니다.

    Assert.assertTrue(true)
    
  6. 테스트를 다시 실행하여 테스트가 수정되었는지 확인합니다.

    atest DevCodelabTest
    

검토를 위해 코드 업로드

Repo는 여러 Git 저장소(또는 프로젝트)에서 동시에 작업할 수 있도록 git clone과 같은 명령어를 번들로 묶어 Git의 사용을 간소화합니다.

소스 컨트롤 도구에서 Android 소스 코드 작업에 관한 전체 문서 링크가 포함된 Git 및 Repo 개요를 참조하세요. 각 프로젝트와 연결된 분기의 Git 프로젝트 및 개별 프로젝트(경로)의 전체 목록은 AOSP 저장소를 참조하세요.

Git 프로젝트인 경우 Gerrit 웹 기반 코드 검토 시스템을 사용합니다.

  1. 변경사항이 frameworks/native 프로젝트에 적용된다고 가정하고 다음 명령어를 실행합니다.

    cd frameworks/native
    repo start codelab .
    git add .
    git commit
    
  2. 커밋 메시지에 다음을 입력합니다.

    Android codelab change
    Test: manual atest
    
  3. 변경사항을 업로드합니다.

    repo upload
    

성공하면 다음과 같은 메시지가 표시됩니다.

Upload project frameworks/native/ to remote branch master:
  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/master

Gerrit에서 변경사항 확인

다음과 같이 터미널에 출력된 링크로 이동합니다.

https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432

Android 플랫폼 개발을 위한 입문자용 Codelab이 완성되었습니다. 다음 단계로 넘어가려면 패치 제출을 참조하고 Android 개발에 관한 전체 세부정보를 보려면 이 사이트의 나머지 부분을 확인하세요.

변경사항 되돌리기

일반적으로는 테스트 및 검토/승인 후 변경사항을 Gerrit에 제출하고 저장소에 병합합니다.

하지만 여기서는 Codelab의 목적에 맞게 Gerrit에서 Abandon을 클릭하여 변경 목록을 되돌립니다.

그런 다음 프레임워크/네이티브 프로젝트 디렉터리(또는 하위 디렉터리)에서 연결된 임시 분기를 종료합니다.

repo abandon codelab .

테스트 파일의 변경사항을 되돌리는 것도 잊지 마세요. 변경사항을 repo start, git commitrepo upload하지 않았기 때문에 파일 자체를 다음과 같이 재설정할 수만 있습니다(현재 aosp/platform_testing directory에 있다고 가정).

git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
git checkout .

이제 완료되었습니다. 훌륭합니다.

도움말 보기

Codelab을 진행하는 동안 오류가 발생하면 페이지 하단에 있는 사이트 의견 링크를 사용하여 오류를 신고해 주세요. android-building 그룹에 질문을 보낼 수 있습니다.