Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Xây dựng nhân

Trang này trình bày chi tiết quá trình xây dựng nhân tùy chỉnh cho thiết bị Android. Các hướng dẫn này hướng dẫn bạn qua quy trình chọn nguồn phù hợp, xây dựng nhân và nhúng kết quả vào hình ảnh hệ thống được xây dựng từ Dự án mã nguồn mở Android (AOSP).

Bạn có thể lấy các nguồn nhân mới hơn bằng cách sử dụng Repo ; xây dựng chúng mà không cần cấu hình thêm bằng cách chạy build/build.sh từ thư mục gốc của thanh toán nguồn của bạn.

Tải xuống các nguồn và công cụ xây dựng

Đối với các nhân gần đây, hãy sử dụng repo để tải xuống các nguồn, chuỗi công cụ và tập lệnh xây dựng. Một số nhân (ví dụ: nhân Pixel 3) yêu cầu nguồn từ nhiều kho git, trong khi những nhân khác (ví dụ: nhân thông thường) chỉ yêu cầu một nguồn duy nhất. Sử dụng phương pháp repo đảm bảo thiết lập thư mục nguồn chính xác.

Tải xuống các nguồn cho nhánh thích hợp:

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

Bảng sau đây liệt kê các tên BRANCH cho các hạt nhân có sẵn thông qua phương pháp này.

Thiết bị Đường dẫn nhị phân trong cây AOSP chi nhánh repo
Pixel 7 (con báo)
Pixel 7 Pro (con báo)
thiết bị/google/pantah-kernel android-gs-pantah-5.10-android13-qpr1
Pixel 6a (bluejay) thiết bị/google/bluejay-kernel android-gs-bluejay-5.10-android13-qpr1
Pixel 6 (hoa vàng anh)
Pixel 6 Pro (quạ)
thiết bị/google/raviole-kernel android-gs-raviole-5.10-android13-qpr1
Pixel 5a (đồ nướng)
Pixel 5 (vây đỏ)
Pixel 4a (5G) (mâm xôi)
thiết bị/google/redbull-kernel android-msm-redbull-4.19-android13-qpr1
Pixel 4a (cá thái dương) thiết bị/google/sunfish-kernel android-msm-sunfish-4.14-android13-qpr1
Pixel 4 (ngọn lửa)
Pixel 4 XL (san hô)
thiết bị/google/nhân san hô android-msm-san hô-4.14-android13
Pixel 3a (sang trọng)
Pixel 3a XL (cá ngừ)
thiết bị/google/bonito-kernel android-msm-bonito-4.9-android12L
Pixel 3 (đường màu xanh)
Pixel 3 XL (đường chéo)
thiết bị/google/nhân chéo android-msm-crosshatch-4.9-android12
Pixel 2 (thú rừng)
Pixel 2 XL (taimen)
thiết bị/google/wahoo-kernel android-msm-wahoo-4.4-android10-qpr3
Pixel (cá cờ)
Pixel XL (cá cờ)
thiết bị/google/nhân marlin android-msm-marlin-3.18-pie-qpr2
Hikey960 thiết bị/linaro/hikey-kernel hikey-linaro-android-4.14
hikey-linaro-android-4.19
chung-android12-5.4
chung-android13-5.10
Chó săn x15 thiết bị/ti/beagle_x15-kernel omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
Hạt nhân chung của Android không áp dụng chung-android-4.4
chung-android-4.9
chung-android-4.14
chung-android-4.19
chung-android-4.19-ổn định
chung-android11-5.4
chung-android12-5.4
chung-android12-5.10
chung-android13-5.10
chung-android13-5.15
chung-android14-5.15
chung-android14-6.1
chung-android-mainline

Xây dựng hạt nhân

Sau đó xây dựng kernel với cái này:

build/build.sh

Nhị phân hạt nhân, mô-đun và hình ảnh tương ứng được đặt trong thư mục out/ BRANCH /dist .

