Manifes

Objek VINTF mengumpulkan data dari manifes perangkat dan file manifes kerangka kerja (XML). Kedua manifes memiliki format yang sama, meskipun tidak semua elemen berlaku untuk keduanya (untuk detail skema, lihat Skema file manifes ).

Manifes perangkat

Manifes perangkat (disediakan oleh perangkat) terdiri dari manifes vendor dan manifes ODM.

  • Manifes vendor menentukan HAL, versi kebijakan SELinux, dll. yang umum untuk SoC. Disarankan untuk ditempatkan di pohon sumber Android di device/ VENDOR / DEVICE /manifest.xml , tetapi beberapa file fragmen dapat digunakan. Untuk mengetahui detailnya, lihat Mewujudkan fragmen dan Menghasilkan DM dari fragmen .
  • Manifes ODM mencantumkan HAL khusus untuk produk di partisi ODM . Objek VINTF memuat manifes ODM dalam urutan ini:
    1. Jika SKU ditentukan (dengan SKU adalah nilai properti ro.boot.product.hardware.sku ), /odm/etc/vintf/manifest_ SKU .xml
    2. /odm/etc/vintf/manifest.xml
    3. Jika SKU ditentukan, /odm/etc/manifest_ SKU .xml
    4. /odm/etc/manifest.xml
  • Manifes vendor mencantumkan HAL khusus untuk produk di partisi vendor. Objek VINTF memuat manifes vendor dalam urutan ini:
    1. Jika SKU ditentukan (dengan SKU adalah nilai properti ro.boot.product.vendor.sku ), /vendor/etc/vintf/manifest_ SKU .xml
    2. /vendor/etc/vintf/manifest.xml
  • Objek VINTF memuat manifes perangkat dalam urutan ini:
    1. Jika manifes vendor ada, gabungkan hal berikut:
      1. Manifes vendor
      2. Fragmen manifes vendor opsional
      3. Manifes ODM opsional
      4. Fragmen manifes ODM opsional
    2. Jika tidak, jika manifes ODM ada, gabungkan manifes ODM dengan fragmen manifes ODM opsional.
    3. /vendor/manifest.xml (warisan, tanpa fragmen)

    Perhatikan bahwa:

    • Pada perangkat lama, manifes vendor lama dan manifes ODM digunakan. Manifes ODM mungkin sepenuhnya menggantikan manifes vendor lama.
    • Pada perangkat yang diluncurkan dengan Android 9, manifes ODM digabungkan dengan manifes vendor.
    • Saat menggabungkan daftar manifes, manifes yang muncul kemudian dalam daftar dapat menggantikan tag dalam manifes yang muncul lebih awal dalam daftar, asalkan tag dalam manifes berikutnya memiliki atribut override="true" . Misalnya, manifes ODM mungkin menggantikan beberapa tag <hal> dari manifes vendor. Lihat dokumentasi untuk override atribut di bawah.

Pengaturan ini memungkinkan beberapa produk dengan papan yang sama untuk berbagi gambar vendor yang sama (yang menyediakan HAL umum) namun memiliki gambar ODM berbeda (yang menentukan HAL khusus produk).

Berikut ini contoh manifes vendor.

<?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>

Berikut ini contoh manifes 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>

Berikut contoh manifes perangkat dalam paket 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>

Untuk detail selengkapnya, lihat Pengembangan Manifes Perangkat .

Manifes kerangka kerja

File manifes kerangka kerja terdiri dari manifes sistem, manifes produk, dan manifes system_ext.

  • Manifes sistem (disediakan oleh Google) dibuat secara manual dan berada di pohon sumber Android di /system/libhidl/manifest.xml .
  • Manifes produk (disediakan oleh perangkat) mencantumkan HAL yang dilayani oleh modul yang diinstal pada partisi produk.
  • Manifes system_ext (disediakan oleh perangkat) mencantumkan hal berikut:
    • HAL dilayani oleh modul yang diinstal pada partisi system_ext;
    • versi VNDK;
    • Versi SDK Sistem.

Mirip dengan manifes perangkat, beberapa file fragmen dapat digunakan. Untuk detailnya, lihat Fragmen manifes .

Berikut ini contoh manifes kerangka kerja.

<?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>

Fragmen manifes

Di Android 10 dan lebih tinggi, Anda dapat mengaitkan entri manifes dengan modul HAL di sistem build. Hal ini mempermudah penyertaan modul HAL secara kondisional dalam sistem build.

Contoh

