Tệp kê khai

Đối tượng VINTF tổng hợp dữ liệu từ thiết bị tệp kê khaitệp kê khai khung (XML). Cả hai tệp kê khai có chung đị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 trên 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 của nhà cung cấp và tệp kê khai ODM.

  • Tệp kê khai nhà cung cấp chỉ định các phiên bản chính sách HAL, SELinux, v.v. phổ biến cho SoC. Nó nên đặt trong cây nguồn Android tại device/VENDOR/DEVICE/manifest.xml, nhưng có nhiều mảnh tệp có thể sử dụng. Để biết thông tin chi tiết, vui lòng xem phần Phân đoạn tệp kê khaiTạo Tin nhắn trực tiếp qua mảnh.
  • Tệp kê khai ODM liệt kê HAL (Lớp trừu tượng phần cứng) 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 định nghĩa (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 định nghĩa, /odm/etc/manifest_SKU.xml
    4. /odm/etc/manifest.xml
  • Tệp kê khai nhà cung cấp liệt kê các HAL dành riêng cho sản phẩm trong phân vùng 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 định nghĩa (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 có tệp kê khai nhà cung cấp, hãy kết hợp những dữ liệu 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. 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 ODM không bắt buộc các mảnh tệp kê khai.
    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ừ các APEX của nhà cung cấp bất kỳ.

    Lưu ý:

    • Trên các thiết bị cũ, tệp kê khai của nhà cung cấp cũ và tệp kê khai ODM sẽ được sử dụng. Chiến lược phát hành đĩa đơn 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 sẽ được kết hợp với tệp kê khai nhà cung cấp.
    • Khi bạn kết hợp một 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 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 xuất hiện trước đó tệp kê khai 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 nhà cung cấp. Hãy xem tài liệu dành cho thuộc tính override bên dưới.

Chế độ thiết lập này cho phép nhiều sản phẩm dùng chung một bảng mạch hình ảnh nhà cung cấp (cung cấp HAL thông thường) nhưng có các hình ảnh ODM khác nhau chỉ định HAL (Lớp trừu tượng phần cứng) dành riêng cho sản phẩm).

Dưới đây là ví dụ về tệp 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>

Dưới đây là một ví dụ về tệp 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>

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, hãy xem bài viết Tệp kê khai thiết bị Phát triển.

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 được cung cấp bởi các mô-đun đã 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ê những thông tin sau:
    • HAL được cung cấp bởi các mô-đun được cài đặt trên phân vùng system_ext;
    • Các 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 đoạn tệp kê khai.

Dưới đây là một 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

Trên Android 10 trở lên, bạn có thể liên kết một tệp kê khai bằng mô-đun HAL trong hệ thống xây dựng. Việc 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. Ví dụ: bạn có thể sửa đổi mô-đun với việc triển khai HAL của bạn (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 là manifest_foo.xml, hãy tạo tệp kê khai cho mô-đun này. Trong thời gian xây dựng, tệp kê khai này sẽ được thêm vào thiết bị. Đang thêm một mục nhập ở đây giống như việc thêm một mục vào 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à giúp VTS xác định HAL nào đã triển khai trên thiết bị. Bất cứ điều gì mà tệp kê khai thông thường thì tệp kê khai này cũng có.

Ví dụ bên dưới sẽ 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 mã này được cài đặt trên Phân vùng system, product hoặc system_ext, sử dụng loại framework thay vì nhập 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ô-đun HAL được đóng gói trong APEX của nhà cung cấp, đóng gói các mảnh VINTF được liên kết trong cùng một APEX với prebuilt_etc làm 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ố nội dung "bắt buộc" thẻ có thể bị thiếu từ 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
Bắt buộc. Phiên bản meta của tệp kê khai này. Mô tả dự kiến sẽ có trong tệp kê khai. Không liên quan đến phiên bản XML.
manifest.type
Bắt buộc. Loại của tệp kê khai này. Biến này có giá trị device tương ứng với 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 tệp kê khai thiết bị. Chỉ định ma trận tương thích khung (FCM) mà tệp kê khai thiết bị này nhắm đến để tương thích với. Đây còn được gọi là phiên bản FCM vận chuyển 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ị có thể là một trong các giá trị sau:
  • hidl: HAL HIDL. Đây là tuỳ chọn mặc định.
  • aidl: HAL AIDL. Chỉ hợp lệ tại phiên bản meta của tệp kê khai 2.0 trở lên.
  • native: HAL gốc.
manifest.hal.max-level
Không bắt buộc. Chỉ có hiệu lực trên tệp kê khai khung. Nếu được đặt, 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 đã bị vô hiệu hoá.
manifest.hal.override
Không bắt buộc. Giá trị 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 lớn. Nếu không <version> hoặc <fqname> đang tham gia khảo sát này phần tử <hal>, sau đó là phần tử <hal> khai báo HAL này đã bị tắt.
  • false: Không ghi đè các phần tử <hal> khác có cùng <name> và phiên bản lớn.
manifest.hal.name
Bắt buộc. Tên gói đủ điều kiện của HAL. Có thể sử dụng nhiều mục nhập HAL 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 biểu thị theo cách khác. Nêu rõ phương tiện truyền tải nào được sử dụng khi một 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 các giá trị sau:
  • hwbinder: Chế độ liên kết
  • passthrough: Chế độ truyền qua
Không bắt buộc khi manifest.hal.format == "aidl". KHÔNG được biểu thị theo cách khác. Nêu rõ loại truyền tải nào được sử dụng khi một giao diện được phân phát từ xa. Giá trị phải là:
  • inet: Cổng Inet
manifest.hal.transport.ipmanifest.hal.transport.port phải được sử dụng để 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 xuất hiện đối với hwbinder. Mô tả bit của dịch vụ truyền qua đang được đã cung cấp. Giá trị 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 trong trường hợp khác. Mô tả địa chỉ IP mà từ đó giao diện từ xa được cung cấp.
manifest.hal.transport.port
Bắt buộc đối với inet và KHÔNG được xuất hiện trong trường hợp khác. Mô tả cổng từ mà giao diện từ xa đang được phân phối.
manifest.hal.version
Không bắt buộc, có thể lặp lại. Phiên bản cho các thẻ hal trong một tệp kê khai.

Đối với HIDL và HAL gốc, định dạng là MAJOR.MINOR Cho ví dụ, 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 đó đại diện cho các phiên bản lớn khác biệt, chỉ có một phiên bản nhỏ cho mỗi phiên bản lớn phiên bản đượ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ể. Quy tắc này áp dụng cho mọi phần tử hal có cùng tên, trừ phi override="true" Các giá trị của <version> không được liên kết với <fqname><fqname> có một phiên bản.

Đối với HAL AIDL, <version> không được có trên những thiết bị đang chạy Android 11 trở xuống. <version> phải là một số nguyên trên thiết bị chạy Android 12 trở lên. Chỉ được có tối đa một <version> cho mỗi mã Bộ dữ liệu (package, interface, instance). Nếu không có, hãy đặt mặc định thành 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 có 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ình bày một giao diện trong gói có tên thực thể. Có thể có nhiều Các phần tử <interface> trong <hal>; tên phải khác biệt.
manifest.hal.interface.name
Bắt buộc. Tên 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ể của một giao diện nhưng không có <instance> trùng lặp phần tử.
manifest.hal.fqname
Không bắt buộc, có thể lặp lại. Cách khác để chỉ định một thực thể cho HAL với tên manifest.hal.name.
  • Đối với 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 mọi mục 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. Chiến dịch này có 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 có trong tệp kê khai thiết bị. Nhiều mục nhập <vendor-ndk> phải có <version> khác nhau. Mô tả một tập hợp các ảnh chụp nhanh VNDK mà bộ khung này cung cấp.
manifest.vendor-ndk.version
Bắt buộc. Đây là một số nguyên dương đại diện cho phiên bản của VNDK .
manifest.vendor-ndk.library
Không bắt buộc, có thể lặp lại mà không bị trùng lặp. Mô tả một tập hợp thư viện VNDK dựa trên khung thông tin tổng quan nhanh về nhà cung cấp VNDK này. Giá trị là tên tệp của thư viện, ví dụ: libjpeg.so, bao gồm cả 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
Không bắt buộc, có thể lặp lại mà không bị trùng lặp; mà khung này chỉ sử dụng tệp kê khai. Mô tả một nhóm phiên bản SDK hệ thống mà khung này 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 hạt nhân. Giá trị mặc định là manifest.target-level nếu không có. Phải lớn hơn hoặc bằng manifest.target-level. Xem quy tắc so khớp nhân hệ điều hành để biết thông tin chi tiết.