Triển khai Bootconfig trong Android 12

Trong Android 12, tính năng bootconfig thay thế các tùy chọn dòng lệnh kernel androidboot.* đang được sử dụng với Android 11 trở xuống. Tính năng bootconfig là cơ chế chuyển chi tiết cấu hình từ bản dựng và bộ nạp 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 kernel. Việc di chuyển các tham số kernel androidboot.* dài sang tệp bootconfig sẽ tạo khoảng trống trên dòng cmdline của kernel và làm cho nó có sẵn để dễ dàng mở rộng trong tương lai.

Cả kernel 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: kernel 12-5.4.xx

Triển khai tính năng bootconfig cho các thiết bị mới khởi chạy với phiên bản kernel 12-5.10.xx. Bạn không cần phải triển khai nó nếu bạn đ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 dòng lệnh kernel được sử dụng trong Android 11 trở xuống. Tuy nhiên, sự khác biệt sau đây rất 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 , không phải bằng dấu cách.

Ví dụ về bộ nạp khởi động

Để biết ví dụ về bộ nạp khởi động, hãy xem phần triển khai bộ nạp khởi động tham chiếu Cuttlefish U-boot. Hai cam kết trong tài liệu tham khảo được liệt kê dưới đây. Lần đầu tiên 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ụ, cam kết đầu tiên cập nhật (hoặc nâng cấp) phiên bản hỗ trợ cho phiên bản tiếp theo, v4. Cái thứ hai làm hai việc; nó bổ sung khả năng xử lý bootconfig và thể hiện việc thêm các tham số khi chạy:

Xây dựng ví dụ

Để biết ví dụ về bản dựng hiển thị các thay đổi mkbootimg để xây dựng vendor_boot.img với tiêu đề khởi động của nhà cung cấp v4, hãy xem mkbootimg changes for bootconfig . Xem những thay đổi của Mực nang để thực hiện những việc sau:

Thực hiện

Các đối tác phải thêm hỗ trợ cho bộ tải khởi động của họ và di chuyển các tham số androidboot.* tại thời điểm xây dựng từ dòng lệnh kernel sang tệp bootconfig. Cách tốt nhất để thực hiện thay đổi này là thực hiện dần dần; hãy xem phần Xác thực và triển khai tăng dần để biết thông tin về việc tuân theo quy trình tăng dần.

Nếu bạn có các thay đổi tìm kiếm tham số androidboot.* trong tệp /proc/cmdline, thay vào đó hãy trỏ chúng vào tệp /proc/bootconfig. Thuộc tính ro.boot.* được đặt bằng các giá trị bootconfig mới, do đó 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 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 kernel bootconfig . Điều này làm cho kernel tì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 , giống như cmdline kernel được tạo từ BOARD\_KERNEL\_CMDLINE .

Mọi tham số androidboot.* đều có thể được di chuyển nguyên trạng, tương tự như sau:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Thay đổi bộ nạp khởi động

Bộ nạp khởi động thiết lập initramfs trước khi nhảy vào kernel. Cấu hình khởi động kernel tìm kiếm phần bootconfig và tìm nó ở cuối initramfs, với đoạn giới thiệu dự kiến.

Bộ tải khởi động 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.

Diagram of bootconfig memory allocation layout

Hình 1. Phân bổ bộ nhớ bootconfig Android 12

Bộ nạp khởi động tạo phần bootconfig trong bộ nhớ. Phần bootconfig chứa phân bổ bộ nhớ cho các mục sau:

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

Các tham số đến từ hai 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 được biết tại thời điểm xây dựng. Các tham số không xác định phải được thêm vào.

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 cấu hình khởi động. Kích thước của phần đượ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 được biết tại thời điểm xây dựng chỉ được biết khi chạy trong bộ nạp khởi động. Chúng phải được thêm vào cuối phần tham số bootconfig trước khi áp dụng trailer bootconfig.

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 bootconfig, hãy ghi đè lên đoạn giới thiệu đó và áp dụng lại nó.

Triển khai và xác nhận tăng cường

Triển khai tính năng bootconfig dần dần bằng cách làm theo quy trình được đưa ra trong phần này. Giữ nguyên các tham số cmdline kernel trong khi các tham số bootconfig được thêm vào.

Đây là các bước để triển khai tăng dần, có xác nhận:

  1. Thực hiện các thay đổi về bộ nạp khởi động và bản dựng, sau đó thực hiện như sau:
    1. Sử dụng biến BOARD_BOOTCONFIG để thêm tham số bootconfig mới.
    2. Giữ nguyên các tham số cmdline kernel để thiết bị có thể tiếp tục khởi động chính xác. Điều này làm cho việc gỡ lỗi và xác nhận dễ dàng hơn nhiều.
  2. 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 được thêm sau khi thiết bị khởi động.
  3. Di chuyển các tham số androidboot.* từ cmdline kernel sang bootconfig, sử dụng biến BOARD_BOOTCONFIG và bộ nạp khởi động.
  4. Xác minh rằng mỗi tham số tồn tại 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ì việc triển khai của bạn đã thành công.

Cân nhắc nâng cấp và hạ cấp OTA

Khi bạn quản lý việc nâng cấp và hạ cấp OTA giữa các phiên bản Android khác nhau hoặc các phiên bản kernel khác nhau, bạn cần đặc biệt cẩn thận.

Android 12 là phiên bản đầu tiên hỗ trợ bootconfig. Nếu hạ cấp xuống bất kỳ phiên bản nào trước đó, các tham số cmdline kernel phải được sử dụng thay vì bootconfig.

Phiên bản kernel 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 11-5.4), các tham số cmdline kernel phải được sử dụng.

Các bản nâng cấp từ Android 11 trở lên lên Android 12 trở lên có thể tiếp tục sử dụng các tham số cmdline kernel. Việc nâng cấp phiên bản kernel cũng vậy.

Xử lý sự cố

Khi bạn thực hiện bước xác minh , nếu bạn không thấy các tham số dự kiến ​​trong /proc/bootconfig , hãy kiểm tra nhật ký kernel trong logcat . Luôn có một mục nhật ký cho bootconfig nếu kernel hỗ trợ nó.

Đầu ra nhật ký ví dụ

$ 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 sự cố khi tải bootconfig. Để xem các loại lỗi khác nhau, hãy xem init/main.c .