Trong Android 12, tính năng bootconfig sẽ thay thế các tuỳ chọn androidboot.*
cmdline của nhân đang dùng với Android 11 trở xuống. Tính năng bootconfig là một cơ chế để truyền thông tin chi tiết về cấu hình từ bản dựng và trình tải khởi động đến Android 12.
Tính năng này cung cấp một cách để tách các thông số cấu hình cho không gian người dùng Android khỏi các thông số cấu hình cho nhân. Việc di chuyển các tham số hạt nhân androidboot.*
có độ dài lớn sang tệp bootconfig sẽ tạo không gian trên cmdline của hạt nhân và giúp bạn có thể mở rộng trong tương lai.
Cả nhân hệ điều hành và không gian người dùng Android đều phải hỗ trợ bootconfig
.
- Bản phát hành đầu tiên có tính năng hỗ trợ này: Android 12
- Phiên bản kernel đầu tiên có hỗ trợ này: kernel 12-5.4.xx
Triển khai tính năng bootconfig cho các thiết bị mới ra mắt với phiên bản nhân 12-5.10.xx. Bạn không cần triển khai tính năng này nếu đang nâng cấp thiết bị.
Ví dụ và nguồn
Khi bạn xem các ví dụ và mã nguồn trong phần này, hãy lưu ý rằng định dạng của mã bootconfig
chỉ khác một chút so với định dạng của cmdline kernel được dùng trong Android 11 trở xuống.
Tuy nhiên, điểm khác biệt sau đây là quan trọng đối với việc sử dụng của bạn:
- Các tham số phải được phân tách bằng chuỗi thoát dòng mới
\n
, chứ không phải bằng khoảng trắng.
Ví dụ về trình tải khởi động
Để xem ví dụ về trình tải khởi động, hãy xem chế độ triển khai trình tải khởi động tham chiếu U-boot của Cuttlefish. Dưới đây là danh sách 2 cam kết trong tài liệu tham khảo. Lần đầu tiên, uprev sẽ hỗ trợ phiên bản tiêu đề khởi động lên phiên bản mới nhất. Trong ví dụ này, cam kết đầu tiên sẽ cập nhật (hoặc tăng cấp) phiên bản hỗ trợ lên phiên bản tiếp theo, v4. Thứ hai, thao tác này thực hiện hai việc: thêm tính năng xử lý bootconfig và minh hoạ cách thêm các tham số trong thời gian chạy:
- Nâng cấp khả năng hỗ trợ phiên bản tiêu đề khởi động lên phiên bản v4 mới nhất.
- Thêm tính năng xử lý bootconfig.
Ví dụ về bản dựng
Để xem ví dụ về bản dựng cho thấy các thay đổi mkbootimg
để tạo vendor_boot.img
bằng tiêu đề khởi động của nhà cung cấp phiên bản 4, hãy xem mkbootimg changes for
bootconfig
.
Hãy xem các thay đổi đối với Cuttlefish để thực hiện những việc sau:
- Sử dụng (hoặc nâng cấp lên) phiên bản tiêu đề khởi động của nhà cung cấp v4.
- Thêm bootconfig vào cmdline của nhân và di chuyển các tham số đã chọn sang bootconfig.
Triển khai
Các đối tác phải thêm chế độ hỗ trợ vào trình tải khởi động và di chuyển các tham số androidboot.*
trong thời gian xây dựng từ cmdline của nhân sang tệp bootconfig. Cách tốt nhất để triển khai thay đổi này là thực hiện từng bước; hãy xem phần Triển khai và xác thực từng bước để biết thông tin về cách thực hiện quy trình từng bước.
Nếu bạn có các thay đổi tìm kiếm tệp /proc/cmdline cho các tham số androidboot.*
, hãy chuyển các tham số đó sang tệp /proc/bootconfig
. Các thuộc tính ro.boot.*
được đặt bằng các giá trị bootconfig
mới, vì vậy, bạn không cần thực hiện thay đổi cho mã bằng các thuộc tính đó.
Xây dựng các thay đổi
Trước tiên, hãy nâng cấp phiên bản tiêu đề khởi động lên phiên bản 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Thêm tham số dòng lệnh của hạt nhân bootconfig
. Thao tác này khiến hạt nhân tìm kiếm phần bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
Các tham số bootconfig được tạo từ các tham số trong biến BOARD_BOOTCONFIG
, tương tự như cách cmdline của hạt nhân được tạo từ BOARD\_KERNEL\_CMDLINE
.
Bạn có thể di chuyển mọi tham số androidboot.*
như hiện trạng, tương tự như sau:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Các thay đổi về trình tải khởi động
Trình tải khởi động thiết lập initramfs
trước khi chuyển sang nhân. Cấu hình khởi động kernel tìm kiếm phần bootconfig và tìm phần này ở cuối initramfs,
cùng với đoạn giới thiệu dự kiến.
Trình tải khởi động sẽ lấy thông tin bố cục vendor_boot.img
từ tiêu đề hình ảnh khởi động của nhà cung cấp.
Hình 1. Phân bổ bộ nhớ bootconfig của Android 12
Trình tải khởi động tạo phần bootconfig trong bộ nhớ. Phần bootconfig chứa các hoạt động phân bổ bộ nhớ cho những mục sau:
- Tham số
- Kích thước 4 B
parameters size
- Kích thước 4 B
parameters checksum
- Chuỗi đặc biệt 12 B bootconfig (
#BOOTCONFIG\n
)
Các tham số đến từ 2 nguồn: Các tham số đã biết tại thời gian tạo bản dựng và các tham số chưa biết tại thời gian tạo bản dựng. Bạn phải thêm các tham số không xác định.
Các tham số đã biết tại thời gian tạo bản dựng được đóng gói vào cuối hình ảnh vendor_boot
trong phần bootconfig. Kích thước của phần này được lưu trữ (dưới dạng byte) trong trường tiêu đề khởi động của nhà cung cấp vendor_bootconfig_size
.
Các tham số không xác định tại thời gian tạo chỉ được biết tại thời gian chạy trong trình tải khởi động. Bạn phải thêm các tham số này vào cuối phần tham số bootconfig trước khi áp dụng đoạn mã bootconfig.
Nếu bạn cần thêm bất kỳ tham số nào sau khi áp dụng đoạn mã bootconfig, hãy ghi đè đoạn mã đó rồi áp dụng lại.
Triển khai và xác thực gia tăng
Triển khai tính năng bootconfig theo từng bước bằng cách làm theo quy trình được nêu trong phần này. Không thay đổi các tham số cmdline của kernel trong khi các tham số bootconfig được thêm vào.
Sau đây là các bước để triển khai gia tăng, có xác thực:
- Thực hiện các thay đổi đối với trình tải khởi động và bản dựng, sau đó làm như sau:
- Sử dụng biến
BOARD_BOOTCONFIG
để thêm một tham số bootconfig mới. - Giữ nguyên các tham số cmdline của nhân để thiết bị có thể tiếp tục khởi động đúng cách. Điều này giúp việc gỡ lỗi và xác thực trở nên dễ dàng hơn nhiều.
- Sử dụng biến
- Xác minh bài tập bằng cách kiểm tra nội dung của
/proc/bootconfig
. Xác minh rằng bạn thấy tham số mới được thêm sau khi thiết bị khởi động. - Di chuyển các tham số
androidboot.*
từ cmdline của nhân sang bootconfig, bằng cách sử dụng biếnBOARD_BOOTCONFIG
và trình tải khởi động. - Xác minh rằng mỗi tham số đều có trong
/proc/bootconfig
VÀ chúng không có trong/proc/cmdline
. Nếu bạn có thể xác minh điều này, thì tức là bạn đã triển khai thành công.
Những điểm cần lưu ý khi nâng cấp và hạ cấp qua mạng không dây
Bạn cần đặc biệt chú ý khi quản lý các bản nâng cấp và hạ cấp qua mạng (OTA) giữa các phiên bản Android hoặc các phiên bản kernel khác nhau.
Android 12 là phiên bản đầu tiên có hỗ trợ bootconfig. Nếu hạ cấp xuống bất kỳ phiên bản nào trước đó, bạn phải sử dụng các tham số cmdline của nhân thay vì bootconfig.
Các phiên bản kernel từ 12-5.4 trở lên hỗ trợ bootconfig. Nếu hạ cấp xuống bất kỳ phiên bản nào trước đó(kể cả 11-5.4), bạn phải sử dụng các tham số dòng lệnh của nhân.
Các bản nâng cấp từ Android 11 trở xuống lên Android 12 trở lên có thể tiếp tục sử dụng các tham số cmdline của nhân. Điều này cũng áp dụng cho việc nâng cấp phiên bản kernel.
Khắc phục sự cố
Khi bạn thực hiện bước xác minh, nếu không thấy các tham số dự kiến trong /proc/bootconfig
, hãy kiểm tra nhật ký nhân trong logcat
. Luôn có một mục nhật ký cho bootconfig nếu nhân hỗ trợ mục này.
Ví dụ về đầu ra nhật ký
$ adb logcat | grep bootconfig
02-24 17:00:07.610 0 0 I Load bootconfig: 128 bytes 9 nodes
Nếu bạn thấy nhật ký lỗi được trả về, thì đã xảy ra vấn đề khi tải bootconfig. Để xem các loại lỗi khác nhau, hãy xem init/main.c.