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 bzImage
và aarch64
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
.