패치 제출

이 페이지에서는 Gerrit으로 변경사항을 추적하고 검토를 요청하는 방법을 포함하여, Android 오픈소스 프로젝트(AOSP)에 패치를 제출하는 전체 프로세스를 설명합니다.

기본 요건

먼저 다음을 완료했는지 확인하세요.

리소스

  • Repo 및 Git에 관한 자세한 내용은 소스 제어 도구 페이지를 참고하세요.
  • Android 오픈소스 커뮤니티 내의 다양한 역할에 관한 정보는 프로젝트 역할 페이지를 참고하세요.
  • Android 플랫폼 코드 개발에 관한 라이선스 정보는 라이선스 페이지를 참고하세요.

기여자

서버로 인증

다른 사용자와 IP 주소를 공유하면 일반적인 사용 패턴에 관해서도 할당량이 트리거될 수 있습니다. 예를 들어 여러 사용자가 짧은 기간 내에 같은 IP 주소에서 새 클라이언트를 동기화할 때 이러한 상황이 발생할 수 있습니다. 인증된 액세스는 IP 주소와 상관없이 각 사용자에 관해 별도의 할당량을 사용합니다. 인증된 액세스 활성화에 관한 내용을 읽어보려면 인증 사용을 참고하세요.

Repo 브랜치 시작

적용하려는 각 변경사항에 관해 관련 Git 저장소 내에서 새 브랜치를 시작합니다.

repo start NAME .

같은 저장소에서 동시에 여러 독립 브랜치를 시작할 수 있습니다. 브랜치 NAME은 작업공간 기준에서 로컬이며, Gerrit 또는 최종 소스 트리에 포함되지 않습니다.

변경하기

소스 파일을 수정하고 변경사항을 확인합니다.

다음 명령어를 사용하여 로컬 저장소에 변경사항을 커밋합니다.

git add -A
git commit -s

변경 설명

  • 1행: 제목

    한 줄 요약(최대 50자, 영문 기준)을 제공합니다.

    이 형식은 Git 및 Gerrit에 의해 다양한 표시 용도로 사용됩니다. 커밋 메시지에서 가장 중요하고 가장 밀도 높은 부분입니다. 변경한 영역을 설명하는 데 접두사를 사용한 후 이 커밋에서 변경한 내용에 관해 설명해 보세요. 접두사로 ui가 있는 다음을 예로 들 수 있습니다.

    ui: Removes deprecated widget

  • 2행: 공백

    이 줄은 항상 비워두세요.

  • 3행: 본문

    이 줄부터는 더 긴 설명을 입력합니다.

    최대 72자(영문 기준)에서 강제 줄바꿈을 해야 합니다. 변경사항으로 어떤 문제를 어떻게 해결하는지 설명합니다. 새로운 기능을 구현할 때 선택사항이지만 나중에 다른 사용자가 특히 디버깅에 이 변경사항을 참고하면 매우 유용합니다.

    다른 기여자가 이 기능으로 작업할 때 중요할 수 있는 모든 가정에 관한 간단한 참고사항이나 배경 정보를 포함합니다.

repo init 도중에 제공된 고유 변경 ID와 이름 및 이메일은 자동으로 커밋 메시지에 추가됩니다.

다음은 커밋 메시지의 예입니다.

Line 1, Headline - a short description

Line 3, Body - Add the detailed description of your patch here. Use as many lines
as needed. You can write an overall description, then list specifics.

I6e3c64e7a:Added a new widget.
I60c539a8f:Fixed the spinning image.
좋은 커밋 설명(예 포함)에 관한 블로그를 읽으려면 크리스 빔스가 작성한 Git 커밋 메시지 작성 방법을 참고하세요.

Gerrit에 업로드

변경사항을 개인 기록에 커밋한 후에는 다음 명령어를 사용하여 Gerrit에 업로드합니다.

repo upload

동일한 저장소에서 여러 브랜치를 시작한 경우 업로드할 브랜치를 선택하라는 메시지가 표시됩니다.

업로드에 성공하면 Repo는 Gerrit의 새 페이지 URL을 제공합니다. Repo에서 제공하는 링크를 클릭하여 검토 서버에서 패치를 확인하거나 의견을 추가하거나 특정 패치 검토자를 요청합니다.

검토 요청

Gerrit에 변경사항을 업로드한 후에는 적절한 코드 소유자의 패치 검토 및 승인을 받아야 합니다. OWNERS 파일에서 코드 소유자를 찾습니다.

적절한 코드 소유자를 찾아 변경사항의 검토자로 추가하려면 다음 단계를 따르세요.

  1. Gerrit UI에서 SUGGEST OWNERS(소유자 추천) 링크를 선택하여 패치에 있는 파일의 코드 소유자 목록을 확인합니다.

    Gerrit의 소유자 추천 링크
    그림 1. Gerrit의 소유자 추천 링크
  2. 목록에 있는 코드 소유자를 패치의 검토자로 추가합니다.

패치에 있는 파일 상태를 확인하려면 패치의 파일 옆에 있는 다음 아이콘을 확인하세요.

  • (체크표시 아이콘): 코드 소유자가 승인함
  • (X 표시 아이콘): 코드 소유자가 승인하지 않음
  • (시계 아이콘): 코드 소유자의 승인 대기 중
