Manifes

Objek VINTF menggabungkan data dari file manifes perangkat dan manifes framework (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. Manifes direkomendasikan untuk ditempatkan di hierarki sumber Android di device/VENDOR/DEVICE/manifest.xml, tetapi beberapa file fragmen dapat digunakan. Untuk mengetahui detailnya, lihat Fragmen manifes dan Membuat 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. Atau, jika manifes ODM ada, gabungkan manifes ODM dengan fragmen manifes ODM opsional.
    3. /vendor/manifest.xml (lama, tanpa fragmen)
    4. Terakhir, gabungkan fragmen manifes dari APEX vendor mana pun. Fragmen manifes dimuat dari direktori etc/vintf setiap APEX (misalnya, /apex/<apex name>/etc/vintf).

    Perhatikan bahwa:

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

Penyiapan ini memungkinkan beberapa produk dengan board yang sama untuk berbagi gambar vendor yang sama (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 Pengembangan Manifes Perangkat.

Manifes framework

File manifes framework terdiri dari manifes sistem, manifes produk, dan manifes system_ext.

  • Manifes sistem (disediakan oleh Google) dibuat secara manual dan berada di hierarki sumber Android di /system/libhidl/manifest.xml.
  • Manifes produk (disediakan oleh perangkat) mencantumkan HAL yang dilayani oleh modul yang diinstal di partisi produk.
  • Manifes system_ext (disediakan oleh perangkat) mencantumkan hal berikut:
    • HAL yang dilayani oleh modul yang diinstal di 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 dapat mengaitkan entri manifes dengan modul HAL di sistem build. Hal ini memudahkan penyertaan modul HAL secara kondisional dalam sistem build.

Contoh

Dalam file Android.bp atau Android.mk, tambahkan vintf_fragments ke modul apa pun yang diinstal secara eksplisit di perangkat, seperti cc_binary atau rust_binary. Misalnya, Anda dapat mengubah modul dengan penerapan HAL (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 build, manifes ini ditambahkan ke perangkat. Menambahkan entri di sini sama dengan menambahkan entri di manifes utama perangkat. Hal ini memungkinkan klien menggunakan antarmuka dan memungkinkan VTS mengidentifikasi implementasi HAL yang ada di perangkat. Manifes ini juga melakukan apa pun yang dilakukan manifes biasa.

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, gunakan jenis framework, bukan jenis 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, kemas fragmen VINTF terkait dalam APEX yang sama dengan prebuilt_etc seperti yang dijelaskan dalam fragmen VINTF.

Skema file manifes

Bagian ini menjelaskan arti tag XML ini. Beberapa tag "required" dapat tidak ada dari file sumber dalam hierarki sumber Android dan ditulis oleh assemble_vintf pada waktu build. Tag yang diperlukan harus ada dalam file yang sesuai di perangkat.

?xml
Opsional. Hanya memberikan informasi ke parser XML.
manifest.version
Wajib diisi. Meta-versi manifes ini. Menjelaskan elemen yang diharapkan dalam manifes. Tidak terkait dengan versi XML.
manifest.type
Wajib diisi. Jenis manifes ini. File ini memiliki nilai device untuk file manifes perangkat dan framework untuk file manifes framework.
manifest.target-level
Wajib untuk manifes perangkat. Menentukan versi matriks kompatibilitas (FCM) framework yang ditargetkan untuk kompatibel dengan manifes perangkat ini. Versi ini juga disebut versi FCM pengiriman perangkat.
manifest.hal
Opsional, dapat diulang. Satu HAL (HIDL atau native, seperti GL), bergantung pada atribut format.
manifest.hal.format
Opsional. Nilainya dapat berupa salah satu dari:
  • hidl: HIDL HAL. Ini adalah defaultnya.
  • aidl: HAL AIDL. Hanya valid pada meta-versi manifes 2.0 dan yang lebih baru.
  • native: HAL native.
manifest.hal.max-level
Opsional. Hanya valid pada manifes framework. Jika ditetapkan, HAL dengan level maksimum yang lebih rendah dari Versi FCM Target dalam manifes framework akan dinonaktifkan.
manifest.hal.override
Opsional. Nilainya dapat berupa salah satu dari:
  • true: Ganti elemen <hal> lainnya dengan <name> dan versi utama yang sama. Jika tidak ada <version> atau <fqname> dalam elemen <hal> ini, elemen <hal> akan mendeklarasikan HAL ini untuk dinonaktifkan.
  • false: Jangan ganti elemen <hal> lain dengan <name> dan versi utama yang sama.
manifest.hal.name
Wajib diisi. Nama paket yang sepenuhnya memenuhi syarat dari HAL. Beberapa entri HAL dapat menggunakan nama yang sama. Contoh:
  • android.hardware.camera (HIDL atau AIDL HAL)
  • GLES (HAL native, hanya memerlukan nama)
manifest.hal.transport
Wajib ada saat manifest.hal.format == "hidl". Jika tidak, tidak boleh ada. Menentukan transpor yang digunakan saat antarmuka dari paket ini dikueri dari pengelola layanan. Nilainya dapat berupa salah satu dari:
  • hwbinder: Mode binderized
  • passthrough: Mode passthrough
Opsional jika manifest.hal.format == "aidl". Jika tidak, tidak boleh ada. Menentukan transpor yang digunakan saat antarmuka ditayangkan secara jarak jauh. Nilainya harus:
  • inet: Soket inet
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 layanan passthrough yang disediakan. Nilainya dapat 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 ditayangkan.
manifest.hal.transport.port
Wajib untuk inet dan TIDAK boleh ada jika tidak. Menjelaskan port tempat antarmuka jarak jauh ditayangkan.
manifest.hal.version
Opsional, dapat diulang. Versi untuk tag hal dalam manifes.

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

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

Untuk HAL AIDL, <version> tidak boleh ada di 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. Maksimal harus ada satu <version> untuk setiap tuple (package, interface, instance). Jika tidak ada, setelan defaultnya adalah 1. Nilai <version> dikaitkan dengan semua <fqname> dalam <hal> yang sama karena <fqname> tidak memiliki versi.
manifest.hal.interface
Wajib, dapat diulang tanpa duplikat. Nyatakan antarmuka dalam paket yang memiliki nama instance. Dapat ada beberapa elemen <interface> dalam <hal>; nama harus berbeda.
manifest.hal.interface.name
Wajib diisi. Nama antarmuka.
manifest.hal.interface.instance
Wajib, dapat diulang. Nama instance antarmuka. Dapat memiliki beberapa instance untuk antarmuka, tetapi tidak ada elemen <instance> duplikat.
manifest.hal.fqname
Opsional, dapat diulang. Cara alternatif untuk menentukan instance untuk HAL dengan nama manifest.hal.name.
  • Untuk HAL HIDL, formatnya adalah @MAJOR.MINOR::INTERFACE/INSTANCE.
  • Untuk HAL AIDL, formatnya adalah INTERFACE/INSTANCE.
manifest.sepolicy
Wajib diisi. Berisi semua entri terkait sepolicy.
manifest.sepolicy.version
Wajib untuk manifes perangkat. Mendeklarasikan versi SELinux. File ini memiliki format SDK_INT.PLAT_INT.
manifest.vendor-ndk
Wajib, dapat diulang; 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 mewakili versi snapshot VNDK.
manifest.vendor-ndk.library
Opsional, dapat diulang, tanpa duplikat. Menjelaskan kumpulan library VNDK yang disediakan oleh framework untuk snapshot vendor VNDK ini. Nilainya adalah nama file library, 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 manifes framework. Menjelaskan serangkaian 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 kernel. Nilainya ditetapkan secara default ke manifest.target-level jika tidak ada. Harus lebih besar dari atau sama dengan manifest.target-level. Lihat aturan pencocokan kernel untuk mengetahui detailnya.