커널 빌드

이 페이지에서는 Android 기기용 맞춤 커널 빌드 과정을 자세히 설명합니다. 다음 안내에서는 올바른 소스를 선택하고, 커널을 빌드하며, 결과를 Android 오픈소스 프로젝트(AOSP)에서 빌드한 시스템 이미지에 삽입하는 과정을 안내합니다.

Repo를 사용하여 최신 커널 소스를 가져올 수 있습니다. 즉, 소스 체크아웃의 루트에서 build/build.sh를 실행하여 추가 구성 없이 최신 커널 소스를 빌드할 수 있습니다.

소스 및 빌드 도구 다운로드

최신 커널의 경우 repo를 사용하여 소스, 도구 모음 및 빌드 스크립트를 다운로드합니다. 일부 커널(예: Pixel 3 커널)은 여러 git 저장소의 소스를 필요로 하며, 다른 커널(예: 일반 커널)은 단일 소스만 필요합니다. repo 접근 방식을 사용하면 소스 디렉터리를 올바르게 설정할 수 있습니다.

해당하는 브랜치의 소스를 다운로드합니다.

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
repo sync

다음 표에서 이 방법을 통해 사용할 수 있는 커널의 BRANCH 이름을 확인할 수 있습니다.

기기 AOSP 트리의 바이너리 경로 Repo 브랜치
Pixel 7(panther)
Pixel 7 Pro(cheetah)
device/google/pantah-kernel android-gs-pantah-5.10-android13-qpr2
Pixel 6a(bluejay) device/google/bluejay-kernel android-gs-bluejay-5.10-android13-qpr2
Pixel 6(oriole)
Pixel 6 Pro(raven)
device/google/raviole-kernel android-gs-raviole-5.10-android13-qpr2
Pixel 5a(barbet)
Pixel 5(redfin)
Pixel 4a(5G)(bramble)
device/google/redbull-kernel android-msm-redbull-4.19-android13-qpr2
Pixel 4a(sunfish) device/google/sunfish-kernel android-msm-sunfish-4.14-android13-qpr2
Pixel 4(flame)
Pixel 4 XL(coral)
device/google/coral-kernel android-msm-coral-4.14-android13
Pixel 3a(sargo)
Pixel 3a XL(bonito)
device/google/bonito-kernel android-msm-bonito-4.9-android12L
Pixel 3(blueline)
Pixel 3 XL(crosshatch)
device/google/crosshatch-kernel android-msm-crosshatch-4.9-android12
Pixel 2(walleye)
Pixel 2 XL(taimen)
device/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
Pixel(sailfish)
Pixel XL(marlin)
device/google/marlin-kernel android-msm-marlin-3.18-pie-qpr2
Hikey960 device/linaro/hikey-kernel hikey-linaro-android-4.14
hikey-linaro-android-4.19
common-android12-5.4
common-android13-5.10
Beagle x15 device/ti/beagle_x15-kernel omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
Android 공통 커널 해당 사항 없음 common-android-4.4
common-android-4.9
common-android-4.14
common-android-4.19
common-android-4.19-stable
common-android11-5.4
common-android12-5.4
common-android12-5.10
common-android13-5.10
common-android13-5.15
common-android14-5.15
common-android14-6.1
common-android-mainline

커널 빌드

그 후 다음을 사용하여 커널을 빌드합니다.

build/build.sh

커널 바이너리, 모듈, 해당하는 이미지는 out/BRANCH/dist 디렉터리에 있습니다.

Bazel로 빌드(Kleaf)

Android 13에서는 build/build.sh를 대체하는 Bazel을 사용하여 커널을 빌드하는 방식을 도입했습니다.

aarch64 아키텍처용 GKI 커널을 빌드하려면 Android 13 이상의 Android 공통 커널 브랜치를 체크 아웃한 후 다음 명령어를 실행합니다.

tools/bazel build //common:kernel_aarch64_dist

배포를 만들려면 다음을 실행합니다.

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

이후 커널 바이너리, 모듈, 해당하는 이미지는 $DIST_DIR 디렉터리에 있습니다. --dist_dir이 지정되지 않은 경우 아티팩트 위치에 대한 명령어 출력을 참고하시기 바랍니다. 자세한 내용은 AOSP에 관한 문서를 참고하세요.

가상 기기의 공급업체 모듈 빌드

Android 11에서는 커널을 Google에서 관리하는 커널 이미지, 그리고 별도로 빌드되어 공급업체에서 관리하는 모듈로 분리하는 GKI가 도입되었습니다.

이 예에서는 커널 이미지 구성을 보여줍니다.

BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

이 예에서는 모듈 구성(Cuttlefish 및 에뮬레이터)을 보여줍니다.

BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 build/build.sh

Android 12에서는 Cuttlefish와 Goldfish가 통합되므로 동일한 커널(virtual_device)을 공유합니다. 이 커널의 모듈을 빌드하려면 다음 빌드 구성을 사용하세요.

BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh

Android 13에서는 build.sh를 대체하는 Bazel을 사용하여 커널을 빌드하는 방식을 도입했습니다.