그림 2. 코드 소유자의 승인 상태를 나타내는 아이콘이 있는 파일 예

교체 패치 업로드

검토자가 패치를 살펴본 후 약간의 수정을 요청했다고 가정해 보겠습니다. Git 내에서 커밋을 수정할 수 있으며, 이렇게 할 경우 원본과 동일한 변경 ID와 함께 Gerrit에 관한 새 패치가 생성됩니다.

git add -A
git commit --amend

수정된 패치를 업로드하면 이 패치가 Gerrit 및 로컬 Git 기록의 원본을 대체합니다.

동기화 충돌 해결

본인의 것과 충돌하는 소스 트리에 다른 패치가 제출되면 소스 저장소의 새로운 HEAD 위에 패치를 리베이스합니다. 이렇게 하려면 다음 명령어를 실행합니다.

repo sync

repo sync 명령어는 먼저 소스 서버에서 업데이트를 가져온 다음 HEAD를 새로운 원격 HEAD에 자동으로 리베이스하려고 합니다.

자동 리베이스에 실패하면 수동으로 리베이스를 실행합니다.

repo rebase

리베이스 충돌을 처리하는 또 다른 도구는 git mergetool입니다. 충돌하는 파일을 정상적으로 병합한 후에는 다음 명령어를 실행합니다.

git rebase --continue

자동 또는 수동 리베이스가 완료된 후 repo upload를 실행하여 리베이스된 패치를 제출합니다.

제출 승인 후

제출한 내용이 검토 및 인증 프로세스를 거치고 나면 Gerrit은 자동으로 변경사항을 공개 저장소에 병합합니다. 다른 사용자는 repo sync를 실행하여 업데이트를 각 로컬 클라이언트로 가져올 수 있습니다.

업스트림 프로젝트

Android 소프트웨어 관리에 설명된 대로 Android는 Linux 커널 및 WebKit와 같은 다른 여러 오픈소스 프로젝트를 사용합니다. external/에 속한 대부분의 프로젝트에서는 변경사항을 업스트림에 적용한 다음 Android 유지관리자에게 변경사항이 포함된 새로운 업스트림 버전을 알립니다.

새로운 업스트림 버전을 추적하는 패치를 업로드할 수도 있습니다. 일반적으로 버전이 출시될 때마다 업그레이드되는 아래에 언급된 대부분의 대규모 프로젝트처럼 Android 내에서 프로젝트가 널리 사용되는 경우 변경사항을 적용하기가 어려울 수 있습니다.

한 가지 흥미로운 특수 사례는 Bionic입니다. 대부분의 Bionic 코드는 BSD에서 가져옵니다. 따라서 변경사항이 Bionic의 새로운 코드에 적용되지 않는 한 업스트림 수정을 실행한 다음 적절한 BSD에서 완전히 새로운 파일을 가져옵니다.

Android 커널

모든 변경사항을 업스트림으로 만듭니다. 일반 안내는 Android 커널 참여 가이드라인GKI용 커널 코드 개발 페이지를 참고하세요.

ICU

ICU-TC 홈페이지external/icu(icu4c/icu4j/ 폴더)에서 ICU 프로젝트에 관한 모든 변경사항을 적용합니다. 자세한 내용은 ICU 버그 및 기능 요청 제출을 참고하세요. 모든 업스트림 Jira 요청에 'android' 라벨을 추가합니다.

CLDR

ICU의 언어 데이터는 대부분 유니코드 CLDR 프로젝트에서 가져옵니다. CLDR에 기여에 따라 모든 요청 업스트림을 제출하고 'android' 라벨을 추가합니다.

LLVM/Clang/Compiler-rt

LLVM 컴파일러 인프라 페이지에서 LLVM 관련 프로젝트(external/clang, external/compiler-rt, external/llvm)에 관한 모든 변경을 실행합니다.

mksh

mirbsd.org 도메인의 miros-mksh(구독 없이 제출 가능) 또는 Launchpad로 이메일을 보내어 external/mksh에서 MirBSD Korn Shell 프로젝트에 관한 모든 변경을 실행합니다.

OpenSSL

OpenSSL 페이지external/openssl에서 OpenSSL 프로젝트에 관한 모든 변경을 실행합니다.

V8

V8 문제 페이지external/v8에서 V8 프로젝트에 관한 모든 변경사항을 제출합니다. 자세한 내용은 V8에 기여를 참고하세요.

WebKit

WebKit 페이지external/webkit에서 WebKit 프로젝트에 관한 모든 변경을 실행합니다. WebKit 버그를 신고하여 프로세스를 시작합니다. Android와 관련된 버그인 경우에만 버그에서 PlatformOS 필드에 Android를 사용합니다. 버그는 수정 제안이 추가되고 테스트가 포함된 이후 검토자의 주목을 받을 가능성이 훨씬 높습니다. 자세한 내용은 WebKit에 코드 기여를 참고하세요.

zlib

zlib 홈페이지external/zlib에서 zlib 프로젝트에 관한 모든 변경을 실행합니다.