Xây dựng với Bazel (Kleaf)

Android 13 đã giới thiệu kernel xây dựng với Bazel , thay thế build/build.sh .

Để xây dựng nhân GKI cho kiến ​​trúc aarch64, hãy xem nhánh Android Common Kernel không sớm hơn Android 13 rồi chạy lệnh sau:

tools/bazel build //common:kernel_aarch64_dist

Để tạo một bản phân phối, hãy chạy:

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

Sau đó, nhị phân hạt nhân, mô-đun và hình ảnh tương ứng được đặt trong thư mục $DIST_DIR . Nếu --dist_dir không được chỉ định, hãy xem đầu ra của lệnh để biết vị trí của các tạo phẩm. Để biết chi tiết, hãy tham khảo tài liệu về AOSP .

Xây dựng các mô-đun nhà cung cấp cho thiết bị ảo

Android 11 đã giới thiệu GKI , tách hạt nhân thành hình ảnh hạt nhân do Google duy trì và các mô-đun do nhà cung cấp duy trì, được xây dựng riêng.

Ví dụ này cho thấy cấu hình ảnh hạt nhân:

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

Ví dụ này hiển thị cấu hình mô-đun (Cuttlefish và Emulator):

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

Trong Android 12, Cuttlefish và Goldfish hội tụ, vì vậy chúng có chung một nhân: virtual_device . Để xây dựng các mô-đun của hạt nhân đó, hãy sử dụng cấu hình bản dựng này:

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

Android 13 đã giới thiệu hạt nhân xây dựng với Bazel (Kleaf), thay thế build.sh .

Để xây dựng các mô-đun của virtual_device , hãy chạy:

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

Để tạo một bản phân phối, hãy chạy:

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

Để biết thêm chi tiết về cách xây dựng nhân Android với Bazel, hãy xem. Kleaf - Xây dựng hạt nhân Android với Bazel .

Để biết chi tiết về hỗ trợ Kleaf cho các kiến ​​trúc riêng lẻ, hãy xem hỗ trợ Kleaf cho thiết bị và hạt nhân .

Hỗ trợ Kleaf cho các thiết bị và hạt nhân

Bảng sau liệt kê hỗ trợ Kleaf cho các nhân thiết bị riêng lẻ. Đối với các thiết bị không được liệt kê, vui lòng liên hệ với nhà sản xuất thiết bị.

Thiết bị chi nhánh repo hỗ trợ Kleaf hỗ trợ build/build.sh
Hạt nhân chung của Android
db845c
Thiết bị ảo (x86_64, arm64)
Thiết bị ảo (i686, cánh tay)
rockpi4
chung-android-4.4
chung-android-4.9
chung-android-4.14
chung-android-4.19
chung-android-4.19-ổn định
chung-android11-5.4
chung-android12-5.4
chung-android12-5.10
Hạt nhân chung của Android chung-android13-5.10
chung-android13-5.15
✅ (chính thức) 1
Hạt nhân chung của Android chung-android14-5.15
chung-android14-6.1
chung-android-mainline
db845c chung-android13-5.10
db845c chung-android13-5.15 ✅ (chính thức) 1
db845c chung-android14-5.15
chung-android14-6.1
chung-android-mainline
Thiết bị ảo (x86_64, arm64) chung-android13-5.10
chung-android13-5.15
✅ (chính thức) 1 ⚠️ (không rõ ràng) 2
Thiết bị ảo (x86_64, arm64) chung-android14-5.15
chung-android14-6.1
chung-android-mainline
Thiết bị ảo (i686, cánh tay) chung-android13-5.10
chung-android13-5.15
Thiết bị ảo (i686, cánh tay) chung-android14-5.15
chung-android14-6.1
chung-android-mainline
rockpi4 chung-android13-5.10
chung-android13-5.15
rockpi4 chung-android14-5.15
chung-android14-6.1
chung-android-mainline
Hikey960 hikey-linaro-android-4.14
hikey-linaro-android-4.19
chung-android12-5.4
chung-android13-5.10
mô-đun fips140 chung-android12-5.10
chung-android13-5.10
chung-android13-5.15
mô-đun fips140 chung-android14-5.15

