ConfigStore HAL

Trong Android 10, ConfigStore HAL sử dụng cờ bản dựng để lưu trữ các giá trị cấu hình trong phân vùng vendor và một dịch vụ trong phân vùng system sẽ truy cập vào các giá trị đó bằng HIDL (điều này cũng đúng trong Android 9). Tuy nhiên, do mức tiêu thụ bộ nhớ cao và khó sử dụng, HAL ConfigStore đã bị ngừng sử dụng.

ConfigStore HAL vẫn nằm trong AOSP để hỗ trợ các phân vùng cũ của nhà cung cấp. Trên các thiết bị chạy Android 10 trở lên, surfaceflinger sẽ đọc các thuộc tính hệ thống trước; nếu không có thuộc tính hệ thống nào được xác định cho một mục cấu hình trong `SurfaceFlingerProperties.sysprop`, thì `surfaceflinger` sẽ quay lại HAL ConfigStore.

Android 8.0 chia hệ điều hành Android nguyên khối thành các phân vùng chung (system.img) và dành riêng cho phần cứng (vendor.imgodm.img). Do thay đổi này, bạn phải xoá quá trình biên dịch có điều kiện khỏi các mô-đun được cài đặt vào phân vùng hệ thống và các mô-đun đó phải xác định cấu hình của hệ thống trong thời gian chạy (và hoạt động khác nhau tuỳ thuộc vào cấu hình đó).

ConfigStore HAL cung cấp một nhóm API để truy cập vào các mục cấu hình chỉ đọc dùng để định cấu hình khung Android. Trang này mô tả thiết kế của ConfigStore HAL (và lý do không sử dụng các thuộc tính hệ thống cho mục đích này); các trang khác trong phần này trình bày chi tiết giao diện HAL, triển khai dịch vụcách sử dụng phía máy khách, tất cả đều sử dụng surfaceflinger làm ví dụ. Để được trợ giúp về các lớp giao diện ConfigStore, hãy xem phần Thêm các lớp và mục giao diện.

Tại sao không sử dụng các thuộc tính hệ thống?

Chúng tôi đã cân nhắc sử dụng các thuộc tính hệ thống nhưng phát hiện thấy một số vấn đề cơ bản, bao gồm:

  • Giới hạn độ dài của các giá trị. Các thuộc tính hệ thống có giới hạn chặt chẽ về độ dài của giá trị (92 byte). Ngoài ra, vì các giới hạn này đã được hiển thị trực tiếp cho các ứng dụng Android dưới dạng macro C, nên việc tăng độ dài có thể gây ra các vấn đề về khả năng tương thích ngược.
  • Không hỗ trợ loại. Về cơ bản, tất cả các giá trị đều là chuỗi và API chỉ cần phân tích cú pháp chuỗi thành int hoặc bool. Các kiểu dữ liệu kết hợp khác (ví dụ: mảng và cấu trúc) phải được mã hoá/giải mã bởi các máy khách (ví dụ: "aaa,bbb,ccc" có thể được mã hoá dưới dạng một mảng gồm 3 chuỗi).
  • Ghi đè. Vì các thuộc tính hệ thống chỉ có thể đọc được triển khai dưới dạng các thuộc tính chỉ ghi một lần, nên những nhà cung cấp/ODM muốn ghi đè các giá trị chỉ có thể đọc do AOSP xác định phải nhập các giá trị chỉ có thể đọc của riêng họ trước các giá trị chỉ có thể đọc do AOSP xác định. Điều này dẫn đến việc các giá trị có thể ghi lại do nhà cung cấp xác định bị các giá trị do AOSP xác định ghi đè.
  • Yêu cầu về không gian địa chỉ. Các thuộc tính hệ thống chiếm một lượng tương đối lớn không gian địa chỉ trong mỗi quy trình. Các thuộc tính hệ thống được nhóm thành prop_area đơn vị có kích thước cố định là 128 KB, tất cả đều được phân bổ cho không gian địa chỉ của quy trình ngay cả khi chỉ có một thuộc tính hệ thống duy nhất trong đó được truy cập. Điều này có thể gây ra vấn đề trên các thiết bị 32 bit khi không gian địa chỉ rất hạn chế.

Chúng tôi đã cố gắng khắc phục những hạn chế này mà không làm giảm khả năng tương thích, nhưng vẫn lo ngại rằng các thuộc tính hệ thống không được thiết kế để hỗ trợ việc truy cập vào các mục cấu hình chỉ có thể đọc. Cuối cùng, chúng tôi quyết định rằng các thuộc tính hệ thống phù hợp hơn để chia sẻ một số mục được cập nhật linh hoạt trên tất cả các phiên bản Android theo thời gian thực và cần có một hệ thống mới dành riêng cho việc truy cập vào các mục cấu hình chỉ đọc.

Thiết kế HAL ConfigStore

Thiết kế cơ bản rất đơn giản:

Thiết kế HAL Configstore

Hình 1. Thiết kế HAL ConfigStore

  • Mô tả các cờ bản dựng (hiện được dùng để biên dịch có điều kiện khung) trong HIDL.
  • Các nhà cung cấp và OEM cung cấp các giá trị dành riêng cho SoC và thiết bị cho cờ bản dựng bằng cách triển khai dịch vụ HAL.
  • Sửa đổi khung để sử dụng dịch vụ HAL nhằm tìm giá trị của một mục cấu hình tại thời gian chạy.

Các mục cấu hình hiện được khung tham chiếu sẽ có trong một gói HIDL có phiên bản (android.hardware.configstore@1.0). Các nhà cung cấp/OEM cung cấp giá trị cho các mục cấu hình bằng cách triển khai các giao diện trong gói này và khung sẽ sử dụng các giao diện khi cần lấy giá trị cho một mục cấu hình.

Lưu ý về bảo mật

Các cờ bản dựng được xác định trong cùng một giao diện sẽ chịu ảnh hưởng của cùng một chính sách SELinux. Nếu một hoặc nhiều cờ bản dựng phải có các chính sách SELinux khác nhau, thì các cờ đó phải được tách thành một giao diện khác. Điều này có thể đòi hỏi việc sửa đổi lớn android.hardware.configstore package vì các giao diện riêng biệt không còn tương thích ngược nữa.