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 các thiết bị Android. Các hướng dẫn này hướng dẫn bạn quy trình chọn đúng nguồn, xây dựng hạt nhân và nhúng kết quả vào hình ảnh hệ thống được xây dựng từ Dự án nguồn mở Android (AOSP).

Bạn có thể lấy thêm các nguồn hạt nhân gần đây 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 kiểm tra nguồn của bạn.

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

Đối với các hạt 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à xây dựng các tập lệnh. Một số hạt nhân (ví dụ: hạt nhân Pixel 3) yêu cầu nguồn từ nhiều kho lưu trữ git, trong khi một số khác (ví dụ: các hạt nhân chung) 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 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 Repo chi nhánh
Pixel 6a (bluejay) device / google / bluejay-kernel android-gs-bluejay-5.10-android13
Pixel 6 (chim vàng anh)
Pixel 6 Pro (con quạ)
device / google / raviole-kernel android-gs-raviole-5.10-android13
Pixel 5a (barbet) device / google / barbet-kernel android-msm-barbet-4.19-android13
Pixel 5 (vây đỏ)
Pixel 4a (5G) (giá đỡ)
device / google / redbull-kernel android-msm-redbull-4.19-android13
Pixel 4a (cá mặt trời) device / google / sunfish-kernel android-msm-sunfish-4.14-android13
Pixel 4 (ngọn lửa)
Pixel 4 XL (san hô)
device / google / coral-kernel android-msm-coral-4.14-android13
Pixel 3a (sargo)
Pixel 3a XL (ẩn danh)
thiết bị / 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 (cá buồm)
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
Beagle x15 device / ti / beagle_x15-kernel omap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
Nhân chung của Android N / A common-android-4.4
common-android-4.9
common-android-4.14
common-android-4.19
common-android-4.19-ổn định
common-android11-5.4
common-android12-5.4
common-android12-5.10
common-android13-5.10
common-android13-5.15
common-android-mainline

Xây dựng nhân

Sau đó, xây dựng hạt nhân 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 nằm trong thư mục out/ BRANCH /dist .

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

Android 13 đã giới thiệu hạt nhân 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 chạy:

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 đó, tệp 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 GKI

Android 11 đã giới thiệu GKI , phân 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 bảo trì, được xây dựng riêng biệt.

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

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

Ví dụ này cho thấy một 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 dùng 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 xây 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_x86_64_dist

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

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

Để biết thêm chi tiết về Kleaf - xây dựng hạt nhân với Bazel -, hãy tham khảo tài liệu về AOSP .

Chạy hạt nhân

Có nhiều cách để chạy một nhân được xây dựng tùy chỉnh. Sau đây là những cách đã biết phù hợp với các tình huống 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 (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 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 hạt nhân với fastboot

Hầu hết các thiết bị gần đây đều có phần mở rộng bộ nạp 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 hạt nhân mà không nhấp nháy:

adb reboot bootloader
fastboot boot Image.lz4-dtb

Sử dụng phương pháp này, hạt nhân không thực sự được flash và sẽ không tồn tại sau khi khởi động lại.

Tùy chỉnh bản dựng hạt nhân

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 hạt nhân phải đi kèm với một cấu hình mặc định thích hợp. Những cái được sử dụng thường xuyên nhất được liệt kê ở đây. Để có danh sách đầy đủ (và cập nhật), hãy tham khảo build/build.sh .

Biến môi trường Sự mô 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 liên quan đến thư mục gốc của Repo. Mặc định là build.config .
Bắt buộc đối với các nhân chung.
BUILD_CONFIG=common/build.config.gki.aarch64
CC Ghi đè trình biên dịch đượ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 bản phân phối hạt nhân. DIST_DIR=/path/to/my/dist
OUT_DIR Thư mục đầu ra cơ sở cho bản 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ộ

Nếu bạn cần thường xuyên chuyển đổi một tùy chọn cấu hình hạt nhân, chẳng hạn như khi làm việc trên một tính năng hoặc nếu bạn cần một tùy chọn được đặt cho mục đích phát triển, bạn có thể đạt được sự linh hoạt đó bằng cách duy trì một bản sửa đổi cục bộ hoặc bản sao của 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 bước thực hiện make defconfig thông thường được thực hiện. Vì các tệp build.config được tạo nguồn trong môi trường xây dựng, các hàm được định nghĩa trong build.config có thể được gọi như một phần của các 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 hạt nhân crosshatch trong quá trình phát triển. Trong khi LTO có lợi cho các hạt nhân đã phát hành, chi phí tại thời điểm xây dựng có thể rất đáng kể. Đoạn mã sau được thêm vào build.config cục bộ sẽ 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 hạt nhân

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 hạt 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ừ hình ả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 hình ả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 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 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. Để thực hiện việc này, bạn cần có một tệp nhị phân đĩa ram, bạn có thể lấy tệp này bằng cách tải xuống hình ả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 tạo tác bản dựng ramdisk-recovery.img từ bản dựng aosp_arm64 trên ci.android.com và sử dụng nó làm bản nhị phân đĩa ram của bạn.

Khi bạn có tệp nhị phân đĩa ram và đã sao chép nó vào gki-ramdisk.lz4 trong thư mục gốc của bản dựng hạt nhân, bạn có thể tạo hình ả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 thế 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 nằm ở out/<kernel branch>/dist/boot.img .