Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Manifests

Đố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ề giản đồ, hãy xem lược đồ 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 của nhà cung cấp chỉ định các phiên bản chính sách HAL, SELinux, v.v. chung cho một SoC. Bạn nên đặt nó 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 mảnh. Để biết chi tiết, hãy xem Tệp kê khai phân đoạnTạo DM từ các phân đoạn .
  • Tệp 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 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 của 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 những điều sau:
      1. Tệp kê khai của nhà cung cấp
      2. Các đoạn tệp kê khai của nhà cung cấp tùy chọn
      3. Tệp kê khai ODM tùy chọn
      4. Các đoạn tệp kê khai ODM tùy chọn
    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 các đoạn tệp kê khai ODM tùy chọn.
    3. /vendor/manifest.xml (kế thừa, không có phân đoạn)

    Lưu ý rằng:

    • Trên các thiết bị cũ, tệp kê khai của nhà cung cấp kế thừa 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 của nhà cung cấp kế thừa.
    • 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, 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 sau này có thuộc tính override="true" . Ví dụ: tệp kê khai ODM có thể ghi đè một số <hal> từ tệp kê khai của nhà cung cấp. Xem tài liệu về override thuộc tính bên dưới.

Thiết lập này cho phép nhiều sản phẩm có cùng 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 bản 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>

Đâ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>

Đây là bản 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 chi tiết, hãy xem 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 đượ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ê những điều 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 VNDK;
    • Phiên bản SDK hệ thống.

Tương tự như tệp kê khai thiết bị, nhiều tệp phân mảnh có thể được sử dụng. Để biết chi tiết, hãy xem Phân đoạn tệp kê khai.

Đây là một bản kê khai khuôn khổ 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>

Các đ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 dễ dàng đưa mô-đun HAL vào hệ thống xây dựng có điều kiện hơn.

Thí 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 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 một tệp có tên là 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, tệp kê khai này được thêm vào thiết bị. 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 khách hàng sử dụng giao diện và cho phép VTS xác định các triển khai HAL nào trên thiết bị. Bất cứ điều gì mà một tệp kê khai thông thường làm, tệp kê khai này cũng làm.

Ví dụ dưới đây triển khai android.hardware.foo@1.0::IFoo/default , được cài đặt cho vendor hoặc phân vùng odm . Nếu nó được cài đặt cho system , product hoặc phân vùng 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 tệp kê khai này . Mô tả các phần tử được mong đợi trong tệp kê khai. Không liên quan đến phiên bản XML.
manifest.type
Yêu cầu. Loại tệp 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 tệp kê khai thiết bị. Chỉ định phiên bản ma trận tương thích khung (FCM) mà tệp kê khai thiết bị này được nhắm mục tiêu để 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 (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 số:
  • hidl : HIDL HALs. Đây là mặc định.
  • aidl : AIDL HALs . Chỉ hợp lệ ở meta-phiên bản 2.0 trở lên.
  • native : Native HALs.
manifest.hal.max-level
Không bắt buộc. Chỉ hợp lệ trên các tệp kê khai khung. Nếu được đặt, các HAL có mức 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ị có thể là một trong số:
  • 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> nào trong phần tử <hal> này, thì phần tử <hal> 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 <name> và phiên bản chính.
manifest.hal.name
Yêu cầu. Tên gói hoàn toàn đủ đ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 bản địa, chỉ yêu cầu tên)
manifest.hal.transport
Bắt buộc khi manifest.hal.format == "hidl" . KHÔNG được có mặt khác. Cho biết phương tiện vận chuyển 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 số:
  • hwbinder : Chế độ liên kết
  • passthrough : Chế độ truyền qua
Tùy chọn khi manifest.hal.format == "aidl" . KHÔNG được có mặt khác. Nêu rõ phương tiện vận chuyển nào được sử dụng khi một giao diện được phục vụ từ xa. Giá trị phải là:
  • inet : Inet socket
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 chuyển qua và không được xuất hiện đối hwbinder passthrough Mô tả bitness của dịch vụ truyền qua đang được cung cấp. Giá trị có thể là một trong số:
  • Chế độ 32 : 32-bit
  • Chế độ 64 : 64-bit
  • 32+64 : Cả hai
manifest.hal.transport.ip
Bắt buộc đối với inet và KHÔNG được có mặt khác. Mô tả địa chỉ IP mà từ đó giao diện từ xa đang được cung cấp.
manifest.hal.transport.port
Bắt buộc đối với inet và KHÔNG được có mặt khác. Mô tả cổng mà từ đó 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 cho các thẻ hal trong một tệp kê khai.

Đối với HIDL và HAL tự nhiên, định dạng là MAJOR . MINOR . Ví dụ: hãy tham khảo hardware/interfaces , vendor/${VENDOR}/interfaces , framework/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à chúng đại diện cho các phiên bản chính khác nhau , chỉ có một phiên bản nhỏ 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 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ừ khi 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 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 thiết bị chạy Android 12 trở lên. Phải có nhiều nhất một <version> cho mỗi tuple (package, interface, instance) bản). Nếu không có, hãy đặt mặc định 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 có bản sao. Nêu 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 một <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 phiên bản của giao diện. Có thể có nhiều trường hợp cho một giao diện nhưng không có phần tử <instance> nào bị trùng lặp.
manifest.hal.fqname
Tùy chọn, có thể lặp lại. Một cách thay thế để chỉ định một phiên bản cho HAL với 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 .
manifest.sepolicy
Yêu cầu. Chứa tất cả các mục liên quan đến chính sách.
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. 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 tệp kê khai khung. Không được xuất hiện trong tệp 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 VNDK được cung cấp bởi khuôn khổ.
manifest.vendor-ndk.version
Yêu cầu. Đây là một số nguyên dương đại diện cho phiên bản của ảnh chụp nhanh VNDK.
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 VNDK được cung cấp bởi khuôn khổ cho ảnh chụp nhanh 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 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 tệp kê khai khung. Mô tả một tập hợp các phiên bản SDK hệ thống được cung cấp bởi khung 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ề hạt nhân.
manifest.kernel.target-level
Không bắt buộc. Mô tả nhánh hạt nhân. Giá trị của nó được mặc định manifest.target-level nếu không có. Phải lớn hơn hoặc bằng manifest.target-level mục tiêu. Xem các quy tắc đối sánh hạt nhân để biết chi tiết.