Tệp kê khai

Đối tượng VINTF tổng hợp dữ liệu từ tệp tệp kê khai thiết bị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ê khaiTạ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:
    1. Nếu SKU được xác định (trong đó SKU là giá trị của thuộc tính ro.boot.product.hardware.sku), /odm/etc/vintf/manifest_SKU.xml
    2. /odm/etc/vintf/manifest.xml
    3. Nếu SKU được xác định, /odm/etc/manifest_SKU.xml
    4. /odm/etc/manifest.xml
  • 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:
    1. Nếu SKU được xác định (trong đó SKU là giá trị của thuộc tính ro.boot.product.vendor.sku), /vendor/etc/vintf/manifest_SKU.xml
    2. /vendor/etc/vintf/manifest.xml
  • Đối tượng VINTF tải tệp kê khai thiết bị theo thứ tự sau:
    1. 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:
      1. Tệp kê khai nhà cung cấp
      2. Mảnh tệp kê khai của nhà cung cấp không bắt buộc
      3. Tệp kê khai ODM không bắt buộc
      4. Mảnh tệp kê khai ODM không bắt buộc
    2. 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.
    3. /vendor/manifest.xml (cũ, không có mảnh)
    4. 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ính override bên dưới.

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ết
  • passthrough: 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
Bạn phải sử dụng manifest.hal.transport.ipmanifest.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ó trong hwbinder. 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 bit
  • 64: Chế độ 64 bit
  • 32+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ảo hardware/interfaces, vendor/${VENDOR}/interfaces, frameworks/hardware/interfaces hoặc system/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ợp override="true". Các giá trị của <version> không được liên kết với <fqname><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><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.
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ằng manifest.target-level. Hãy xem quy tắc so khớp nhân để biết thông tin chi tiết.