Objek VINTF mengumpulkan data dari manifes perangkat dan file manifes kerangka kerja (XML). Kedua manifes berbagi format, 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 detailnya, lihat Manifes fragmen dan Hasilkan DM dari fragmen . - Manifes ODM mencantumkan HAL khusus untuk produk di partisi ODM . Objek VINTF memuat manifes ODM dalam urutan ini:
- Jika
SKU
ditentukan (di manaSKU
adalah nilai propertiro.boot.product.hardware.sku
),/odm/etc/vintf/manifest_ SKU .xml
-
/odm/etc/vintf/manifest.xml
- Jika
SKU
ditentukan,/odm/etc/manifest_ SKU .xml
-
/odm/etc/manifest.xml
- Jika
- Manifes vendor mencantumkan HAL khusus untuk produk di partisi vendor. Objek VINTF memuat manifes vendor dalam urutan ini:
- Jika
SKU
ditentukan (di manaSKU
adalah nilai propertiro.boot.product.vendor.sku
),/vendor/etc/vintf/manifest_ SKU .xml
-
/vendor/etc/vintf/manifest.xml
- Jika
- Objek VINTF memuat manifes perangkat dalam urutan ini:
- Jika manifes vendor ada, gabungkan yang berikut ini:
- Manifes vendor
- Fragmen manifes vendor opsional
- Manifes ODM opsional
- Fragmen manifes ODM opsional
- Jika tidak, jika manifes ODM ada, gabungkan manifes ODM dengan fragmen manifes ODM opsional.
-
/vendor/manifest.xml
(warisan, tanpa fragmen)
Perhatikan bahwa:
- Pada perangkat lawas, manifes vendor lawas 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 kemudian dalam daftar dapat menggantikan tag dalam manifes yang muncul sebelumnya dalam daftar, asalkan tag di manifes selanjutnya memiliki atribut
override="true"
. Misalnya, manifes ODM dapat menimpa beberapa<hal>
dari manifes vendor. Lihat dokumentasi untukoverride
atribut di bawah.
- Jika manifes vendor ada, gabungkan yang berikut 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 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 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 adalah contoh kerangka manifes.
<?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. Ini membuatnya lebih mudah untuk menyertakan modul HAL secara kondisional dalam sistem build.
Contoh
Di file Android.bp
atau Android.mk
Anda, 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
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 manifes reguler, 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 partisi system
, product
, atau system_ext
, gunakan type framework
alih-alih 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>
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
- Opsional. Hanya memberikan informasi ke parser 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 danframework
untuk file manifes kerangka kerja. -
manifest.target-level
- Diperlukan untuk manifes perangkat. Menentukan versi matriks kompatibilitas kerangka kerja (FCM) yang ditargetkan agar manifes perangkat ini kompatibel. Ini juga disebut versi FCM pengiriman perangkat.
-
manifest.hal
- Opsional, dapat diulang. HAL tunggal (HIDL atau native, seperti GL), bergantung pada atribut
format
. -
manifest.hal.format
- Opsional. Nilai dapat berupa salah satu dari:
-
hidl
: HIDL HAL. Ini adalah default. -
aidl
: AIDL HAL . Hanya valid pada manifes meta-versi 2.0 dan di atasnya. -
native
: HAL asli.
-
-
manifest.hal.max-level
- Opsional. Hanya berlaku pada manifes kerangka kerja. Jika disetel, HAL dengan level maks lebih rendah dari Target FCM Version dalam manifes framework akan dinonaktifkan.
-
manifest.hal.override
- Opsional. Nilai 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 timpa elemen<hal>
lainnya dengan<name>
dan versi utama yang sama.
-
-
manifest.hal.name
- Yg dibutuhkan. 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 membutuhkan nama)
-
-
manifest.hal.transport
- Diperlukan saat
manifest.hal.format == "hidl"
. TIDAK harus hadir sebaliknya. Menyatakan transport apa yang digunakan ketika antarmuka dari paket ini ditanyakan dari manajer layanan. Nilai dapat berupa salah satu dari:-
hwbinder
: Mode pengikat -
passthrough
: mode Passthrough
-
- Opsional ketika
manifest.hal.format == "aidl"
. TIDAK harus hadir sebaliknya. Menyatakan transportasi apa yang digunakan ketika antarmuka dilayani dari jarak jauh. Nilainya harus:-
inet
: soket Inet
manifest.hal.transport.ip
danmanifest.hal.transport.port
harus digunakan untuk menentukan lebih lanjut informasi koneksi Inet. -
-
manifest.hal.transport.arch
- Diperlukan untuk
passthrough
dan tidak boleh ada untukhwbinder
. Menjelaskan bitness dari layanan passthrough yang disediakan. Nilai dapat berupa salah satu dari:-
32
: mode 32-bit -
64
: mode 64-bit -
32+64
: Keduanya
-
-
manifest.hal.transport.ip
- Diperlukan untuk
inet
dan TIDAK harus ada sebaliknya. Menjelaskan alamat IP dari mana antarmuka jarak jauh dilayani. -
manifest.hal.transport.port
- Diperlukan untuk
inet
dan TIDAK harus ada sebaliknya. Menjelaskan port dari mana antarmuka jarak jauh sedang dilayani. -
manifest.hal.version
- Opsional, dapat diulang. Versi untuk tag
hal
dalam manifes.
Untuk HIDL dan HAL asli, formatnya adalahMAJOR . MINOR
. Sebagai contoh, lihathardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
, atausystem/hardware/interfaces
.
HIDL dan HAL asli dapat menggunakan beberapa bidang versi selama mereka mewakili versi utama yang berbeda , dengan hanya satu versi minor per versi utama yang disediakan. Misalnya, 3.1 dan 3.2 tidak bisa hidup berdampingan, tapi 1.0 dan 3.4 bisa. Ini berlaku untuk semua elemenhal
dengan nama yang sama, kecualioverride="true"
. Nilai<version>
tidak terkait dengan<fqname>
karena<fqname>
membawa 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 yang lebih baru. Harus ada paling banyak satu<version>
untuk setiap tuple(package, interface, instance)
. Jika tidak ada, default ke1
. Nilai<version>
dikaitkan dengan semua<fqname>
di<hal>
yang sama karena<fqname>
tidak membawa versi. -
manifest.hal.interface
- Wajib, dapat diulang tanpa duplikat. Nyatakan antarmuka dalam paket yang memiliki nama instance. Mungkin 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 instance antarmuka. Dapat memiliki beberapa instance untuk sebuah antarmuka tetapi tidak ada elemen
<instance>
yang diduplikasi. -
manifest.hal.fqname
- Opsional, dapat diulang. Cara alternatif untuk menentukan instance untuk HAL dengan nama
manifest.hal.name
.- Untuk HIDL HAL, formatnya adalah @MAJOR
@ MAJOR . MINOR :: INTERFACE / INSTANCE
. - Untuk AIDL HAL, formatnya adalah
INTERFACE / INSTANCE
.
- Untuk HIDL HAL, formatnya adalah @MAJOR
-
manifest.sepolicy
- Yg dibutuhkan. Berisi semua entri terkait kebijakan.
-
manifest.sepolicy.version
- Diperlukan untuk manifes perangkat. Mendeklarasikan versi SELinux. Ini memiliki format
SDK_INT . PLAT_INT
. -
manifest.vendor-ndk
- Wajib, dapat mengulang; diperlukan untuk manifes kerangka kerja. Tidak boleh ada dalam manifes perangkat. Beberapa entri
<vendor-ndk>
harus memiliki<version>
yang 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, dapat diulang, tanpa duplikat. Menjelaskan kumpulan pustaka VNDK yang disediakan oleh kerangka kerja untuk snapshot vendor VNDK ini. Nilainya adalah nama file perpustakaan, misalnya
libjpeg.so
, termasuk awalanlib
dan akhiran.so
. Tidak ada komponen jalur yang diizinkan. -
manifest.system-sdk.version
- Opsional, dapat diulang, 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. Nilainya default ke
manifest.target-level
jika tidak ada. Harus lebih besar dari atau sama denganmanifest.target-level
. Lihat aturan pencocokan kernel untuk detailnya.