Di file Android.bp atau Android.mk Anda, tambahkan vintf_fragments ke modul mana pun. Misalnya, Anda dapat memodifikasi modul dengan implementasi HAL Anda ( my.package.foo@1.0-service-bar ).

... {
    ...
    vintf_fragments: ["manifest_foo.xml"],
    ...
}
LOCAL_MODULE := ...
LOCAL_VINTF_FRAGMENTS := manifest_foo.xml

Dalam file bernama manifest_foo.xml , buat manifes untuk modul ini. Pada waktu pembuatan, manifes ini ditambahkan ke perangkat. Menambahkan entri di sini sama dengan menambahkan entri di manifes utama perangkat. Hal ini memungkinkan klien untuk menggunakan antarmuka dan memungkinkan VTS mengidentifikasi implementasi HAL mana yang ada pada perangkat. Apa pun yang dilakukan oleh manifes reguler, manifes ini juga akan melakukannya.

Contoh di bawah mengimplementasikan android.hardware.foo@1.0::IFoo/default , yang diinstal ke partisi vendor atau odm . Jika diinstal ke partisi system , product , atau system_ext , gunakan tipe framework alih-alih tipe 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>

Skema file manifes

Bagian ini menjelaskan arti dari tag XML ini. Beberapa tag "wajib" mungkin hilang dari file sumber di pohon sumber Android dan ditulis oleh assemble_vintf pada waktu pembuatan. Tag yang diperlukan harus ada di file terkait di perangkat.

?xml
Opsional. Hanya memberikan informasi ke parser XML.
manifest.version
Diperlukan. Versi meta dari manifes ini . Menjelaskan unsur-unsur yang diharapkan dalam manifes. Tidak terkait dengan versi XML.
manifest.type
Diperlukan. Jenis manifes ini. Ini memiliki nilai device untuk file manifes perangkat dan framework untuk file manifes kerangka kerja.
manifest.target-level
Diperlukan untuk manifes perangkat. Menentukan versi matriks kompatibilitas kerangka kerja (FCM) yang menjadi target manifes perangkat ini agar kompatibel. Ini juga disebut perangkat versi pengiriman FCM.
manifest.hal
Opsional, bisa diulang. Satu HAL (HIDL atau asli, seperti GL), bergantung pada atribut format .
manifest.hal.format
Opsional. Nilainya dapat berupa salah satu dari:
  • hidl : HIDL HAL. Ini adalah standarnya.
  • aidl : AIDL HAL . Hanya valid pada meta manifes versi 2.0 ke atas.
  • native : HAL asli.
manifest.hal.max-level
Opsional. Hanya valid pada manifes kerangka kerja. Jika disetel, HAL dengan tingkat maksimal lebih rendah dari Versi FCM Target dalam manifes kerangka kerja akan dinonaktifkan.
manifest.hal.override
Opsional. Nilainya dapat berupa salah satu dari:
  • true : Mengganti elemen <hal> lainnya dengan <name> dan versi utama yang sama. Jika tidak ada <version> atau <fqname> dalam elemen <hal> ini, maka elemen <hal> menyatakan HAL ini dinonaktifkan.
  • false : Jangan menimpa elemen <hal> lainnya dengan <name> dan versi utama yang sama.
manifest.hal.name
Diperlukan. Nama paket HAL yang sepenuhnya memenuhi syarat. Beberapa entri HAL dapat menggunakan nama yang sama. Contoh:
  • android.hardware.camera (HIDL atau AIDL HAL)
  • GLES (HAL asli, hanya memerlukan nama)
manifest.hal.transport
Diperlukan ketika manifest.hal.format == "hidl" . Jika tidak, TIDAK boleh hadir. Menyatakan transport apa yang digunakan ketika antarmuka dari paket ini ditanyakan ke manajer layanan. Nilainya dapat berupa salah satu dari:
  • hwbinder : Mode pengikat
  • passthrough : Mode lewat
Opsional ketika manifest.hal.format == "aidl" . Jika tidak, TIDAK boleh hadir. Menyatakan transport apa yang digunakan ketika antarmuka dilayani dari jarak jauh. Nilainya harus:
  • inet : soket Inet
manifest.hal.transport.ip dan manifest.hal.transport.port harus digunakan untuk menentukan lebih lanjut informasi koneksi Inet.
manifest.hal.transport.arch
Diperlukan untuk passthrough dan tidak boleh ada untuk hwbinder . Menjelaskan bitness dari layanan passthrough yang disediakan. Nilainya dapat berupa salah satu dari:
  • 32 : modus 32-bit
  • 64 : Modus 64-bit
  • 32+64 : Keduanya
