Đối tượng VINTF tổng hợp dữ liệu từ tệp tệp kê khai thiết bị và tệp kê khai khung (XML). Cả hai tệp kê khai đều có cùng một định dạng, mặc dù không phải tất cả phần tử đều áp dụng cho cả hai (để biết thông tin chi tiết về giản đồ, hãy xem Giản đồ tệp kê khai).
Tệp kê khai thiết bị
Tệp kê khai thiết bị (do thiết bị cung cấp) bao gồm tệp kê khai nhà cung cấp và tệp kê khai ODM.
- Tệp kê khai của nhà cung cấp chỉ định HAL, phiên bản chính sách SELinux, v.v. phổ biến với một SoC. Bạn nên đặt tệp này trong cây nguồn Android tại
device/VENDOR/DEVICE/manifest.xml
, nhưng có thể sử dụng nhiều tệp mảnh. Để biết thông tin chi tiết, hãy xem phần Mảnh tệp kê khai và Tạo DM từ các mảnh. - Tệp kê khai ODM liệt kê các HAL dành riêng cho sản phẩm trong phân vùng ODM.
Đối tượng VINTF tải tệp 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
- Tệp kê khai của nhà cung cấp liệt kê các HAL dành riêng cho sản phẩm trong phân vùng của nhà cung cấp.
Đối tượng VINTF tải tệp kê khai 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 tệp kê khai thiết bị theo thứ tự sau:
- Nếu tệp kê khai của nhà cung cấp tồn tại, hãy kết hợp các tệp sau:
- Tệp kê khai nhà cung cấp
- Mảnh tệp kê khai của nhà cung cấp không bắt buộc
- Tệp kê khai ODM không bắt buộc
- Mảnh tệp kê khai ODM không bắt buộc
- Nếu không, 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 mảnh tệp kê khai ODM không bắt buộc.
/vendor/manifest.xml
(cũ, không có mảnh)- Cuối cùng, hãy kết hợp các mảnh tệp kê khai từ mọi APEX của nhà cung cấp. Các mảnh tệp kê khai được tải từ thư mục
etc/vintf
của mỗi APEX (ví dụ:/apex/<apex name>/etc/vintf
).
Lưu ý:
- Trên các thiết bị cũ, tệp kê khai nhà cung cấp cũ và tệp kê khai ODM được sử dụng. Tệp kê khai ODM có thể ghi đè hoàn toàn tệp kê khai nhà cung cấp cũ.
- 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 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>
trong tệp kê khai của nhà cung cấp. Hãy xem tài liệu về thuộc tínhoverride
bên dưới.
- Nếu tệp kê khai của nhà cung cấp tồn tại, hãy kết hợp các tệp sau:
Cấu hình này cho phép nhiều sản phẩm có cùng một bo mạch chia sẻ cùng một hình ảnh nhà cung cấp (cung cấp các HAL phổ biến) 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).
Sau đây là tệp kê khai nhà cung cấp mẫu.
<?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>
Sau đây là tệp kê khai ODM mẫu.
<?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>
Dưới đây là tệp kê khai thiết bị mẫu 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 thông tin chi tiết, hãy xem phần Phát triển tệp kê khai thiết bị.
Tệp kê khai khung
Tệp kê khai khung bao gồm tệp kê khai hệ thống, tệp kê khai sản phẩm và tệp kê khai system_ext.
-
Tệp kê khai hệ thống (do Google cung cấp) được tạo theo cách thủ công và nằm trong cây nguồn Android tại
/system/libhidl/manifest.xml
. - Tệp kê khai sản phẩm (do thiết bị cung cấp) liệt kê các HAL do các mô-đun cài đặt trên phân vùng sản phẩm bảo dưỡng.
-
Tệp kê khai system_ext (do thiết bị cung cấp) liệt kê những nội dung sau:
- HAL do các mô-đun cài đặt trên phân vùng system_ext bảo dưỡng;
- Phiên bản VNDK;
- Phiên bản SDK hệ thống.
Tương tự như tệp kê khai thiết bị, bạn có thể sử dụng nhiều tệp mảnh. Để biết thông tin chi tiết, hãy xem phần Mảnh tệp kê khai.
Dưới đây là tệp kê khai khung mẫu.
<?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>
Mảnh tệp 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 bạn dễ dàng đưa mô-đun HAL vào hệ thống xây dựng theo điều kiện.
Ví dụ
Trong tệp Android.bp
hoặc Android.mk
, hãy thêm vintf_fragments
vào bất kỳ mô-đun nào được cài đặt rõ ràng trên thiết bị, chẳng hạn như cc_binary
hoặc rust_binary
.
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 tạo bản dựng, tệp kê khai này sẽ được thêm vào thiết bị. Việc thêm một mục nhập ở đây cũng giống như thêm một mục nhập trong tệp kê khai chính của thiết bị.
Điều này cho phép ứng dụng sử dụng giao diện và cho phép VTS xác định những phương thức triển khai HAL nào có trên thiết bị. Tệp kê khai này cũng thực hiện mọi thao tác mà tệp kê khai thông thườ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 được cài đặt vào phân vùng system
, product
hoặc system_ext
, hãy sử dụng loại framework
thay vì loại 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>
Nếu một mô-đun HAL được đóng gói trong APEX của nhà cung cấp, hãy đóng gói các mảnh VINTF liên kết trong cùng một APEX bằng prebuilt_etc
như đã giải thích trong mảnh VINTF.
Giản đồ 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à do assemble_vintf
ghi vào thời gian tạo bản 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
- Bắt buộc. Phiên bản siêu dữ liệu của tệp kê khai này. Mô tả các phần tử dự kiến trong tệp kê khai. Không liên quan đến phiên bản XML.
manifest.type
- Bắt buộc. Loại tệp kê khai này. Thuộc tính này có giá trị
device
đối với tệp kê khai thiết bị vàframework
đối với tệp kê khai khung. manifest.target-level
- Bắt buộc đối với tệp kê khai thiết bị. Chỉ định phiên bản ma trận tương thích với khung (FCM) mà tệp kê khai thiết bị này nhắm đến để tương thích. Phiên bản này cũng được gọi là phiên bản FCM đi kèm của thiết bị.
manifest.hal
- Không bắt buộc, có thể lặp lại. Một HAL (HIDL hoặc gốc, chẳng hạn như GL), tuỳ thuộc vào thuộc tính
format
. manifest.hal.format
- Không bắt buộc. Giá trị này có thể là một trong các giá trị sau:
hidl
: HIDL HAL. Đây là tuỳ chọn mặc định.aidl
: HAL AIDL. Chỉ hợp lệ ở siêu phiên bản tệp kê khai 2.0 trở lên.native
: HAL gốc.
manifest.hal.max-level
- Không bắt buộc. Chỉ hợp lệ trên tệp kê khai khung. Nếu được đặt, các HAL có cấp tối đa thấp hơn Phiên bản FCM mục tiêu trong tệp kê khai khung sẽ bị tắt.
manifest.hal.override
- Không bắt buộc. Giá trị này có thể là một trong các giá trị sau:
true
: Ghi đè các phần tử<hal>
khác bằng cùng một<name>
và phiên bản chính. Nếu không có<version>
hoặc<fqname>
nào trong phần tử<hal>
này, thì phần tử<hal>
sẽ khai báo HAL này bị tắt.false
: Không ghi đè các phần tử<hal>
khác bằng cùng một<name>
và phiên bản chính.
manifest.hal.name
- Bắt buộc. Tên gói đủ điều kiện của HAL. Nhiều mục nhập 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 khi
manifest.hal.format == "hidl"
. KHÔNG được có. Cho biết phương thức truyền tải được sử dụng khi truy vấn giao diện từ gói này từ trình quản lý dịch vụ. Giá trị này có thể là một trong các giá trị sau:hwbinder
: Chế độ liên kếtpassthrough
: Chế độ truyền thẳng
- Không bắt buộc khi
manifest.hal.format == "aidl"
. KHÔNG được có. Cho biết phương thức truyền tải được sử dụng khi một giao diện được phân phát 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
- Bắt buộc đối với
passthrough
và không được có tronghwbinder
. Mô tả số bit của dịch vụ chuyển tiếp đang được cung cấp. Giá trị này có thể là một trong các giá trị sau:32
: Chế độ 32 bit64
: Chế độ 64 bit32+64
: Cả hai
manifest.hal.transport.ip
- Bắt buộc đối với
inet
và KHÔNG được xuất hiện nếu không. Mô tả địa chỉ IP mà từ đó giao diện từ xa đang được phân phát. manifest.hal.transport.port
- Bắt buộc đối với
inet
và KHÔNG được xuất hiện nếu không. Mô tả cổng mà giao diện từ xa đang được phân phát. manifest.hal.version
- Không bắt buộc, có thể lặp lại. Phiên bản cho thẻ
hal
trong tệp 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à các trường này đại diện cho các phiên bản chính khác nhau, trong đó chỉ có một phiên bản phụ cho mỗi phiên bản chính được cung cấp. Ví dụ: 3.1 và 3.2 không thể cùng tồn tại, nhưng 1.0 và 3.4 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ừ trường hợpoverride="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 các HAL AIDL,<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 trên các thiết bị chạy Android 12 trở lên. Mỗi nhóm(package, interface, instance)
phải có tối đa một<version>
. Nếu không có, giá trị mặc định sẽ là1
. Giá trị của<version>
được liên kết với tất cả<fqname>
trong cùng một<hal>
vì<fqname>
không mang phiên bản. manifest.hal.interface
- Bắt buộc, có thể lặp lại mà không trùng lặp. Trạng thái một giao diện trong gói có tên thực thể. Có thể có nhiều phần tử
<interface>
trong một<hal>
; tên phải khác nhau. manifest.hal.interface.name
- Bắt buộc. Tên của giao diện.
manifest.hal.interface.instance
- Bắt buộc, có thể lặp lại. Tên thực thể của giao diện. Có thể có nhiều thực thể cho một giao diện nhưng không có phần tử
<instance>
trùng lặp. manifest.hal.fqname
- Không bắt buộc, có thể lặp lại. Một cách khác để chỉ định một thực thể cho HAL có tên
manifest.hal.name
.- Đối với các HAL HIDL, định dạng là
@MAJOR.MINOR::INTERFACE/INSTANCE
. - Đối với HAL AIDL, định dạng là
INTERFACE/INSTANCE
.
- Đối với các HAL HIDL, định dạng là
manifest.sepolicy
- Bắt buộc. Chứa tất cả các mục nhập liên quan đến sepolicy.
manifest.sepolicy.version
- Bắt buộc đối với tệp kê khai thiết bị. Khai báo phiên bản SELinux. Tệp này có định dạng
SDK_INT.PLAT_INT
. manifest.vendor-ndk
- Bắt buộc, có thể lặp lại; bắt buộc đối với tệp kê khai khung. Không được xuất hiện trong tệp kê khai thiết bị. Nhiều mục
<vendor-ndk>
phải có<version>
khác nhau. Mô tả một tập hợp ảnh chụp nhanh VNDK do khung cung cấp. manifest.vendor-ndk.version
- Bắt buộc. Đây là số nguyên dương đại diện cho phiên bản của ảnh chụp nhanh VNDK.
manifest.vendor-ndk.library
- Không bắt buộc, có thể lặp lại, không được trùng lặp. Mô tả một tập hợp các thư viện VNDK do khung cung cấp cho ảnh chụp nhanh nhà cung cấp VNDK này. Giá trị này là tên tệp của một thư viện, ví dụ:
libjpeg.so
, bao gồm tiền tốlib
và hậu tố.so
. Không cho phép thành phần đường dẫn. manifest.system-sdk.version
- Không bắt buộc, có thể lặp lại, không trùng lặp; chỉ được tệp kê khai khung sử dụng. Mô tả một tập hợp các phiên bản SDK hệ thống do khung cung cấp cho ứ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ề hạt nhân.
manifest.kernel.target-level
- Không bắt buộc. Mô tả nhánh nhân. Giá trị mặc định của thuộc tính này là
manifest.target-level
nếu không có. Phải lớn hơn hoặc bằngmanifest.target-level
. Hãy xem quy tắc so khớp nhân để biết thông tin chi tiết.