이 페이지에서는 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 기반 아키텍처를 사용하는 경우 Image
를 bzImage
로, aarch64
를 x86_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
에 있습니다.