Đối tượng VINTF tổng hợp dữ liệu từ tệp kê khai thiết bị và tệp kê khai khung (XML). Cả hai tệp kê khai đều có chung một định dạng, mặc dù không phải tất cả các phần tử đều áp dụng cho cả hai (để biết chi tiết về lược đồ, hãy xem Lược đồ tệp kê khai ).
Bản kê khai thiết bị
Bản kê khai thiết bị (do thiết bị cung cấp) bao gồm bản kê khai của nhà cung cấp và bản kê khai của ODM.
- Bản kê khai của nhà cung cấp chỉ định HAL, các phiên bản chính sách SELinux, v.v. phổ biến cho SoC. Bạn nên đặt trong cây nguồn Android tại
device/ VENDOR / DEVICE /manifest.xml
, nhưng có thể sử dụng nhiều tệp phân đoạn. Để biết chi tiết, hãy xem phần Bản kê khai các đoạn và Tạo DM từ các đoạn . - Bản kê khai ODM liệt kê các HAL cụ thể cho sản phẩm trong phân vùng ODM . Đối tượng VINTF tải bảng kê khai ODM theo thứ tự sau:
- Nếu
SKU
được xác định (trong đóSKU
là giá trị của thuộc tínhro.boot.product.hardware.sku
),/odm/etc/vintf/manifest_ SKU .xml
-
/odm/etc/vintf/manifest.xml
- Nếu
SKU
được xác định,/odm/etc/manifest_ SKU .xml
-
/odm/etc/manifest.xml
- Nếu
- Bản kê khai của nhà cung cấp liệt kê các HAL cụ thể cho sản phẩm trong phân vùng của nhà cung cấp. Đối tượng VINTF tải bảng kê khai của nhà cung cấp theo thứ tự sau:
- Nếu
SKU
được xác định (trong đóSKU
là giá trị của thuộc tínhro.boot.product.vendor.sku
),/vendor/etc/vintf/manifest_ SKU .xml
-
/vendor/etc/vintf/manifest.xml
- Nếu
- Đối tượng VINTF tải bảng kê khai thiết bị theo thứ tự sau:
- Nếu bản kê khai của nhà cung cấp tồn tại, hãy kết hợp những điều sau:
- Bản kê khai của nhà cung cấp
- Các đoạn kê khai nhà cung cấp tùy chọn
- Bản kê khai ODM tùy chọn
- Các đoạn tệp kê khai ODM tùy chọn
- Ngược lại, nếu tệp kê khai ODM tồn tại, hãy kết hợp tệp kê khai ODM với các đoạn tệp kê khai ODM tùy chọn.
-
/vendor/manifest.xml
(cũ, không có đoạn)
Lưu ý rằng:
- Trên các thiết bị cũ, bảng kê khai nhà cung cấp cũ và bảng kê khai ODM được sử dụng. Tệp kê khai ODM có thể ghi đè hoàn toàn tệp kê khai cũ của nhà cung cấp.
- Trên các thiết bị chạy Android 9, tệp kê khai ODM được kết hợp với tệp kê khai của nhà cung cấp.
- Khi kết hợp danh sách các tệp kê khai, các tệp kê khai xuất hiện sau trong danh sách có thể ghi đè các thẻ trong các tệp kê khai xuất hiện trước đó trong danh sách, miễn là các thẻ trong tệp kê khai sau có thuộc tính
override="true"
. Ví dụ: tệp kê khai ODM có thể ghi đè một số thẻ<hal>
từ tệp kê khai của nhà cung cấp. Xem tài liệu về ghi đèoverride
bên dưới.
- Nếu bản kê khai của nhà cung cấp tồn tại, hãy kết hợp những điều sau:
Thiết lập này cho phép nhiều sản phẩm có cùng một bảng chia sẻ cùng một hình ảnh nhà cung cấp (cung cấp các HAL chung) nhưng có các hình ảnh ODM khác nhau (chỉ định các HAL dành riêng cho sản phẩm).
Đây là một ví dụ về bảng kê khai nhà cung cấp.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="2.0" type="device" target-level="1"> <hal> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.4</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> <instance>proprietary/0</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.0</version> <version>2.0</version> <interface> <name>INfc</name> <instance>nfc_nci</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <fqname>@2.0::INfc/default</fqname> </hal> <hal> <name>android.hardware.drm</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ICryptoFactory</name> <instance>default</instance> </interface> <interface> <name>IDrmFactory</name> <instance>default</instance> </interface> <fqname>@1.1::ICryptoFactory/clearkey</fqname> <fqname>@1.1::IDrmFactory/clearkey</fqname> </hal> <hal format="aidl"> <name>android.hardware.light</name> <version>1</version> <fqname>ILights/default</fqname> </hal> <hal format="aidl"> <name>android.hardware.power</name> <version>2</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> <hal format="native"> <name>EGL</name> <version>1.1</version> </hal> <hal format="native"> <name>GLES</name> <version>1.1</version> <version>2.0</version> <version>3.0</version> </hal> <sepolicy> <version>25.0</version> </sepolicy> </manifest>
Đây là một ví dụ về bảng kê khai ODM.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device"> <!-- camera 3.4 in vendor manifest is ignored --> <hal override="true"> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.5</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> </interface> </hal> <!-- NFC is declared to be disabled --> <hal override="true"> <name>android.hardware.nfc</name> <transport>hwbinder</transport> </hal> <hal> <name>android.hardware.power</name> <transport>hwbinder</transport> <version>1.1</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> </manifest>
Sau đây là ví dụ về bảng kê khai thiết bị trong gói OTA.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device" target-level="1"> <!-- hals ommited --> <kernel version="4.4.176"> <config> <key>CONFIG_ANDROID</key> <value>y</value> </config> <config> <key>CONFIG_ARM64</key> <value>y</value> </config> <!-- other configs ommited --> </kernel> </manifest>
Để biết thêm chi tiết, hãy xem Phát triển bản kê khai thiết bị .
Tệp kê khai khung
Tệp kê khai khung bao gồm bảng kê khai hệ thống, bảng kê khai sản phẩm và bảng kê khai system_ext.
- Tệp kê khai hệ thống (do Google cung cấp) được tạo thủ công và nằm trong cây nguồn Android tại
/system/libhidl/manifest.xml
. - Bản kê khai sản phẩm (do thiết bị cung cấp) liệt kê các HAL được phục vụ bởi các mô-đun được cài đặt trên phân vùng sản phẩm.
- Tệp kê khai system_ext (do thiết bị cung cấp) liệt kê các thông tin sau:
- HAL được phục vụ bởi các mô-đun được cài đặt trên phân vùng system_ext;
- các phiên bản VNĐK;
- Phiên bản SDK hệ thống.
Tương tự như bảng kê khai thiết bị, có thể sử dụng nhiều tệp phân đoạn. Để biết chi tiết, hãy xem phần Bản kê khai .
Đây là một bảng kê khai khung ví dụ.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="framework"> <hal> <name>android.hidl.allocator</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IAllocator</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.memory</name> <transport arch="32+64">passthrough</transport> <version>1.0</version> <interface> <name>IMapper</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.manager</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IServiceManager</name> <instance>default</instance> </interface> </hal> <hal> <name>android.frameworks.sensorservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISensorManager</name> <instance>default</instance> </interface> </hal> <hal max-level="5"> <name>android.frameworks.schedulerservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISchedulingPolicyService</name> <instance>default</instance> </interface> </hal> <vendor-ndk> <version>27</version> </vendor-ndk> <system-sdk> <version>27</version> </system-sdk> </manifest>
Đoạn kê khai
Trong Android 10 trở lên, bạn có thể liên kết mục nhập tệp kê khai với mô-đun HAL trong hệ thống xây dựng. Điều này giúp việc đưa mô-đun HAL vào hệ thống xây dựng có điều kiện dễ dàng hơn.
Ví dụ
Trong tệp Android.bp
hoặc Android.mk
của bạn, hãy thêm vintf_fragments
vào bất kỳ mô-đun nào. Ví dụ: bạn có thể sửa đổi mô-đun bằng cách triển khai HAL ( my.package.foo@1.0-service-bar
).
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
Trong tệp có tên manifest_foo.xml
, hãy tạo tệp kê khai cho mô-đun này. Tại thời điểm xây dựng, bảng kê khai này sẽ được thêm vào thiết bị. Thêm mục nhập ở đây cũng giống như thêm mục nhập trong bảng kê khai chính của thiết bị. Điều này cho phép khách hàng sử dụng giao diện và cho phép VTS xác định triển khai HAL nào trên thiết bị. Bất cứ điều gì mà một bảng kê khai thông thường thực hiện thì bảng kê khai này cũng thực hiện.
Ví dụ bên dưới triển khai android.hardware.foo@1.0::IFoo/default
, được cài đặt vào phân vùng vendor
hoặc odm
. Nếu nó được cài đặt vào phân vùng system
, product
hoặc system_ext
, hãy sử dụng type framework
thay vì type device
.
<manifest version="1.0" type="device"> <hal format="hidl"> <name>android.hardware.foo</name> <transport>hwbinder</transport> <fqname>@1.0::IFoo/default</fqname> </hal> </manifest>
Lược đồ tệp kê khai
Phần này mô tả ý nghĩa của các thẻ XML này. Một số thẻ "bắt buộc" có thể bị thiếu trong tệp nguồn trong cây nguồn Android và được viết bởi assemble_vintf
tại thời điểm xây dựng. Các thẻ bắt buộc phải có trong các tệp tương ứng trên thiết bị.
-
?xml
- Không bắt buộc. Chỉ cung cấp thông tin cho trình phân tích cú pháp XML.
-
manifest.version
- Yêu cầu. Phiên bản meta của bảng kê khai này . Mô tả các thành phần dự kiến có trong tệp kê khai. Không liên quan đến phiên bản XML.
-
manifest.type
- Yêu cầu. Loại bảng kê khai này. Nó có
device
giá trị cho tệp kê khai thiết bị vàframework
cho tệp kê khai khung. -
manifest.target-level
- Bắt buộc đối với bản kê khai thiết bị. Chỉ định phiên bản ma trận tương thích khung (FCM) mà bảng kê khai thiết bị này hướng tới để tương thích. Đây còn được gọi là phiên bản FCM vận chuyển của thiết bị.
-
manifest.hal
- Tùy chọn, có thể lặp lại. Một HAL đơn (HIDL hoặc gốc, chẳng hạn như GL), tùy thuộc vào thuộc tính
format
. -
manifest.hal.format
- Không bắt buộc. Giá trị có thể là một trong:
-
hidl
: HIDL HAL. Đây là mặc định. -
aidl
: AIDL HAL . Chỉ hợp lệ ở phiên bản meta tệp kê khai 2.0 trở lên. -
native
: HAL bản địa.
-
-
manifest.hal.max-level
- Không bắt buộc. Chỉ hợp lệ trên các bảng kê khai khung. Nếu được đặt, HAL có mức tối đa thấp hơn Phiên bản FCM mục tiêu trong bảng kê khai khung sẽ bị tắt.
-
manifest.hal.override
- Không bắt buộc. Giá trị có thể là một trong:
-
true
: Ghi đè các phần tử<hal>
khác có cùng<name>
và phiên bản chính. Nếu không có<version>
hoặc<fqname>
trong phần tử<hal>
này thì phần tử<hal>
sẽ tuyên bố HAL này bị vô hiệu hóa. -
false
: Không ghi đè các phần tử<hal>
khác có cùng phiên bản<name>
và chính.
-
-
manifest.hal.name
- Yêu cầu. Tên gói đủ điều kiện của HAL. Nhiều mục HAL có thể sử dụng cùng một tên. Ví dụ:
-
android.hardware.camera
(HIDL hoặc AIDL HAL) -
GLES
(HAL gốc, chỉ yêu cầu tên)
-
-
manifest.hal.transport
- Bắt buộc
manifest.hal.format == "hidl"
. KHÔNG được có mặt nếu không. Cho biết phương thức vận chuyển nào được sử dụng khi giao diện từ gói này được truy vấn từ trình quản lý dịch vụ. Giá trị có thể là một trong:-
hwbinder
: Chế độ kết dính -
passthrough
: Chế độ truyền qua
-
- Tùy chọn
manifest.hal.format == "aidl"
. KHÔNG được có mặt nếu không. Cho biết phương thức vận chuyển nào được sử dụng khi giao diện được phục vụ từ xa. Giá trị phải là:-
inet
: Ổ cắm Inet
manifest.hal.transport.ip
vàmanifest.hal.transport.port
để chỉ định thêm thông tin kết nối Inet. -
-
manifest.hal.transport.arch
- Cần thiết để
passthrough
và không được có mặt chohwbinder
. Mô tả mức độ bit của dịch vụ chuyển tiếp được cung cấp. Giá trị có thể là một trong:-
32
: Chế độ 32-bit -
64
: Chế độ 64-bit -
32+64
: Cả hai
-
-
manifest.hal.transport.ip
- Cần thiết cho
inet
và KHÔNG được có mặt nếu không. Mô tả địa chỉ IP mà giao diện từ xa đang được phục vụ. -
manifest.hal.transport.port
- Cần thiết cho
inet
và KHÔNG được có mặt nếu không. Mô tả cổng mà giao diện từ xa đang được phục vụ. -
manifest.hal.version
- Tùy chọn, có thể lặp lại. Một phiên bản dành cho thẻ
hal
trong bảng kê khai.
Đối với HIDL và HAL gốc, định dạng làMAJOR . MINOR
. Để biết ví dụ, hãy tham khảohardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
hoặcsystem/hardware/interfaces
.
HIDL và HAL gốc có thể sử dụng nhiều trường phiên bản miễn là chúng đại diện cho các phiên bản chính riêng biệt , chỉ cung cấp một phiên bản phụ cho mỗi phiên bản chính. Ví dụ: 3.1 và 3.2 không thể cùng tồn tại nhưng 1.0 và 3.4 thì có thể. Điều này áp dụng cho tất cả các phần tửhal
có cùng tên, trừ khioverride="true"
. Các giá trị của<version>
không được liên kết với<fqname>
vì<fqname>
mang một phiên bản.
Đối với AIDL HAL,<version>
không được xuất hiện trên các thiết bị chạy Android 11 trở xuống.<version>
phải là một số nguyên duy nhất trên các thiết bị chạy Android 12 trở lên. Phải có nhiều nhất một<version>
cho mỗi bộ(package, interface, instance)
. Nếu không có, mặc định là1
. Giá trị của<version>
được liên kết với tất cả<fqname>
trong cùng<hal>
vì<fqname>
không mang phiên bản. -
manifest.hal.interface
- Bắt buộc, có thể lặp lại không trùng lặp. Nêu rõ một giao diện trong gói có tên phiên bản. Có thể có nhiều phần tử
<interface>
trong<hal>
; tên phải khác biệt. -
manifest.hal.interface.name
- Yêu cầu. Tên của giao diện.
-
manifest.hal.interface.instance
- Bắt buộc, có thể lặp lại. Tên thể hiện của giao diện. Có thể có nhiều phiên bản cho một giao diện nhưng không có phần tử
<instance>
trùng lặp. -
manifest.hal.fqname
- Tùy chọn, có thể lặp lại. Một cách khác để chỉ định một phiên bản cho HAL có tên
manifest.hal.name
.- Đối với HIDL HAL, định dạng là
@ MAJOR . MINOR :: INTERFACE / INSTANCE
. - Đối với AIDL HAL, định dạng là
INTERFACE / INSTANCE
.
- Đối với HIDL HAL, định dạng là
-
manifest.sepolicy
- Yêu cầu. Chứa tất cả các mục liên quan đến sepolicy.
-
manifest.sepolicy.version
- Bắt buộc đối với bản kê khai thiết bị. Khai báo phiên bản SELinux. Nó có định dạng
SDK_INT . PLAT_INT
. -
manifest.vendor-ndk
- Bắt buộc, có thể lặp lại; cần thiết cho bảng kê khai khung. Không được có mặt trong bảng kê khai thiết bị. Nhiều mục nhập
<vendor-ndk>
phải có các<version>
khác nhau. Mô tả một tập hợp các ảnh chụp nhanh VNĐK được cung cấp bởi khung. -
manifest.vendor-ndk.version
- Yêu cầu. Đây là số nguyên dương biểu thị phiên bản của ảnh chụp nhanh VNĐK.
-
manifest.vendor-ndk.library
- Tùy chọn, có thể lặp lại, không trùng lặp. Mô tả một bộ thư viện VNĐK được cung cấp bởi khung cho ảnh chụp nhanh nhà cung cấp VNĐK này. Giá trị là tên tệp của thư viện, ví dụ
libjpeg.so
, bao gồm tiền tốlib
và hậu tố.so
. Không có thành phần đường dẫn nào được phép. -
manifest.system-sdk.version
- Tùy chọn, có thể lặp lại, không trùng lặp; chỉ được sử dụng bởi bảng kê khai khung. Mô tả một tập hợp các phiên bản SDK hệ thống được khung cung cấp cho các ứng dụng của nhà cung cấp.
-
manifest.kernel
- Không bắt buộc. Mô tả thông tin tĩnh về kernel.
-
manifest.kernel.target-level
- Không bắt buộc. Mô tả nhánh kernel. Giá trị của nó mặc định là
manifest.target-level
nếu không có. Phải lớn hơn hoặc bằngManifest.targetmanifest.target-level
. Xem quy tắc khớp kernel để biết chi tiết.