manifest.hal.transport.ip
Diperlukan untuk inet dan TIDAK boleh ada sebaliknya. Menjelaskan alamat IP dari mana antarmuka jarak jauh dilayani.
manifest.hal.transport.port
Diperlukan untuk inet dan TIDAK boleh ada sebaliknya. Menjelaskan port dari mana antarmuka jarak jauh dilayani.
manifest.hal.version
Opsional, bisa diulang. Versi untuk tag hal dalam manifes.

Untuk HIDL dan HAL asli, formatnya adalah MAJOR . MINOR . Misalnya, lihat hardware/interfaces , vendor/${VENDOR}/interfaces , frameworks/hardware/interfaces , atau system/hardware/interfaces .

HIDL dan HAL asli dapat menggunakan beberapa kolom versi selama keduanya mewakili versi mayor yang berbeda , dengan hanya satu versi minor untuk setiap versi mayor yang disediakan. Misalnya, 3.1 dan 3.2 tidak bisa hidup berdampingan, tapi 1.0 dan 3.4 bisa. Ini berlaku untuk semua elemen hal dengan nama yang sama, kecuali override="true" . Nilai <version> tidak dikaitkan dengan <fqname> karena <fqname> membawa sebuah versi.

Untuk AIDL HAL, <version> tidak boleh ada di perangkat yang menjalankan Android 11 dan yang lebih lama. <version> harus berupa bilangan bulat tunggal pada perangkat yang menjalankan Android 12 dan yang lebih baru. Harus ada paling banyak satu <version> untuk setiap tuple (package, interface, instance) . Jika tidak ada, defaultnya adalah 1 . Nilai <version> dikaitkan dengan semua <fqname> di <hal> yang sama karena <fqname> tidak membawa versi.
manifest.hal.interface
Wajib, bisa mengulang tanpa duplikat. Nyatakan antarmuka dalam paket yang memiliki nama instance. Mungkin ada beberapa elemen <interface> dalam <hal> ; nama harus berbeda.
manifest.hal.interface.name
Diperlukan. Nama antarmuka.
manifest.hal.interface.instance
Wajib, bisa mengulang. Nama contoh antarmuka. Dapat memiliki beberapa instance untuk sebuah antarmuka tetapi tidak ada elemen <instance> yang diduplikasi.
manifest.hal.fqname
Opsional, bisa diulang. Cara alternatif untuk menentukan sebuah instance untuk HAL dengan nama manifest.hal.name .
  • Untuk HIDL HAL, formatnya adalah @ MAJOR . MINOR :: INTERFACE / INSTANCE .
  • Untuk AIDL HAL, formatnya adalah INTERFACE / INSTANCE .
manifest.sepolicy
Diperlukan. Berisi semua entri terkait sepolicy.
manifest.sepolicy.version
Diperlukan untuk manifes perangkat. Mendeklarasikan versi SELinux. Ini memiliki format SDK_INT . PLAT_INT .
manifest.vendor-ndk
Wajib, bisa mengulang; diperlukan untuk manifes kerangka kerja. Tidak boleh ada dalam manifes perangkat. Beberapa entri <vendor-ndk> harus memiliki <version> yang berbeda. Menjelaskan serangkaian snapshot VNDK yang disediakan oleh kerangka kerja.
manifest.vendor-ndk.version
Diperlukan. Ini adalah bilangan bulat positif yang mewakili versi snapshot VNDK.
manifest.vendor-ndk.library
Opsional, bisa mengulang, tanpa duplikat. Menjelaskan sekumpulan pustaka VNDK yang disediakan oleh kerangka kerja untuk snapshot vendor VNDK ini. Nilainya adalah nama file suatu perpustakaan, misalnya libjpeg.so , termasuk awalan lib dan akhiran .so . Tidak ada komponen jalur yang diperbolehkan.
manifest.system-sdk.version
Opsional, bisa mengulang, tanpa duplikat; hanya digunakan oleh manifes kerangka kerja. Menjelaskan serangkaian versi SDK sistem yang disediakan oleh kerangka kerja untuk aplikasi vendor.
manifest.kernel
Opsional. Menjelaskan informasi statis tentang kernel.
manifest.kernel.target-level
Opsional. Menjelaskan cabang kernel. Nilai defaultnya adalah manifest.target-level jika tidak ada. Harus lebih besar atau sama dengan manifest.target-level . Lihat aturan kecocokan kernel untuk detailnya.