virtual_device의 모듈을 빌드하려면 다음을 실행합니다.

tools/bazel build //common-modules/virtual-device:virtual_device_x86_64_dist

배포를 만들려면 다음을 실행합니다.

tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=$DIST_DIR

Bazel을 사용하여 Android 커널을 빌드하는 방법에 관한 자세한 내용은 Kleaf - Bazel을 사용하여 Android 커널 빌드를 참고하세요.

개별 아키텍처에 맞는 Kleaf 지원에 관한 자세한 내용은 기기 및 커널을 위한 Kleaf 지원을 참고하세요.

기기 및 커널을 위한 Kleaf 지원

다음 표에는 개별 기기 커널에 관한 Kleaf 지원이 나와 있습니다. 표에 나와있지 않은 기기의 경우 기기 제조업체에 문의하세요.

기기 Repo 브랜치 Kleaf 지원 build/build.sh 지원
Android 공통 커널
db845c
가상 기기(x86_64, arm64)
가상 기기(i686, arm)
Rockpi4
common-android-4.4
common-android-4.9
common-android-4.14
common-android-4.19
common-android-4.19-stable
common-android11-5.4
common-android12-5.4
common-android12-5.10
Android 공통 커널 common-android13-5.10
common-android13-5.15
✅(공식)1
Android 공통 커널 common-android14-5.15
common-android14-6.1
common-android-mainline
db845c common-android13-5.10
db845c common-android13-5.15 ✅(공식)1
db845c common-android14-5.15
common-android14-6.1
common-android-mainline
가상 기기(x86_64, arm64) common-android13-5.10
common-android13-5.15
✅(공식)1 ⚠️(관리되지 않음)2
가상 기기(x86_64, arm64) common-android14-5.15
common-android14-6.1
common-android-mainline
가상 기기(i686, arm) common-android13-5.10
common-android13-5.15
가상 기기(i686, arm) common-android14-5.15
common-android14-6.1
common-android-mainline
Rockpi4 common-android13-5.10
common-android13-5.15
Rockpi4 common-android14-5.15
common-android14-6.1
common-android-mainline
Hikey960 hikey-linaro-android-4.14
hikey-linaro-android-4.19
common-android12-5.4
common-android13-5.10
fips140 모듈 common-android12-5.10
common-android13-5.10
common-android13-5.15
fips140 모듈 common-android14-5.15

1'공식'은 커널을 빌드하는 공식적인 방법이며, 커널을 빌드하는 데 다른 방법을 사용할 수도 있음을 의미합니다.

2'관리되지 않음'은 이 메서드로 커널을 빌드할 수 있어야 하지만, 이 빌드 메서드를 계속 테스트하지는 않는다는 의미입니다. 향후 빌드가 중지될 수 있습니다. '공식'적인 방법을 사용하여 빌드하세요.

커널 실행

맞춤 빌드 커널을 실행하는 방법에는 여러 가지가 있습니다. 다음은 다양한 개발 시나리오에 적합한 알려진 방법입니다.

Android 이미지 빌드에 삽입

AOSP 트리 내의 각 커널 바이너리 위치에 Image.lz4-dtb를 복사하고 부팅 이미지를 다시 빌드합니다.

아니면 make bootimage(또는 부팅 이미지를 만드는 기타 make 명령줄)를 사용하는 동안 TARGET_PREBUILT_KERNEL 변수를 정의합니다. 이 변수는 device/common/populate-new-device.sh를 통해 설정되므로 모든 기기에서 지원됩니다. 예:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

빠른 부팅으로 커널 플래싱 및 부팅

최신 기기에는 부팅 이미지 생성 및 부팅 프로세스를 간소화하는 부트로더 확장 프로그램이 있습니다.

플래싱하지 않고 커널을 부팅하려면 다음 단계를 따르세요.

adb reboot bootloader
fastboot boot Image.lz4-dtb

이 방법을 사용하면 커널이 실제로 플래싱되지 않으며 재부팅 시 지속되지 않습니다.

커널 빌드 맞춤설정

Kleaf 빌드용 커널 빌드를 맞춤설정하려면 Kleaf 문서를 참고하세요.

build/build.sh의 경우 빌드 프로세스와 결과는 환경 변수의 영향을 받을 수 있습니다. 대부분은 선택적이며 각 커널 브랜치에는 적절한 기본 구성이 있어야 합니다. 가장 많이 사용되는 항목이 여기에 나와 있습니다. 최신 전체 목록을 보려면 build/build.sh를 참고하세요.

환경 변수 설명
BUILD_CONFIG 빌드 환경을 초기화하는 빌드 구성 파일. 위치는 Repo 루트 디렉터리를 기준으로 정의되어야 합니다. 기본값은 build.config입니다.
일반 커널의 필수 항목입니다.
BUILD_CONFIG=common/build.config.gki.aarch64
CC 사용할 컴파일러를 재정의합니다. build.config에 의해 정의된 기본 컴파일러로 돌아갑니다. CC=clang
DIST_DIR 커널 배포를 위한 기본 출력 디렉터리입니다. DIST_DIR=/path/to/my/dist
OUT_DIR 커널 빌드의 기본 출력 디렉터리입니다. OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG make defconfig 건너뛰기 SKIP_DEFCONFIG=1
SKIP_MRPROPER make mrproper 건너뛰기 SKIP_MRPROPER=1

