커널 빌드

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

이 페이지에서는 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 트리의 이진 경로 레포 브랜치
Pixel 7(표범)
Pixel 7 Pro(치타)
장치/google/pantah-커널 android-gs-pantah-5.10-android13-qpr1
Pixel 6a(블루제이) 기기/구글/블루제이-커널 android-gs-bluejay-5.10-android13-qpr1
Pixel 6(오리올)
Pixel 6 Pro(레이븐)
device/google/raviole-커널 android-gs-라비올-5.10-android13-qpr1
Pixel 5a(바베트)
픽셀 5(레드핀)
Pixel 4a(5G)(나무)
기기/google/redbull-kernel android-msm-redbull-4.19-android13-qpr1
Pixel 4a(개복치) 장치/google/sunfish-커널 android-msm-sunfish-4.14-android13-qpr1
Pixel 4(불꽃)
Pixel 4 XL(코랄)
기기/google/coral-kernel android-msm-coral-4.14-android13
픽셀 3a(사르고)
Pixel 3a XL(가다랭이)
device/google/bonito-kernel android-msm-bonito-4.9-android12L
Pixel 3(파란색)
Pixel 3 XL(크로스해칭)
기기/google/crosshatch-kernel android-msm-crosshatch-4.9-android12
Pixel 2(월아이)
Pixel 2 XL(태문)
장치/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
픽셀(돛새치)
Pixel XL(청새치)
장치/google/marlin-kernel android-msm-marlin-3.18-파이-qpr2
하이키960 장치/linaro/hikey-커널 하이킹-리나로-안드로이드-4.14
하이킹-리나로-안드로이드-4.19
공통 android12-5.4
공통 android13-5.10
비글 x15 장치/ti/beagle_x15-커널 omap-비글-x15-안드로이드-4.14
omap-비글-x15-안드로이드-4.19
안드로이드 공통 커널 해당 없음 공통 안드로이드-4.4
공통 안드로이드-4.9
공통 안드로이드-4.14
공통 안드로이드-4.19
공통 안드로이드-4.19-안정
공통 android11-5.4
공통 android12-5.4
공통 android12-5.10
공통 android13-5.10
공통 android13-5.15
공통 android14-5.15
공통 안드로이드 메인라인

커널 빌드

그런 다음 다음과 같이 커널을 빌드합니다.

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 및 Emulator)을 보여줍니다.

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 (Kleaf)로 커널 빌드를 도입했습니다.

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 지원을 나열합니다. 목록에 없는 장치의 경우 장치 제조업체에 문의하십시오.

장치 레포 브랜치 Kleaf 지원 build/build.sh 지원
안드로이드 공통 커널
db845c
가상 장치(x86_64, arm64)
가상 장치(i686, arm)
록파이4
공통 안드로이드-4.4
공통 안드로이드-4.9
공통 안드로이드-4.14
공통 안드로이드-4.19
공통 안드로이드-4.19-안정
공통 android11-5.4
공통 android12-5.4
공통 android12-5.10
안드로이드 공통 커널 공통 android13-5.10
공통 android13-5.15
✅ (공식) 1
안드로이드 공통 커널 공통 android14-5.15
공통 안드로이드 메인라인
db845c 공통 android13-5.10
db845c 공통 android13-5.15 ✅ (공식) 1
db845c 공통 android14-5.15
공통 안드로이드 메인라인
가상 장치(x86_64, arm64) 공통 android13-5.10
공통 android13-5.15
✅ (공식) 1 ⚠️ (유지되지 않음) 2
가상 장치(x86_64, arm64) 공통 android14-5.15
공통 안드로이드 메인라인
가상 장치(i686, arm) 공통 android13-5.10
공통 android13-5.15
가상 장치(i686, arm) 공통 android14-5.15
공통 안드로이드 메인라인
록파이4 공통 android13-5.10
공통 android13-5.15
록파이4 공통 android14-5.15
공통 안드로이드 메인라인
하이키960 하이킹-리나로-안드로이드-4.14
하이킹-리나로-안드로이드-4.19
공통 android12-5.4
공통 android13-5.10
fips140 모듈 공통 android12-5.10
공통 android13-5.10
공통 android13-5.15
fips140 모듈 공통 android14-5.15

1 "공식"은 커널을 빌드하는 데 다른 방법을 사용할 수도 있지만 이것이 커널을 빌드하는 공식적인 방법임을 의미합니다.

2 "관리되지 않음"은 이 방법으로 커널 빌드가 작동해야 하지만 빌드 방법이 지속적으로 테스트되지 않음을 의미합니다. 향후 구축이 중단될 수 있습니다. 대신 "공식적인" 방법을 사용하여 빌드하십시오.

커널 실행

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

Android 이미지 빌드에 포함

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

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

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

fastboot로 커널 플래싱 및 부팅

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

플래싱 없이 커널을 부팅하려면:

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

로컬 빌드를 위한 사용자 지정 커널 구성

예를 들어 기능을 작업할 때 커널 구성 옵션을 정기적으로 전환해야 하거나 개발 목적으로 옵션을 설정해야 하는 경우 빌드 구성의 로컬 수정 또는 복사본을 유지하여 이러한 유연성을 얻을 수 있습니다.

POST_DEFCONFIG_CMDS 변수를 일반적인 make defconfig 단계가 완료된 직후 평가되는 명령문으로 설정합니다. build.config 파일이 빌드 환경에 제공되므로 build.config 에 정의된 함수를 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

부트 이미지 빌드

커널 빌드 환경을 사용하여 부트 이미지를 빌드할 수 있습니다. 이렇게 하려면 GKI 부팅 이미지를 다운로드하고 압축을 풀어 얻을 수 있는 ramdisk 바이너리가 필요합니다. 연결된 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 빌드 아티팩트를 다운로드하고 이를 ramdisk 바이너리로 사용할 수 있습니다.

ramdisk 바이너리가 있고 커널 빌드의 루트 디렉터리에 있는 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 기반 아키텍처로 작업하는 경우 ImagebzImageaarch64x86_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 에 있습니다.