1 "Chính thức" có nghĩa đây là cách chính thức để xây dựng nhân, mặc dù cách thay thế cũng có thể được sử dụng để xây dựng nhân.

2 "Không duy trì" có nghĩa là việc xây dựng hạt nhân bằng phương pháp này sẽ hoạt động, nhưng phương pháp xây dựng không được kiểm tra liên tục. Nó có thể ngừng xây dựng trong tương lai. Thay vào đó, hãy sử dụng cách xây dựng "chính thức".

Chạy hạt nhân

Có nhiều cách để chạy kernel được tạo tùy chỉnh. Sau đây là những cách đã biết phù hợp với các kịch bản phát triển khác nhau.

Nhúng vào bản dựng hình ảnh Android

Sao chép Image.lz4-dtb vào vị trí nhị phân hạt nhân tương ứng trong cây AOSP và xây dựng lại hình ảnh khởi động.

Ngoài ra, hãy xác định biến TARGET_PREBUILT_KERNEL trong khi sử dụng make bootimage hình ảnh khởi động (hoặc bất kỳ dòng lệnh make nào khác tạo hình ảnh khởi động). Biến này được tất cả các thiết bị hỗ trợ vì nó được thiết lập thông qua device/common/populate-new-device.sh . Ví dụ:

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

Nhấp nháy và khởi động kernel với fastboot

Hầu hết các thiết bị gần đây đều có phần mở rộng bộ tải khởi động để hợp lý hóa quá trình tạo và khởi động hình ảnh khởi động.

Để khởi động kernel mà không cần flash:

adb reboot bootloader
fastboot boot Image.lz4-dtb

Sử dụng phương pháp này, kernel không thực sự được flash và sẽ không tồn tại trong quá trình khởi động lại.

Tùy chỉnh bản dựng kernel

Để tùy chỉnh các bản dựng kernel cho các bản dựng Kleaf, hãy xem tài liệu Kleaf .

Đối với build/build.sh , quá trình xây dựng và kết quả có thể bị ảnh hưởng bởi các biến môi trường. Hầu hết chúng là tùy chọn và mỗi nhánh nhân phải đi kèm với một cấu hình mặc định phù hợp. Những cái được sử dụng thường xuyên nhất được liệt kê ở đây. Để biết danh sách đầy đủ (và cập nhật), hãy tham khảo build/build.sh .

Biến môi trường Sự miêu tả Thí dụ
BUILD_CONFIG Xây dựng tệp cấu hình từ nơi bạn khởi tạo môi trường xây dựng. Vị trí phải được xác định tương ứng với thư mục gốc của Repo. Mặc định là build.config .
Bắt buộc đối với các kernel thông thường.
BUILD_CONFIG=common/build.config.gki.aarch64
CC Ghi đè trình biên dịch sẽ được sử dụng. Quay trở lại trình biên dịch mặc định được xác định bởi build.config . CC=clang
DIST_DIR Thư mục đầu ra cơ sở cho phân phối hạt nhân. DIST_DIR=/path/to/my/dist
OUT_DIR Thư mục đầu ra cơ sở cho việc xây dựng hạt nhân. OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG Bỏ qua make defconfig SKIP_DEFCONFIG=1
SKIP_MRPROPER Bỏ qua make mrproper SKIP_MRPROPER=1

Cấu hình hạt nhân tùy chỉnh cho các bản dựng cục bộ

Ví dụ: nếu bạn cần chuyển đổi tùy chọn cấu hình kernel thường xuyên khi làm việc trên một tính năng hoặc nếu bạn cần đặt tùy chọn cho mục đích phát triển, bạn có thể đạt được sự linh hoạt đó bằng cách duy trì sửa đổi cục bộ hoặc sao chép cấu hình bản dựng.

