Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Manifes

Objek VINTF menggabungkan 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 tentang 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. Direkomendasikan untuk ditempatkan di pohon sumber Android di device/ VENDOR / DEVICE /manifest.xml , tetapi beberapa file fragmen dapat digunakan. Untuk mengetahui detailnya, lihat Fragmen manifes 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 (di mana 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 (di mana 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 yang berikut ini:
      1. Manifes vendor
      2. Fragmen manifes vendor opsional
      3. Manifes ODM opsional
      4. Fragmen manifes ODM opsional
    2. Jika tidak, jika ada manifes ODM, gabungkan manifes ODM dengan fragmen manifes ODM opsional.
    3. /vendor/manifest.xml (lama, tidak ada fragmen)

    Perhatikan bahwa:

    • Di perangkat lama, manifes vendor lama dan manifes ODM digunakan. Manifes ODM dapat 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 nanti dalam daftar dapat menimpa tag dalam manifes yang muncul sebelumnya dalam daftar, asalkan tag di manifes selanjutnya memiliki atribut override="true" . Misalnya, manifes ODM mungkin menimpa beberapa <hal> dari manifes vendor. Lihat dokumentasi untuk atribut override bawah ini.

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

Berikut 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 adalah 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 adalah 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 berikut ini:
    • 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>
    <vendor-ndk>
        <version>27</version>
    </vendor-ndk>
    <system-sdk>
        <version>27</version>
    </system-sdk>
</manifest>

Fragmen manifes

Di Android 10 dan lebih tinggi, Anda bisa mengaitkan entri manifes dengan modul HAL dalam sistem build. Ini membuatnya lebih mudah untuk menyertakan modul HAL secara bersyarat dalam sistem build.

Contoh

Dalam Anda Android.bp atau Android.mk file, tambahkan vintf_fragments untuk setiap modul. 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. Ini memungkinkan klien untuk menggunakan antarmuka dan memungkinkan VTS untuk mengidentifikasi implementasi HAL mana yang ada di perangkat. Apa pun yang dilakukan oleh manifes biasa, manifes ini juga melakukannya.

Contoh di bawah ini mengimplementasikan android.hardware.foo@1.0::IFoo/default , yang diinstal ke vendor atau partisi odm . Jika diinstal ke system , product , atau partisi system_ext , gunakan framework jenis alih-alih device jenis.

<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" dapat hilang dari file sumber di pohon sumber Android dan ditulis oleh assemble_vintf pada waktu pembuatan. Tag yang diperlukan harus ada dalam file yang sesuai di perangkat.

?xml
Pilihan. Hanya memberikan informasi ke pengurai XML.
manifest.version
Yg dibutuhkan. Versi meta dari manifes ini . Menjelaskan elemen yang diharapkan dalam manifes. Tidak terkait dengan versi XML.
manifest.type
Yg dibutuhkan. Jenis manifes ini. Ini memiliki device nilai untuk file manifes perangkat dan framework untuk file manifes kerangka kerja.
manifest.target-level
Diperlukan untuk manifes perangkat. Menentukan versi framework kompatibilitas matriks (FCM) yang menjadi target manifes perangkat ini agar kompatibel. Ini juga disebut versi FCM pengiriman perangkat.
manifest.hal
Opsional, bisa diulang. Satu HAL (HIDL atau native, seperti GL), bergantung pada atribut format .
manifest.hal.format
Pilihan. Nilainya dapat berupa salah satu dari:
  • hidl : HIDL HAL. Ini adalah defaultnya.
  • aidl : AIDL HALs . Hanya valid di manifes meta-versi 2.0 dan di atasnya.
  • native : HAL Asli.
manifest.hal.override
Pilihan. Nilainya dapat berupa salah satu dari:
  • true : Menimpa elemen <hal> dengan <name> dan versi utama yang sama. Jika tidak ada <version> atau <fqname> dalam elemen <hal> , maka elemen <hal> mendeklarasikan HAL ini untuk dinonaktifkan.
  • false : Jangan menimpa elemen <hal> dengan <name> dan versi utama yang sama.
manifest.hal.name
Yg dibutuhkan. Nama paket HAL yang 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 saat manifest.hal.format == "hidl" . TIDAK harus ada jika tidak. Menyatakan transport apa yang digunakan ketika antarmuka dari paket ini di-query dari manajer layanan. Nilainya dapat berupa salah satu dari:
  • hwbinder : Mode terikat
  • passthrough : Mode passthrough
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:
  • Mode 32 : 32-bit
  • 64 : mode 64-bit
  • 32+64 : Keduanya
manifest.hal.version
Opsional, bisa diulang. Versi untuk tag hal dalam manifes.

Untuk HIDL dan native HAL, formatnya MAJOR . MINOR . Sebagai contoh, lihat hardware/interfaces , vendor/${VENDOR}/interfaces , framework/hardware/interfaces , atau system/hardware/interfaces .

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

Untuk AIDL HAL, <version> tidak boleh ada di perangkat yang menjalankan Android 11 dan lebih rendah. <version> harus berupa bilangan bulat tunggal pada perangkat yang menjalankan Android 12 dan lebih tinggi. Harus ada paling banyak satu <version> untuk setiap tupel (package, interface, instance) . Jika tidak ada, default ke 1 . Nilai <version> dikaitkan dengan semua <fqname> dalam <hal> karena <fqname> tidak membawa versi.
manifest.hal.interface
Wajib, bisa diulang tanpa duplikat. Sebutkan antarmuka dalam paket yang memiliki nama instance. Bisa ada beberapa elemen <interface> dalam <hal> ; nama harus berbeda.
manifest.hal.interface.name
Yg dibutuhkan. Nama antarmuka.
manifest.hal.interface.instance
Wajib, bisa diulang. Nama contoh antarmuka. Dapat memiliki beberapa contoh untuk sebuah antarmuka tetapi tidak ada elemen <instance> duplikat.
manifest.hal.fqname
Opsional, bisa diulang. Cara alternatif untuk menentukan 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
Yg dibutuhkan. Berisi semua entri terkait sepolicy.
manifest.sepolicy.version
Diperlukan untuk manifes perangkat. Menyatakan versi SELinux. Ini memiliki format SDK_INT . PLAT_INT .
manifest.vendor-ndk
Wajib, bisa diulang; diperlukan untuk manifest kerangka kerja. Tidak boleh ada dalam manifes perangkat. Beberapa entri <vendor-ndk> harus memiliki <version> berbeda. Menjelaskan sekumpulan snapshot VNDK yang disediakan oleh framework.
manifest.vendor-ndk.version
Yg dibutuhkan. Ini adalah bilangan bulat positif yang mewakili versi snapshot VNDK.
manifest.vendor-ndk.library
Opsional, bisa diulang, tanpa duplikat. Menjelaskan sekumpulan pustaka VNDK yang disediakan oleh kerangka kerja untuk snapshot vendor VNDK ini. Nilainya adalah nama file perpustakaan, misalnya libjpeg.so , termasuk awalan lib dan akhiran .so . Tidak ada komponen jalur yang diizinkan.
manifest.system-sdk.version
Opsional, dapat diulang, tanpa duplikat; hanya digunakan oleh kerangka manifes. Menjelaskan sekumpulan versi SDK sistem yang disediakan oleh framework untuk aplikasi vendor.
manifest.kernel
Pilihan. Menjelaskan informasi statis tentang kernel.
manifest.kernel.target-level
Pilihan. Menjelaskan cabang kernel. Nilai default manifest.target-level jika tidak ada. Harus lebih besar dari atau sama dengan manifest.target-level . Lihat aturan kecocokan kernel untuk detailnya.