Manifes

Objek VINTF menggabungkan data dari device file manifes dan manifes framework (XML). Keduanya manifes berbagi satu format, meskipun tidak semua elemen berlaku untuk keduanya mengenai 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 digunakan SoC. Ini disarankan untuk ditempatkan di hierarki sumber Android di device/VENDOR/DEVICE/manifest.xml, tetapi beberapa fragmen dapat digunakan. Untuk mengetahui detailnya, lihat Fragmen manifes dan Buat DM dari fragmen.
  • Manifes ODM mencantumkan HAL yang khusus untuk produk dalam Partisi ODM. Objek VINTF memuat manifes ODM dalam urutan berikut:
    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 dalam 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-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 ODM opsional fragmen manifes yang lebih besar.
    3. /vendor/manifest.xml (lama, tanpa fragmen)
    4. Terakhir, gabungkan fragmen manifes dari APEX vendor mana pun.

    Perhatikan bahwa:

    • Pada perangkat lama, manifes vendor lama dan manifes ODM akan digunakan. Tujuan Manifes ODM dapat sepenuhnya mengganti 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 menggantikan tag di manifes yang muncul sebelumnya dalam daftar, asalkan tag tersebut berada di manifes memiliki atribut override="true". Misalnya, manifes ODM mungkin mengganti beberapa tag <hal> dari manifes vendor. Lihat dokumentasi untuk atribut override di bawah ini.

Dengan penyiapan ini, beberapa produk dengan papan yang sama dapat menggunakan papan image vendor (yang menyediakan HAL umum) tetapi memiliki image ODM yang berbeda (yang menentukan HAL khusus produk).

Berikut adalah 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 mengetahui detail selengkapnya, lihat Manifes Perangkat Pengembangan.

Manifes framework

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 yang dilayani oleh modul yang diinstal pada partisi system_ext;
    • Versi VNDK;
    • Versi SDK Sistem.

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

Berikut adalah contoh manifes framework.

<?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 yang lebih tinggi, Anda bisa mengaitkan manifes entri dengan modul HAL dalam sistem pembangunan. Hal ini akan memudahkan menyertakan modul HAL dalam sistem build secara bersyarat.

Contoh

Di file Android.bp atau Android.mk, tambahkan vintf_fragments ke modul apa 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

Di file bernama manifest_foo.xml, buat manifes untuk dalam modul ini. Pada waktu build, manifes ini ditambahkan ke perangkat. Menambahkan entri di sini sama dengan menambahkan entri dalam manifes utama perangkat. Hal ini memungkinkan klien untuk menggunakan antarmuka dan memungkinkan VTS untuk mengidentifikasi HAL mana implementasinya ada di perangkat. Apa pun yang merupakan manifes reguler manifes ini juga melakukannya.

Contoh di bawah ini mengimplementasikan android.hardware.foo@1.0::IFoo/default, yang diinstal ke partisi vendor atau odm. Jika diinstal ke Partisi system, product, atau system_ext, jenis penggunaan framework, bukan ketik 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>

Jika modul HAL dikemas dalam APEX vendor, mengemas fragmen VINTF terkaitnya dalam APEX yang sama dengan prebuilt_etc sebagai dijelaskan dalam fragmen VINTF.

Skema file manifes

Bagian ini menjelaskan arti tag XML tersebut. Beberapa "wajib diisi" tag bisa hilang dari file sumber di pohon sumber Android dan ditulis oleh assemble_vintf pada waktu build. Tag yang diperlukan harus ada dalam file yang sesuai di perangkat seluler.

?xml
Opsional. Hanya memberikan informasi ke parser XML.
manifest.version
Wajib diisi. Versi meta dari manifes ini. Menjelaskan elemen yang diharapkan dalam manifes. Tidak terkait dengan versi XML.
manifest.type
Wajib diisi. Jenis manifes ini. Objek ini memiliki nilai device untuk file manifes perangkat dan framework untuk manifes framework .
manifest.target-level
Diperlukan untuk manifes perangkat. Menentukan matriks kompatibilitas framework (FCM) yang ditargetkan agar manifes perangkat ini kompatibel kami. Versi ini juga disebut sebagai versi FCM pengiriman perangkat.
manifest.hal
Opsional, bisa diulangi. Satu HAL (HIDL atau native, seperti GL), bergantung pada atribut format.
manifest.hal.format
Opsional. Nilainya bisa berupa salah satu dari:
  • hidl: HIDL HAL. Ini adalah defaultnya.
  • aidl: HAL AIDL. Hanya berlaku di meta-versi 2.0 dan yang lebih baru.
  • native: HAL Native.
manifest.hal.max-level
Opsional. Hanya berlaku pada manifes framework. Jika disetel, HAL dengan level maksimum lebih rendah daripada Versi FCM Target dalam manifes framework akan dinonaktifkan.
manifest.hal.override
Opsional. Nilainya bisa berupa salah satu dari:
  • true: Ganti elemen <hal> lainnya dengan <name> dan versi utama yang sama. Jika tidak <version> atau <fqname> ada di ini elemen <hal>, lalu elemen <hal> mendeklarasikan HAL ini sebagai dinonaktifkan.
  • false: Jangan ganti elemen <hal> lain dengan <name> dan versi utama yang sama.
