Sử dụng DebugFS trong Android 12

Các thiết bị chạy Android 12 bằng các phiên bản hạt nhân cao hơn phiên bản 5.4 phải đi kèm với hạt nhân GKI. Để các đối tác có thể truy cập vào DebugFS trong các bản dựng userdebug trong khi phát triển trên hạt nhân GKI, cấu hình hạt nhân CONFIG_DEBUG_FS được bật trong defconfig GKI. Không bao giờ gắn DebugFS trong bản dựng người dùng cho các thiết bị chạy trên Android 12.

Bản dựng Userdebug có phạm vi kiểm thử tốt hơn so với bản dựng người dùng và được kiểm thử kỹ lưỡng trong suốt chu kỳ phát triển. Kế hoạch sau đây giảm thiểu sự khác biệt giữa hai loại bản dựng liên quan đến quyền truy cập DebugFS và mang lại các lợi ích sau:

  • Ngăn các bản dựng userdebug vô tình phụ thuộc vào DebugFS cho chức năng mới
  • Đảm bảo rằng mọi chức năng hiện có bị hỏng do thiếu DebugFS đều được biết sớm trong chu kỳ phát triển

Quyền truy cập Debugfs trong các bản dựng userdebug được phân loại như sau:

  1. Khởi chạy tệp DebugFS trong quá trình khởi động thiết bị, chẳng hạn như quyền ghi vào tệp trong DebugFS để bật tính năng thu thập dữ liệu gỡ lỗi.
  2. Tạo báo cáo lỗi: HAL dumpstate đọc các tệp DebugFS khi DumpstateBoard() được dumpstate gọi. Thông tin này sẽ trở thành một phần của báo cáo lỗi.
  3. Kiểm thử và xác thực dành riêng cho thiết bị.

Bảng sau đây mô tả cách hỗ trợ từng danh mục trong số 3 danh mục này trong Android 12. Xin lưu ý rằng nội dung sau đây chỉ áp dụng cho các bản dựng userdebug vì không thể gắn DebugFS trong các bản dựng dành cho người dùng.

Trường hợp sử dụng Bản dựng userdebug Android 12
Khởi chạy tệp DebugFS một lần, trong quá trình khởi động. Quyền truy cập này chỉ xảy ra một lần trong thời gian khởi động. HAL Dumpstate thực hiện việc này trong quá trình khởi tạo HAL. Để bật tính năng tương tự, init sẽ gắn DebugFS trong các bản dựng userdebug trước khi HAL khởi chạy. Init gọi umount() trên DebugFS khi thiết bị đã khởi động xong.
Tạo báo cáo lỗi: HAL dumpstate đọc các tệp DebugFS, trở thành một phần của báo cáo lỗi. Do dumpstate HAL thực hiện trong DumpstateBoard() khi được dumpstate gọi (DumpstateDevice.cpp). Công cụ dumpstate (một phần của khung Android) đảm bảo rằng DebugFS sẽ được gắn trong quá trình gọi.
Kiểm thử và xác thực theo thiết bị cụ thể Adb root và shell. Gắn DebugFS từ shell adb bằng quyền truy cập gốc1.

1Để gắn DebugFS từ adb shell bằng quyền truy cập thư mục gốc, hãy sử dụng lệnh sau:

adb shell mount -t debugfs debugfs /sys/kernel/debug.

Hành động bắt buộc đối với đối tác

Đối tác phải thực hiện những việc sau dựa trên những thay đổi này trong các thiết bị Android 12:

  • Thực hiện tất cả các hoạt động khởi chạy thời gian khởi động của các nút DebugFS trong quá trình khởi chạy HAL dumpstate. Để biết ví dụ về cách thực hiện việc này, hãy xem phần DNM: Ví dụ về cách khởi chạy thời gian khởi động của tệp DebugFS.
  • Không cho phép DebugFS truy cập trong thời gian chạy. Các trường hợp ngoại lệ sau đây sẽ được áp dụng:
    • Tạo báo cáo lỗi (xuất phát từ HAL dumpstate)
    • Kiểm thử và xác thực (có thể truy cập bằng adb rootshell – đảm bảo rằng DebugFS được gắn trước)

Nhà phát triển có thể đặt thuộc tính gỡ lỗi ổn định persist.dbg.keep_debugfs_mounted để giữ DebugFs được gắn trong các lần khởi động lại trên bản dựng userdebug và eng.

Các bài kiểm thử tuân thủ GTS đảm bảo rằng hệ thống tệp DebugFS không được gắn trong các bản dựng của người dùng. Câu lệnh neverallow của Sepolicy đảm bảo rằng trong các thiết bị chạy trên Android 12 trở lên, các quy trình trái phép sẽ không được cấp quyền truy cập vào DebugFs.