AOSP cung cấp các lựa chọn sau đây để lưu trữ thông tin cấu hình trên thiết bị:
- Thuộc tính hệ thống
- Cấu hình thiết bị khởi động sớm
- Thuộc tính lớp trừu tượng phần cứng (HAL)
- Tệp XML cấu hình hệ thống
- Lớp phủ tài nguyên (tĩnh và thời gian chạy)
Thuộc tính hệ thống
Thuộc tính hệ thống là các cặp khoá/giá trị chuỗi được lưu trữ trong từ điển chung build.prop. Thuộc tính hệ thống là những tài nguyên trên toàn hệ thống, dễ sử dụng và có hiệu suất thấp. Khi sử dụng các thuộc tính hệ thống, bạn không cần sử dụng giao tiếp liên quy trình (IPC) ngay cả khi một thuộc tính hệ thống được chia sẻ trên nhiều quy trình. Tuy nhiên, các thuộc tính hệ thống tương tự như các biến chung và có thể gây hại khi bị sử dụng sai mục đích. Việc sử dụng sai các thuộc tính hệ thống có thể dẫn đến các vấn đề như lỗ hổng bảo mật và người dùng không truy cập được vào ứng dụng. Trước khi sử dụng các thuộc tính hệ thống để lưu trữ thông tin cấu hình, hãy cân nhắc các lựa chọn cấu hình khác.
Để biết thêm thông tin về các thuộc tính hệ thống, hãy xem phần Thêm thuộc tính hệ thống
Cấu hình thiết bị khởi động sớm
Trong Android 17 trở lên, dịch vụ init_dev_config hỗ trợ việc khởi động cấu hình thiết bị và thuộc tính hệ thống. Cơ chế kiến trúc động này sẽ tự động chạy khi khởi động sớm.
Khi một hình ảnh hệ thống hoặc nhà cung cấp duy nhất phải hỗ trợ nhiều biến thể phần cứng, các giá trị cấu hình không phải lúc nào cũng được cố định giá trị trong mã tại thời gian xây dựng. Dịch vụ init_dev_config sẽ thực thi trong giai đoạn early-init, ngay trước apexd-bootstrap, cho phép nhà cung cấp kiểm tra trạng thái phần cứng (ví dụ: từ các đối số của trình tải khởi động, các phân vùng được gắn sớm hoặc các bảng cấu hình phần cứng) và tự động khởi động các thuộc tính hệ thống trước khi các dịch vụ và thư viện phụ thuộc được khởi động.
Tích hợp và vòng đời của dịch vụ
Dịch vụ init_dev_config được xác định theo mặc định trong init.rc của hệ thống và được thực thi đồng bộ trong early-init, trước apexd-bootstrap. Các đơn vị tích hợp không cần khai báo dịch vụ init mới.
Thay vào đó, dịch vụ hiện có sẽ sử dụng tính năng mở rộng thuộc tính trên đường dẫn thực thi, tách khai báo dịch vụ hệ thống khỏi tệp nhị phân của nhà cung cấp. Các đơn vị tích hợp chỉ định đường dẫn đến tệp nhị phân của nhà cung cấp bằng cách sử dụng thuộc tính ro.vendor.init_dev_config.path và định cấu hình đường dẫn đó bằng các nhãn và quyền SELinux bắt buộc.
Yêu cầu triển khai của nhà cung cấp
Cách tích hợp với init_dev_config:
Định cấu hình đường dẫn nhị phân của nhà cung cấp tại thời điểm tạo bằng cách sử dụng
PRODUCT_VENDOR_PROPERTIES. Đường dẫn nhị phân được cung cấp phải là đường dẫn hợp lệ đến một tệp nhị phân được cài đặt trong hệ thống:PRODUCT_VENDOR_PROPERTIES += \ ro.vendor.init_dev_config.path=/vendor/bin/init_dev_configNếu bạn không đặt thuộc tính này,
initsẽ bỏ qua quá trình thực thi dịch vụ và quá trình khởi động sẽ tiếp tục diễn ra bình thường.Vì dịch vụ này chạy trước
apexd-bootstrap, nên các thư viện bionic do APEX cung cấp chưa có sẵn. TrongAndroid.bp, hãy đặtbootstrap: true:rust_binary { name: "init_dev_config", vendor: true, srcs: ["src/main.rs"], rustlibs: [ "librustutils", ], bootstrap: true, }Viết logic dịch vụ để phát hiện biến thể phần cứng và đặt các thuộc tính hệ thống thích hợp:
use rustutils::system_properties; fn main() { let hw_sku = read_hardware_sku(); // Dynamically initialize vendor-specific properties: let display_type = match hw_sku { 1 => "oled", _ => "lcd", }; system_properties::write("vendor.display.panel_type", display_type) .expect("Failed to set vendor display property"); }Gắn nhãn tệp nhị phân của nhà cung cấp bằng
init_dev_config_exec:/vendor/bin/init_dev_config u:object_r:init_dev_config_exec:s0Cấp quyền miền
init_dev_configđể đặt các loại tài sản bắt buộc:set_prop(init_dev_config, vendor_my_sku_prop)
Để biết thông tin về cách sử dụng init_dev_config để kích hoạt và tắt APEX, hãy xem phần Lựa chọn APEX của nhà cung cấp khi khởi động.
Thuộc tính HAL
Khi nguồn đáng tin cậy cho một cấu hình là từ một thành phần phần cứng trên thiết bị, HAL cho phần cứng đó phải cung cấp thông tin cho thành phần đó. Xác định một phương thức HAL mới trong HAL hiện có để truy cập vào cấu hình. Để biết thêm thông tin về cách phát triển HAL, hãy xem bài viết AIDL cho HAL.
Tệp XML cấu hình hệ thống
Khi dữ liệu cấu hình là tĩnh nhưng phức tạp (có cấu trúc), hãy cân nhắc sử dụng XML hoặc các định dạng tương tự khác cho dữ liệu cấu hình. Đảm bảo rằng giản đồ tệp vẫn ổn định. Đối với tệp XML, bạn có thể sử dụng xsd_config để giữ cho lược đồ ổn định và tận dụng trình phân tích cú pháp XML được tạo tự động.
Lớp phủ tài nguyên
Bạn có thể dùng lớp phủ tài nguyên để tuỳ chỉnh một sản phẩm. Có hai loại lớp phủ tài nguyên:
Lớp phủ tài nguyên chuẩn dùng để tuỳ chỉnh một sản phẩm tại thời gian xây dựng. Để biết thông tin về lớp phủ tài nguyên tiêu chuẩn, hãy xem phần Tuỳ chỉnh bản dựng bằng lớp phủ tài nguyên.
Lớp phủ tài nguyên thời gian chạy (RRO) được dùng để thay đổi các giá trị tài nguyên của một gói đích tại thời gian chạy. Ví dụ: một ứng dụng được cài đặt trên hình ảnh hệ thống có thể thay đổi hành vi dựa trên giá trị của một tài nguyên. Thay vì cố định giá trị tài nguyên trong mã tại thời gian xây dựng, một RRO được cài đặt trên một phân vùng khác có thể thay đổi giá trị của tài nguyên ứng dụng trong thời gian chạy. Để biết thêm thông tin về RRO, hãy xem bài viết Thay đổi giá trị của tài nguyên ứng dụng trong thời gian chạy.