manifest.hal.name
Wajib diisi. Nama paket HAL yang sepenuhnya memenuhi syarat. Beberapa entri HAL bisa menggunakan nama yang sama. Contoh:
  • android.hardware.camera (HIDL atau AIDL HAL)
  • GLES (HAL native, hanya memerlukan nama)
manifest.hal.transport
Wajib diisi saat manifest.hal.format == "hidl". TIDAK boleh ada jika sebaliknya. Menyatakan {i>transport<i} apa yang digunakan ketika antarmuka dari paket ini diminta oleh pengelola layanan. Nilainya bisa berupa salah satu dari:
  • hwbinder: Mode terbiner
  • passthrough: Mode passthrough
Opsional saat manifest.hal.format == "aidl". TIDAK boleh ada jika sebaliknya. Menentukan transport yang digunakan saat antarmuka disajikan dari jarak jauh. Nilainya harus:
  • inet: Inet socket
manifest.hal.transport.ip dan manifest.hal.transport.port harus digunakan untuk menentukan informasi koneksi Inet lebih lanjut.
manifest.hal.transport.arch
Wajib untuk passthrough dan tidak boleh ada untuk hwbinder. Menjelaskan bit{i> <i}dari layanan passthrough yang yang Anda berikan. Nilainya bisa berupa salah satu dari:
  • 32: Mode 32-bit
  • 64: Mode 64-bit
  • 32+64: Keduanya
manifest.hal.transport.ip
Wajib untuk inet dan TIDAK boleh ada jika tidak. Menjelaskan alamat IP tempat antarmuka jarak jauh disajikan.
manifest.hal.transport.port
Wajib untuk inet dan TIDAK boleh ada jika tidak. Menjelaskan porta dari di mana antarmuka jarak jauh disajikan.
manifest.hal.version
Opsional, bisa diulangi. Versi untuk tag hal dalam manifes.

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

HIDL dan HAL native dapat menggunakan beberapa isian versi asalkan keduanya mewakili versi utama yang berbeda, dengan hanya satu versi minor per varian versi yang diberikan. Misalnya, 3.1 dan 3.2 tidak dapat berdampingan, tetapi 1.0 dan 3.4 dapat melakukannya. Ini berlaku untuk semua elemen hal dengan nama yang sama, kecuali override="true". Nilai <version> bukan yang dikaitkan dengan <fqname> karena <fqname> membawa versi.

Untuk HAL AIDL, <version> tidak boleh ada pada perangkat yang menjalankan Android 11 dan yang lebih lama. <version> harus berupa bilangan bulat tunggal di perangkat yang menjalankan Android 12 dan yang lebih baru. Harus ada maksimum satu <version> untuk setiap (package, interface, instance) tuple. Jika tidak ada, tetapkan default ke 1. Nilai <version> dikaitkan dengan semua <fqname> dalam <hal> yang sama karena <fqname> tidak membawa versi.
manifest.hal.interface
Wajib diisi, dapat diulang tanpa duplikat. Nyatakan antarmuka di paket yang memiliki nama instance. Bisa terdapat beberapa Elemen <interface> di <hal>; nama harus berbeda.
manifest.hal.interface.name
Wajib diisi. Nama antarmuka.
manifest.hal.interface.instance
Wajib diisi, dapat diulang. Nama instance antarmuka. Dapat memiliki lebih dari satu instance untuk antarmuka, tetapi tidak ada <instance> duplikat yang kurang penting.
manifest.hal.fqname
Opsional, bisa diulangi. Cara alternatif untuk menentukan instance HAL dengan nama manifest.hal.name.
  • Untuk HIDL HAL, formatnya adalah @MAJOR.MINOR::INTERFACE/INSTANCE.
  • Untuk AIDL HAL, formatnya adalah INTERFACE/INSTANCE.
manifest.sepolicy
Wajib diisi. Berisi semua entri terkait sepolicy.
manifest.sepolicy.version
Diperlukan untuk manifes perangkat. Mendeklarasikan versi SELinux. Materi ini memiliki format SDK_INT.PLAT_INT.
manifest.vendor-ndk
Wajib diisi, dapat diulang; yang diperlukan untuk manifes framework. Tidak boleh ada dalam manifes perangkat. Beberapa entri <vendor-ndk> harus memiliki <version> yang berbeda. Menjelaskan serangkaian snapshot VNDK yang disediakan oleh framework.
manifest.vendor-ndk.version
Wajib diisi. Ini adalah bilangan bulat positif yang merepresentasikan versi VNDK tanpa harus membuat snapshot.
manifest.vendor-ndk.library
Opsional, dapat diulang, tanpa duplikat. Menjelaskan serangkaian library VNDK yang disediakan oleh framework untuk snapshot vendor VNDK ini. Nilainya adalah nama file library, mis. libjpeg.so, termasuk awalannya lib dan akhiran .so. Tidak ada komponen jalur yang diizinkan.
manifest.system-sdk.version
Opsional, dapat mengulang, tanpa duplikat; hanya digunakan oleh kerangka kerja manifes. Menjelaskan kumpulan versi SDK sistem yang disediakan oleh framework untuk aplikasi vendor.
manifest.kernel
Opsional. Menjelaskan informasi statis tentang kernel.
manifest.kernel.target-level
Opsional. Menjelaskan cabang {i>kernel<i}. Nilainya secara default adalah manifest.target-level jika tidak ada. Harus lebih besar dari atau sama dengan manifest.target-level. Lihat aturan pencocokan kernel untuk mengetahui detailnya.