Đặt biến POST_DEFCONFIG_CMDS thành một câu lệnh được đánh giá ngay sau khi thực hiện xong bước make defconfig thông thường. Khi các tệp build.config được lấy nguồn từ môi trường xây dựng, các hàm được xác định trong build.config có thể được gọi như một phần của lệnh post-defconfig.

Một ví dụ phổ biến là vô hiệu hóa tối ưu hóa thời gian liên kết (LTO) cho các hạt nhân crosshatch trong quá trình phát triển. Mặc dù LTO có lợi cho các nhân đã phát hành, nhưng chi phí hoạt động tại thời điểm xây dựng có thể là đáng kể. Đoạn mã sau được thêm vào build.config cục bộ vô hiệu hóa LTO liên tục khi sử dụng build/build.sh .

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)
}

Xác định các phiên bản kernel

Bạn có thể xác định phiên bản chính xác để xây dựng từ hai nguồn: cây AOSP và hình ảnh hệ thống.

Phiên bản hạt nhân từ cây AOSP

Cây AOSP chứa các phiên bản nhân dựng sẵn. Nhật ký git tiết lộ phiên bản chính xác như một phần của thông báo cam kết:

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

Nếu phiên bản hạt nhân không được liệt kê trong nhật ký git, hãy lấy nó từ ảnh hệ thống, như được mô tả bên dưới.

Phiên bản hạt nhân từ hình ảnh hệ thống

Để xác định phiên bản hạt nhân được sử dụng trong ảnh hệ thống, hãy chạy lệnh sau đối với tệp hạt nhân:

file kernel

Đối với các Image.lz4-dtb , hãy chạy:

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

Xây dựng hình ảnh khởi động

Có thể xây dựng một hình ảnh khởi động bằng cách sử dụng môi trường xây dựng hạt nhân.

Xây dựng hình ảnh khởi động cho thiết bị với init_boot

Đối với các thiết bị có phân vùng init_boot , ảnh khởi động được tạo cùng với nhân. Hình ảnh initramfs không được nhúng trong hình ảnh khởi động.

Ví dụ: với Kleaf, bạn có thể xây dựng hình ảnh khởi động GKI bằng:

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

Với build/build.sh , bạn có thể xây dựng hình ảnh khởi động GKI với:

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

Ảnh khởi động GKI nằm ở $DIST_DIR .

Xây dựng hình ảnh khởi động cho thiết bị mà không cần init_boot

Đối với các thiết bị không có phân vùng init_boot , bạn cần có tệp nhị phân ramdisk, bạn có thể lấy tệp nhị phân này bằng cách tải xuống ảnh khởi động GKI và giải nén nó. Mọi hình ảnh khởi động GKI từ bản phát hành Android được liên kết sẽ hoạt động.

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

Thư mục đích là thư mục cấp cao nhất của cây nhân (thư mục làm việc hiện tại).

Nếu bạn đang phát triển với AOSP master, thay vào đó, bạn có thể tải xuống phần mềm bản dựng ramdisk-recovery.img từ bản dựng aosp_arm64 trên ci.android.com và sử dụng phần mềm đó làm tệp nhị phân ramdisk của bạn.

Khi bạn có tệp nhị phân ramdisk và đã sao chép nó vào gki-ramdisk.lz4 trong thư mục gốc của bản dựng kernel, bạn có thể tạo ảnh khởi động bằng cách thực thi:

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

Nếu bạn đang làm việc với kiến ​​trúc dựa trên x86, hãy thay Image bằng bzImageaarch64 bằng 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

Tệp đó nằm trong thư mục tạo tác $KERNEL_ROOT/out/$KERNEL_VERSION/dist .

Hình ảnh khởi động được đặt tại out/<kernel branch>/dist/boot.img .