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
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, nên HAL ConfigStore đã ngừng hoạt động.
HAL ConfigStore vẫn nằm trong AOSP để hỗ trợ các phân vùng nhà cung cấp cũ. 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 tiên; 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à phân vùng dành riêng cho phần cứng (vendor.img
và odm.img
). Do thay đổi này, bạn phải xoá tính năng 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 bộ API để truy cập vào các mục cấu hình chỉ có thể đọc dùng để định cấu hình khung Android. Trang này mô tả thiết kế của HAL ConfigStore (và lý do các thuộc tính hệ thống không được dùng cho mục đích này); các trang khác trong phần này trình bày chi tiết về giao diện HAL, triển khai dịch vụ và cách sử dụng phía máy khách, tất cả đều lấy 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 việc sử dụng các thuộc tính hệ thống nhưng nhận thấy một số vấn đề cơ bản, bao gồm:
- Giới hạn độ dài đối với giá trị. Các thuộc tính hệ thống có giới hạn nghiêm ngặt 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 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ặcbool
. Các loại dữ liệu phức hợp khác (ví dụ: mảng và cấu trúc) phải được các ứng dụng mã hoá/giải mã (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 thuộc tính ghi một lần, nên các 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ị ghi đè bởi các giá trị do AOSP xác định.
- 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 trong các đơn vị
prop_area
có kích thước cố định là 128 KB, tất cả các đơn vị này được phân bổ cho không gian địa chỉ quy trình ngay cả khi chỉ truy cập một thuộc tính hệ thống duy nhất trong đó. Điều này có thể gây ra vấn đề trên các thiết bị 32 bit, trong đó không gian địa chỉ rất quý giá.
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ợ 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 với việc chia sẻ một vài mục được cập nhật động trên tất cả Android theo thời gian thực và rằng cần tồn tại một hệ thống mới dành riêng cho việc truy cập 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:
Hình 1. Thiết kế HAL ConfigStore
- Mô tả cờ bản dựng (hiện được dùng để biên dịch khung theo điều kiện) trong HIDL.
- Các nhà cung cấp và OEM cung cấp giá trị SoC và giá trị dành riêng cho thiết bị để gắn cờ bản dựng bằng cách triển khai dịch vụ HAL.
- Sửa đổi khung này để sử dụng dịch vụ HAL nhằm tìm giá trị của một mục cấu hình trong thời gian chạy.
Các mục cấu hình hiện được khung tham chiếu được đưa vào gói HIDL phiên bản (android.hardware.configstore@1.0
). 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 giao diện trong gói này và khung sử dụng 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ờ bản dựng được xác định trong cùng một giao diện sẽ chịu ảnh hưởng của chính sách SELinux. Nếu một hoặc nhiều cờ bản dựng có các chính sách SELinux khác nhau, thì các cờ đó phải được tách sang một giao diện khác. Điều này có thể yêu cầu sửa đổi lớn đối với 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.