로컬 빌드용 맞춤설정 커널 구성

기능을 작업 중일 때와 같이 커널 구성 옵션을 정기적으로 전환할 필요가 있는 경우, 또는 개발 목적으로 옵션을 설정할 필요가 있는 경우 빌드 구성의 로컬 수정 또는 사본을 유지하여 유연성을 확보할 수 있습니다.

일반적인 make defconfig 단계가 완료된 직후에 평가되는 명령문에 변수 POST_DEFCONFIG_CMDS를 설정합니다. build.config 파일은 빌드 환경으로 제공되므로, build.config에서 정의된 함수는 post-defconfig 명령어의 일부로 호출될 수 있습니다.

가장 일반적인 경우는 개발 중에 크로스 해치 커널에 관한 링크 시간 최적화(LTO)를 사용 중지하는 것입니다. LTO는 출시된 커널에 유용하지만 빌드 시 오버헤드가 매우 클 수 있습니다. 로컬 build.config에 추가된 다음 스니펫은 build/build.sh 사용 시 LTO를 영구적으로 사용 중지합니다.

POST_DEFCONFIG_CMDS="check_defconfig && update_debug_config"
function update_debug_config() {
    ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
         -d LTO \
         -d LTO_CLANG \
         -d CFI \
         -d CFI_PERMISSIVE \
         -d CFI_CLANG
    (cd ${OUT_DIR} && \
     make O=${OUT_DIR} $archsubarch CC=${CC} CROSS_COMPILE=${CROSS_COMPILE} olddefconfig)
}

커널 버전 확인

빌드할 올바른 버전은 두 가지 소스 즉, AOSP 트리와 시스템 이미지에서 확인할 수 있습니다.

AOSP 트리의 커널 버전

AOSP 트리에는 사전 빌드된 커널 버전이 포함되어 있습니다. git 로그는 커밋 메시지의 일부로 올바른 버전을 표시합니다.

cd $AOSP/device/VENDOR/NAME
git log --max-count=1

커널 버전이 git 로그에 나와 있지 않으면 아래 설명처럼 시스템 이미지에서 커널 버전을 가져옵니다.

시스템 이미지의 커널 버전

시스템 이미지에 사용된 커널 버전을 확인하려면 커널 파일에 다음 명령어를 실행합니다.

file kernel

Image.lz4-dtb 파일의 경우 다음을 실행하세요.

grep -a 'Linux version' Image.lz4-dtb

부팅 이미지 빌드

커널 빌드 환경을 사용하여 부팅 이미지를 빌드할 수 있습니다.

init_boot로 기기의 부팅 이미지 빌드

init_boot 파티션이 있는 기기의 경우 부팅 이미지가 커널과 함께 빌드됩니다. initramfs 이미지는 부팅 이미지에 삽입되지 않습니다.

예를 들어 Kleaf를 사용하면 다음 명령어를 사용하여 GKI 부팅 이미지를 빌드할 수 있습니다.

tools/bazel run //common:kernel_aarch64_dist -- --dist_dir=$DIST_DIR

build/build.sh를 사용하면 다음을 설정하여 GKI 부팅 이미지를 빌드할 수 있습니다.

BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

GKI 부팅 이미지는 $DIST_DIR에 있습니다.

init_boot가 없는 기기의 부팅 이미지 빌드

init_boot 파티션이 없는 기기의 경우 램디스크 바이너리가 필요하며 이 바이너리는 GKI 부팅 이미지를 다운로드하고 압축해제하여 얻을 수 있습니다. 연결된 Android 버전의 모든 GKI 부팅 이미지를 사용 가능합니다.

tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv $KERNEL_ROOT/out/ramdisk gki-ramdisk.lz4

타겟 폴더는 커널 트리의 최상위 디렉터리(현재 작업 디렉터리)입니다.

AOSP 마스터로 개발하는 경우 대신 ci.android.com의 aosp_arm64 빌드에서 ramdisk-recovery.img 빌드 아티팩트를 다운로드하여 램디스크 바이너리로 사용할 수 있습니다.

램디스크 바이너리가 있고 커널 빌드의 루트 디렉터리에 있는 gki-ramdisk.lz4에 복사한 경우 다음을 실행하여 부팅 이미지를 생성할 수 있습니다.

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=Image GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

x86 기반 아키텍처를 사용하는 경우 ImagebzImage로, aarch64x86_64로 바꿉니다.

BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=bzImage GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

이 파일은 아티팩트 디렉터리 $KERNEL_ROOT/out/$KERNEL_VERSION/dist에 있습니다.

부팅 이미지는 out/<kernel branch>/dist/boot.img에 있습니다.