Trong Android 12, tính năng bootconfig sẽ thay thế các tuỳ chọn androidboot.* cmdline của nhân hệ điều hành đang dùng trong 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 sang Android 12.
Tính năng này giúp tách các tham số cấu hình cho không gian người dùng Android khỏi các tham số cấu hình cho nhân hệ điều hành. Việc di chuyển các tham số nhân hệ điều hành androidboot.* dài dòng sang tệp bootconfig sẽ tạo ra không gian trên cmdline của nhân hệ điều hành 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ó hỗ trợ này: Android 12
- Phiên bản kernel đầu tiên có hỗ trợ này: nhân hệ điều hành 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 kernel 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 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 nhân hệ điều hành được dùng trong Android 11 trở xuống.
Tuy nhiên, sự 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 dấu cách.
Ví dụ về trình tải khởi động
Để xem ví dụ về trình tải khởi động, hãy xem phần Triển khai trình tải khởi động tham chiếu Cuttlefish U-boot. Dưới đây là 2 cam kết trong tài liệu tham khảo. Cam kết đầu tiên sẽ nâng cấp 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 nâng cấp) hỗ trợ phiên bản lên phiên bản tiếp theo, v4. Cam kết thứ hai thực hiện 2 việc: thêm tính năng xử lý bootconfig và minh hoạ việc thêm tham số trong thời gian chạy:
- Nâng cấp 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 mkbootimg các thay đổi để tạo
vendor_boot.img bằng tiêu đề khởi động nhà cung cấp v4, hãy xem mkbootimg changes for
bootconfig.
Hãy xem các thay đổi của 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 nhà cung cấp v4.
- Thêm bootconfig vào cmdline của nhân hệ điều hành và di chuyển các tham số đã chọn sang bootconfig.
Triển khai
Đối tác phải thêm tính năng hỗ trợ vào trình tải khởi động của họ và di chuyển các tham số androidboot.* trong thời gian xây dựng từ cmdline của nhân hệ điều hành 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 thay đổi đó 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ã sử dụ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ố cmdline của nhân hệ điều hành bootconfig. Thao tác này sẽ khiến nhân hệ điều hành 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 nhân hệ điều hành được tạo từ BOARD\_KERNEL\_CMDLINE.
Bạn có thể di chuyển mọi tham số androidboot.* như sau:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Thay đổi 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 hệ điều hành. Cấu hình khởi động của nhân hệ điều hành
sẽ tìm kiếm phần bootconfig và tìm phần đó ở cuối
initramfs, với đoạn giới thiệu dự kiến.
Trình tải khởi động nhận thông tin bố cục vendor_boot.img từ tiêu đề hình ảnh khởi động 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 phân bổ bộ nhớ cho những nội dung sau:
- Tham số
- Kích thước 4 B
parameters size - Kích thước 4 B
parameters checksum - Chuỗi bootconfig magic 12 B (
#BOOTCONFIG\n)
Các tham số đến từ 2 nguồn: Tham số đã biết trong thời gian xây dựng và tham số chưa biết trong thời gian xây dựng. Bạn phải thêm các tham số chưa biết.
Các tham số đã biết trong thời gian xây 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 nhà cung cấp vendor_bootconfig_size.
Các tham số chưa biết trong thời gian xây dựng chỉ được biết trong 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 giới thiệu bootconfig.
Nếu bạn cần thêm tham số sau khi đã áp dụng đoạn giới thiệu bootconfig, hãy ghi đè đoạn giới thiệu đó rồi áp dụng lại.
Triển khai và xác thực từng bước
Triển khai tính năng bootconfig từng bước bằng cách làm theo quy trình được cung cấp trong phần này. Để nguyên các tham số cmdline của nhân hệ điều hành trong khi thêm các tham số bootconfig.
Sau đây là các bước triển khai từng bước, có xác thực:
- Thực hiện các thay đổi về 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 tham số bootconfig mới. - Giữ nguyên các tham số cmdline của nhân hệ điều hành để thiết bị có thể tiếp tục khởi động đúng cách. Điều này giúp quá trình 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 công việc của bạn 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 thêm sau khi thiết bị khởi động. - Di chuyển các tham số
androidboot.*từ cmdline của nhân hệ điều hành sang bootconfig, bằng cách sử dụng biếnBOARD_BOOTCONFIGvà trình tải khởi động. - Xác minh rằng mỗi tham số đều tồn tại trong
/proc/bootconfigVÀ rằng các tham số đó không có trong/proc/cmdline. Nếu bạn có thể xác minh điều này, thì quá trình triển khai của bạn đã thành công.
Lưu ý về việc nâng cấp và hạ cấp qua mạng (OTA)
Khi bạn quản lý việc 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 nhân hệ điều hành, bạn cần đặc biệt chú ý.
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 hệ điều hành thay vì bootconfig.
Các phiên bản nhân hệ điều hành 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ố cmdline của nhân hệ điều hành.
Bạn có thể tiếp tục sử dụng các tham số cmdline của nhân hệ điều hành khi nâng cấp từ Android 11 trở xuống lên Android 12 trở lên. Điều tương tự cũng áp dụng cho việc nâng cấp phiên bản nhân hệ điều hành.
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 hệ điều hành trong logcat. Luôn có một mục nhật ký cho bootconfig nếu nhân hệ điều hành hỗ trợ tính năng 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.