커널 빌드

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

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

이전 커널 또는 아래 나열되지 않은 커널의 경우 기존 커널 빌드 방법에 관한 안내를 참조하세요.

소스 및 빌드 도구 다운로드

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

해당하는 분기의 소스를 다운로드합니다.

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

다음 표는 이 방법을 통해 사용할 수 있는 커널의 BRANCH 이름을 나열합니다.

기기 AOSP 트리의 바이너리 경로 Repo 브랜치
Pixel 4(flame)
Pixel 4 XL(coral)
device/google/coral-kernel android-msm-coral-4.14-android10
Pixel 3a(sargo)
Pixel 3a XL(bonito)
device/google/bonito-kernel android-msm-bonito-4.9-android10
Pixel 3(blueline)
Pixel 3 XL(crosshatch)
device/google/crosshatch-kernel android-msm-crosshatch-4.9-android10
Pixel 2(walleye)
Pixel 2 XL(taimen)
device/google/wahoo-kernel android-msm-wahoo-4.4-android10
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-android-5.4
Beagle x15 device/ti/beagle_x15-kernel omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
Android 공통 커널 N/A common-android-4.4
common-android-4.9
common-android-4.14
common-android-4.19
common-android-5.4
common-android-mainline

커널 빌드

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

build/build.sh

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

커널 실행

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

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

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

커널 빌드 맞춤설정

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

환경 변수 설명
BUILD_CONFIG 빌드 환경을 초기화하는 구성 파일을 빌드합니다. 위치는 Repo 루트 디렉터리를 기준으로 정의됩니다. 기본값은 build.config입니다.
일반 커널의 필수 항목입니다.
BUILD_CONFIG=common/build.config.cuttlefish.x86_64
OUT_DIR 커널 빌드의 기본 출력 디렉터리입니다. OUT_DIR=/path/to/my/out
DIST_DIR 커널 배포를 위한 기본 출력 디렉터리입니다. OUT_DIR=/path/to/my/dist
CC 사용할 컴파일러를 재정의합니다. build.config에 의해 정의된 기본 컴파일러로 돌아갑니다. CC=clang
SKIP_MRPROPER make mrproper 건너뛰기 SKIP_MRPROPER=1
SKIP_DEFCONFIG make defconfig 건너뛰기 SKIP_DEFCONFIG=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 트리에는 사전 빌드된 커널 버전이 포함되어 있습니다. 대부분 git 로그는 커밋 메시지의 일부로 올바른 버전을 표시합니다.

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

시스템 이미지에서 커널 버전

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

file kernel

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

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