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:
- Jika
SKU
ditentukan (denganSKU
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 (denganSKU
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 hal berikut:
- Manifes vendor
- Fragmen manifes vendor opsional
- Manifes ODM opsional
- Fragmen manifes ODM opsional
- Atau, jika manifes ODM ada, gabungkan manifes ODM dengan fragmen manifes ODM opsional.
/vendor/manifest.xml
(lama, tanpa fragmen)- 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 atributoverride
di bawah.
- Jika manifes vendor ada, gabungkan hal berikut:
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 danframework
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 binderizedpassthrough
: 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
danmanifest.hal.transport.port
harus digunakan untuk menentukan informasi koneksi Inet lebih lanjut. manifest.hal.transport.arch
- Wajib untuk
passthrough
dan tidak boleh ada untukhwbinder
. Menjelaskan bit layanan passthrough yang disediakan. Nilainya dapat berupa salah satu dari:32
: Mode 32-bit64
: Mode 64-bit32+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 adalahMAJOR.MINOR
. Untuk contoh, lihathardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
, atausystem/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 elemenhal
dengan nama yang sama, kecualioverride="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 adalah1
. 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
.
- Untuk HAL HIDL, formatnya adalah
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 awalanlib
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 denganmanifest.target-level
. Lihat aturan pencocokan kernel untuk mengetahui detailnya.