Triển khai cấu hình khởi động trong Android 12

Trong Android 12, tính năng bootconfig sẽ thay thế các tuỳ chọn cmdline hạt nhân androidboot.* đang được sử 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 sang 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 với các thông số cho hạt nhân. Việc di chuyển các tham số hạt nhân androidboot.* dài sang tệp bootconfig sẽ tạo không gian trên cmdline hạt nhân và cung cấp không gian đó cho việc 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 nhân đầu tiên có hỗ trợ tính năng này: nhân 12-5.4.xx

Triển khai tính năng bootconfig cho các thiết bị mới khởi chạy bằng 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 hạt nhân dùng trong Android 11 trở xuống. Tuy nhiên, bạn cần lưu ý sự khác biệt sau đây khi sử dụng:

  • Các tham số phải được phân tách bằng trình tự 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 U-boot của Cuttlefish. Dưới đây là hai thay đổi trong tài liệu tham khảo này. Bản cập nhật đầu tiên 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, thay đổi đầu tiên cập nhật (hoặc nâng cấp) tính năng hỗ trợ phiên bản lên phiên bản tiếp theo, v4. Tệp thứ hai thực hiện hai việc: thêm tính năng xử lý bootconfig và minh hoạ cách thêm 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 các thay đổi đối với Cuttlefish để thực hiện 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 các tham số androidboot.* tại thời điểm tạo bản dựng từ cmdline của hạt nhân sang tệp bootconfig. Cách tốt nhất để triển khai thay đổi này là làm từng bước; hãy xem phần Triển khai và xác thực tăng dần để biết thông tin về cách làm theo quy trình tăng dần.

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 trỏ các thay đổi đó đến 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 đối vớ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 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. Điều 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, giống như cmdline của hạt nhân được tạo từ BOARD\_KERNEL\_CMDLINE.

Bạn có thể di chuyển bất kỳ tham số androidboot.* nào ở trạng thái hiện tại, tương tự như sau:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

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 hạt nhân. Cấu hình khởi động hạt nhân sẽ tìm phần bootconfig và tìm phần này ở cuối initramfs, với đoạn giới thiệu dự kiến.

Trình 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.

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

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 mức 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 thần kỳ bootconfig 12 B (#BOOTCONFIG\n)

Các tham số đến từ hai nguồn: Tham số đã biết tại thời điểm tạo bản dựng và tham số không xác định tại thời điểm tạo bản dựng. Bạn phải thêm các tham số không xác định.

Các thông số đã biết tại thời điểm 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 điểm tạo bản dựng 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 phần phụ đề 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 đè đ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 theo từng bước bằng cách làm theo quy trình được đưa ra trong phần này. Để nguyên các tham số cmdline của hạt 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 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 gỡ lỗi và xác thực 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 thêm sau khi khởi động thiết bị.
  3. Di chuyển các tham số androidboot.* từ cmdline của hạt nhân sang bootconfig, sử dụng biến BOARD_BOOTCONFIG và trình tải khởi động.
  4. Xác minh rằng từng 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ì 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 OTA

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 cầ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 sử dụng các tham số cmdline của hạt nhân 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.

Việc 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 hạt nhân. Điều tương tự cũng áp dụng cho việc nâng cấp phiên bản hạt nhân.

Khắc phục sự cố

Khi thực hiện bước xác minh, nếu bạn không thấy các thông số dự kiến trong /proc/bootconfig, hãy kiểm tra nhật ký hạt nhân 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ề đầ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 sự cố khi tải bootconfig. Để xem các loại lỗi khác nhau, hãy xem init/main.c.