Android 개발자 Codelab

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

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

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

목표

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

  1. 플랫폼(운영체제)에서 작업하는 Android 엔지니어가 어떤 개발자 워크플로를 거치는지 알아봅니다.
  2. Android의 도구, 문서, 개발자 워크플로에 관한 의견을 제공해 봅니다.

기본 요건

이 Codelab의 요구사항 목록은 일반 플랫폼(AOSP) 개발 요구사항에서 파생됩니다. 이 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 -j8
    

초기 동기화에는 1시간 이상 걸릴 수 있습니다.

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

코드 빌드

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

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

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

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

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

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

    m
    

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

Acloud 인스턴스 만들기

Acloud는 AOSP의 명령줄 도구로, 사용자가 가상 Android 기기(이 경우 Cuttlefish)를 만드는 데 도움을 줍니다.

코드를 빌드하는 데 사용된 동일한 터미널 세션에 있다면 계속 진행합니다. 동일한 세션에 있는 게 아니라면 envsetup.sh 스크립트와 세션에서 처음 사용했던 동일한 lunch 명령어를 다시 실행합니다. 그런 다음

  1. 다음을 사용하여 Cuttlefish 가상 기기를 로컬에서 실행하는 데 필요한 종속 항목을 설치합니다.

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

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

    acloud create --local-image --local-instance
    
  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. 다음 줄을 찾습니다.

    postComposition();
    
  5. 이 두 줄을 다음으로 바꿉니다.

    postComposition();
    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});
    updateColorMatrixLocked();
    
  6. 다음과 같이 코드를 빌드합니다.

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

    adb root
    adb remount
    adb sync
    adb reboot
    acloud reconnect
    
  8. 기기를 선택하라는 메시지가 표시되면 가장 짧은 경과 시간을 보여주는 기기를 선택합니다. 일반적으로 목록의 마지막 기기입니다. 모든 가상 기기 인스턴스를 확인하려면 acloud listacloud list -v 명령어를 사용합니다.

그림 1과 같이 선택한 기기에서 색상이 변경되는지 확인합니다.

성공적인 색상 변경의 예

그림 1. 성공적인 색상 변경 후 화면 모습

코드 테스트

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 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에서 변경사항 확인

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

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

Android 플랫폼 개발을 위한 입문자용 Codelab을 완료했습니다. 패치 제출에서 다음 단계를 확인하고, Android 개발에 관한 자세한 내용은 이 사이트의 나머지 부분을 참고하세요.

변경사항 되돌리기

일반적으로 테스트 후 검토 및 승인 시 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 .

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

도움받기

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