Triển khai Bootconfig trong Android 12

Trong Android 12, tính năng bootconfig sẽ thay thế các tuỳ chọn lệnh cmdline nhân androidboot.* đang dùng trên Android 11 trở xuống. Tính năng bootconfig là một cơ chế để truyền chi tiết cấu hình từ trình tải bản dựng và trình tải khởi động sang Android 12.

Tính năng này cung cấp cách để 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ố cho nhân. Việc di chuyển các tham số nhân hệ điều hành androidboot.* dài sang tệp bootconfig sẽ tạo ra không gian trên lệnh cmdline nhân và cung cấp khả năng 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 nhân hệ điều hành đầu tiên có hỗ trợ này: nhân 12-5.4.xx

Triển khai tính năng bootconfig cho các thiết bị mới phát hành với phiên bản hạt nhân 12-5.10.xx. Bạn không cần triển khai 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 lệnh 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 có ý nghĩa quan trọng đối với cách sử dụng của bạn:

  • Các thông 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

Để biết ví dụ về trình tải khởi động, hãy xem cách triển khai trình tải khởi động tham chiếu khởi động U-Cuttlefish. Dưới đây là hai thay đổi trong tài liệu tham khảo. Phiên bản nâng cấp đầu tiên giú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) khả năng hỗ trợ phiên bản cho phiên bản tiếp theo, v4. Phương thức thứ hai thực hiện 2 việc: thêm tính năng xử lý khởi động và minh hoạ cách thêm các tham số trong thời gian chạy:

Ví dụ về bản dựng

Để xem ví dụ về bản dựng cho thấy các thay đổi về 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 những thay đổi của con nhộng để làm những việc sau:

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 và di chuyển tham số androidboot.* trong thời gian xây dựng từ lệnh cmdline nhân sang tệp khởi động. Cách tốt nhất để triển khai thay đổi này là thực hiện dần dần; hãy xem phần Triển khai và xác thực gia tăng để biết thông tin về cách theo dõi quy trình tăng dần.

Nếu bạn có các thay đổi cần tìm các tham số androidboot.* trong tệp /proc/cmdline, hãy trỏ các tham số đó đến tệp /proc/bootconfig. Các thuộc tính ro.boot.* được thiết lập bằng các giá trị bootconfig mới, vì vậy, bạn không cần thay đổi 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 của bạn lên phiên bản 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Thêm tham số cmdline cho nhân bootconfig. Thao tác này sẽ khiến nhân hệ điều hành tìm thấy phần bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

Tham số bootconfig được tạo từ các tham số trong biến BOARD_BOOTCONFIG, giống như lệnh cmdline 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.* theo nguyên trạng, tương tự như sau:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Các thay đổi đối vớ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 nhân hệ điều hành sẽ 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 nhận thông tin bố cục vendor_boot.img từ tiêu đề hình ảnh khởi động của nhà cung cấp.

Sơ đồ bố cục phân bổ bộ nhớ bootconfig

Hình 1. Phân bổ bộ nhớ khởi động cấu hình Android 12

Trình tải khởi động sẽ tạo phần bootconfig trong bộ nhớ. Phần bootconfig chứa các cơ cấu phân bổ bộ nhớ cho những mục sau:

  • Tham số
  • 4 B kích thước parameters size
  • 4 B kích thước parameters checksum
  • Chuỗi ma thuật bootconfig 12 B (#BOOTCONFIG\n)

Các tham số này đến từ 2 nguồn: Các tham số đã biết tại thời điểm xây dựng và các tham số chưa xác định tại thời gian xây dựng. Bạn phải thêm thông số không xác định.

Các tham số đã biết tại thời điểm 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 của nhà cung cấp vendor_bootconfig_size.

Các tham số chưa xác định tại thời gian xây dựng chỉ được xác định trong thời gian chạy trong trình tải khởi động. Bạn phải thêm các thông số này vào cuối phần thông số bootconfig trước khi áp dụng đoạn giới thiệu khởi động cấu hình.

Nếu bạn cần thêm bất kỳ tham số nào sau khi áp dụng đoạn giới thiệu khởi động, hãy ghi đè đoạn giới thiệu 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 dần bằng cách làm theo quy trình được nêu trong phần này. Hãy giữ nguyên các tham số cmdline của nhân trong khi thêm các tham số bootconfig.

Sau đây là các bước triển khai từng bước, kèm theo quy trình xác thực:

  1. Thực hiện trình tải khởi động và thay đổi bản dựng, sau đó làm như sau:
    1. Sử dụng biến BOARD_BOOTCONFIG để thêm một tham số bootconfig mới.
    2. 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 dễ dàng hơn nhiều.
  2. Xác minh bài tập của bạn bằng cách kiểm tra nội dung trên /proc/bootconfig. Xác minh rằng bạn thấy tham số mới thêm sau khi khởi động thiết bị.
  3. Di chuyển các tham số androidboot.* từ lệnh cmdline nhân hệ điều hành sang Bootconfig bằng cách sử dụng biến BOARD_BOOTCONFIG và trình tải khởi động.
  4. Xác minh rằng mỗi tham số tồn tại trong /proc/bootconfig VÀ các tham số đó không tồn tại 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.

Những điều cần cân nhắc khi nâng cấp và hạ cấp hệ thống mạng không dây

Khi quản lý việc nâng cấp và hạ cấp qua mạng không dây giữa các phiên bản Android hoặc nhiều phiên bản kernel, bạn nên đặc biệt chú ý.

Android 12 là phiên bản đầu tiên có hỗ trợ cấu hình khởi động. Nếu hạ cấp xuống bất kỳ phiên bản nào trước đó, bạn phải dùng các tham số cmdline của nhân hệ điều hành thay vì bootconfig.

Kernel phiên bản 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 đó(bao gồm cả 11-5.4), bạn phải sử dụng các tham số cmdline nhân.

Những người 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 hệ điều hành. Việc nâng cấp các phiên bản kernel cũng tương tự như vậy.

Khắc phục sự cố

Khi thực hiện bước xác minh, nếu bạn không thấy 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ập nhật ký cho bootconfig nếu hạt nhân hỗ trợ mục nhập đó.

Ví dụ về kết quả 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 một nhật ký lỗi được trả về, tức là đã xảy ra sự cố khi tải bootconfig. Để biết các loại lỗi khác nhau, hãy xem init/main.c.