VINTF nesnesi, cihaz manifesti ve çerçeve manifesti dosyalarındaki (XML) verileri toplar. Her iki manifest de aynı biçimi paylaşır ancak tüm öğeler her ikisi için de geçerli değildir (şema hakkında ayrıntılı bilgi için Manifest dosyası şeması bölümüne bakın).
Cihaz manifesti
Cihaz manifesti (cihaz tarafından sağlanır), tedarikçi manifestinden ve ODM manifestinden oluşur.
- Tedarikçi manifesti, bir SoC'ye ortak olan HAL'leri, SELinux politika sürümlerini vb. belirtir.
device/VENDOR/DEVICE/manifest.xml
adresindeki Android kaynak ağacına yerleştirilmesi önerilir ancak birden fazla parça dosyası kullanılabilir. Ayrıntılar için Manifest parçaları ve Parçalardan DM oluşturma başlıklı makaleleri inceleyin. - ODM manifesti, ODM bölümünde ürüne özel HAL'leri listeler.
VINTF nesnesi, ODM manifestini şu sırayla yükler:
SKU
tanımlıysa (SKU
,ro.boot.product.hardware.sku
özelliğinin değeridir)/odm/etc/vintf/manifest_SKU.xml
/odm/etc/vintf/manifest.xml
SKU
tanımlıysa/odm/etc/manifest_SKU.xml
/odm/etc/manifest.xml
- Tedarikçi firma manifesti, tedarikçi firma bölümünde ürüne özel HAL'leri listeler.
VINTF nesnesi, tedarikçi manifestini şu sırayla yükler:
SKU
tanımlıysa (SKU
,ro.boot.product.vendor.sku
özelliğinin değeridir)/vendor/etc/vintf/manifest_SKU.xml
/vendor/etc/vintf/manifest.xml
- VINTF nesnesi, cihaz manifest'ini şu sırayla yükler:
- Satıcı manifesti varsa aşağıdakileri birleştirin:
- Tedarikçi firma manifesti
- İsteğe bağlı tedarikçi firma manifesti parçaları
- İsteğe bağlı ODM manifesti
- İsteğe bağlı ODM manifest parçaları
- Aksi takdirde, ODM manifesti varsa ODM manifestini isteğe bağlı ODM manifesti parçalarıyla birleştirin.
/vendor/manifest.xml
(eski, parça yok)- Son olarak, herhangi bir tedarikçi APEX'indeki manifest parçalarını birleştirin. Manifest parçaları, her APEX'in
etc/vintf
dizininden (ör./apex/<apex name>/etc/vintf
) yüklenir.
Şunu unutmayın:
- Eski cihazlarda eski tedarikçi manifesti ve ODM manifesti kullanılır. ODM manifesti, eski tedarikçi manifestini tamamen geçersiz kılabilir.
- Android 9 ile kullanıma sunulan cihazlarda ODM manifesti, satıcı manifestiyle birleştirilir.
- Bir manifest listesinin birleştirilmesinde, listede daha sonra görünen manifest'ler, listede daha önce görünen manifest'lerdeki etiketleri geçersiz kılabilir. Bunun için, daha sonraki manifest'teki etiketlerin
override="true"
özelliğine sahip olması gerekir. Örneğin, ODM manifesti, tedarikçi manifestindeki bazı<hal>
etiketlerini geçersiz kılabilir.override
özelliğiyle ilgili dokümanları aşağıda bulabilirsiniz.
- Satıcı manifesti varsa aşağıdakileri birleştirin:
Bu kurulum, aynı kartta birden fazla ürünün aynı tedarikçi firma resmini (ortak HAL'leri sağlayan) paylaşmasına ancak farklı ODM resimlerine (ürüne özel HAL'leri belirten) sahip olmasına olanak tanır.
Aşağıda bir tedarikçi manifesti örneği verilmiştir.
<?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>
Aşağıda bir örnek ODM manifesti verilmiştir.
<?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>
Aşağıda, OTA paketindeki örnek bir cihaz manifesti verilmiştir.
<?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>
Daha fazla bilgi için Cihaz manifesti geliştirme başlıklı makaleyi inceleyin.
Framework manifesti
Çerçeve manifest dosyası, sistem manifesti, ürün manifesti ve system_ext manifestinden oluşur.
-
Sistem manifesti (Google tarafından sağlanır) manuel olarak oluşturulur ve
/system/libhidl/manifest.xml
adresindeki Android kaynak ağacında bulunur. - Ürün manifesti (cihaz tarafından sağlanır), ürün bölümüne yüklenen modüller tarafından sunulan HAL'leri listeler.
-
system_ext manifesti (cihaz tarafından sağlanır) aşağıdakileri listeler:
- system_ext bölümüne yüklenen modüller tarafından sunulan HAL'ler;
- VNDK sürümleri;
- Sistem SDK sürümü.
Cihaz manifest'ine benzer şekilde birden fazla parça dosyası kullanılabilir. Ayrıntılı bilgi için Manifest parçaları bölümüne bakın.
Aşağıda bir örnek çerçeve manifesti verilmiştir.
<?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>
Manifest parçaları
Android 10 ve sonraki sürümlerde, bir manifest girişini derleme sistemindeki bir HAL modülüyle ilişkilendirebilirsiniz. Bu sayede, HAL modülünü koşullu olarak derleme sistemine dahil etmek daha kolaydır.
Örnek
Android.bp
veya Android.mk
dosyanızda, cc_binary
veya rust_binary
gibi cihaza açıkça yüklenen tüm modüllere vintf_fragments
ekleyin.
Örneğin, HAL (my.package.foo@1.0-service-bar
) uygulamanızla modülü değiştirebilirsiniz.
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
manifest_foo.xml
adlı bir dosyada bu modülün manifest dosyasını oluşturun. Bu manifest, derleme sırasında cihaza eklenir. Buraya giriş eklemek, cihazın ana manifest dosyasına giriş eklemekle aynıdır.
Bu sayede istemciler arayüzü kullanabilir ve VTS, cihazda hangi HAL uygulamalarının bulunduğunu belirleyebilir. Bu manifest, normal bir manifestin yaptığı her şeyi yapar.
Aşağıdaki örnekte, vendor
veya odm
bölümüne yüklenen android.hardware.foo@1.0::IFoo/default
uygulanmaktadır. system
, product
veya system_ext
bölümüne yüklendiyse device
türü yerine framework
türünü kullanın.
<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>
Bir HAL modülü tedarikçi APEX'te paketlenmişse ilişkili VINTF parçalarını VINTF parçaları bölümünde açıklandığı gibi prebuilt_etc
ile aynı APEX'te paketleyin.
Manifest dosyası şeması
Bu bölümde, bu XML etiketlerinin anlamı açıklanmaktadır. Bazı "zorunlu" etiketler, Android kaynak ağacındaki kaynak dosyada eksik olabilir ve derleme sırasında assemble_vintf
tarafından yazılabilir. Zorunlu etiketler, cihazdaki ilgili dosyalarda bulunmalıdır.
?xml
- İsteğe bağlı. Yalnızca XML ayrıştırıcısına bilgi sağlar.
manifest.version
- Zorunlu. Bu manifestin meta sürümü. Manifestte beklenen öğeleri açıklar. XML sürümüyle alakasız.
manifest.type
- Zorunlu. Bu manifestin türü. Cihaz manifest dosyası için
device
, çerçeve manifest dosyası içinframework
değerine sahiptir. manifest.target-level
- Cihaz manifesti için gereklidir. Bu cihaz manifestinin uyumlu olması hedeflenen çerçeve uyumluluk matrisi (FCM) sürümünü belirtir. Buna cihazın gönderim amaçlı FCM sürümü de denir.
manifest.hal
- İsteğe bağlı, tekrarlanabilir.
format
özelliğine bağlı olarak tek bir HAL (HIDL veya GL gibi yerel) manifest.hal.format
- İsteğe bağlı. Değer şunlardan biri olabilir:
hidl
: HIDL HAL'leri. Bu, varsayılan seçenektir.aidl
: AIDL HAL'ler. Yalnızca manifest meta sürümü 2.0 ve sonraki sürümlerde geçerlidir.native
: Yerel HAL'ler.
manifest.hal.max-level
- İsteğe bağlı. Yalnızca çerçeve manifestlerinde geçerlidir. Ayarlanırsa, çerçeve manifestindeki hedef FCM sürümünden daha düşük bir maksimum düzeye sahip HAL'ler devre dışı bırakılır.
manifest.hal.override
- İsteğe bağlı. Değer şunlardan biri olabilir:
true
: Aynı<name>
ve ana sürüme sahip diğer<hal>
öğelerini geçersiz kılın. Bu<hal>
öğesinde<version>
veya<fqname>
yoksa<hal>
öğesi bu HAL'in devre dışı olduğunu belirtir.false
: Aynı<name>
ve ana sürüme sahip diğer<hal>
öğelerini geçersiz kılmayın.
manifest.hal.name
- Zorunlu. HAL'in tam nitelikli paket adı. Birden fazla HAL girişi aynı adı kullanabilir. Örnekler:
android.hardware.camera
(HIDL veya AIDL HAL)GLES
(yerel HAL, yalnızca ad gerekir)
manifest.hal.transport
manifest.hal.format == "hidl"
olduğunda gereklidir. Aksi takdirde mevcut OLMAMALIDIR. Bu paketteki bir arayüz hizmet yöneticisinden sorgulandığında hangi aktarımın kullanıldığını belirtir. Değer şunlardan biri olabilir:hwbinder
: Ciltlenmiş modpassthrough
: Geçiş modu
manifest.hal.format == "aidl"
olduğunda isteğe bağlıdır. Aksi takdirde mevcut OLMAMALIDIR. Bir arayüz uzaktan sunulduğunda hangi aktarımın kullanıldığını belirtir. Değer şu şekilde olmalıdır:inet
: Inet socket
manifest.hal.transport.ip
vemanifest.hal.transport.port
kullanılmalıdır.manifest.hal.transport.arch
passthrough
için gereklidir vehwbinder
için mevcut olmamalıdır. Sağlanan geçiş hizmetinin bitliğini açıklar. Değer şunlardan biri olabilir:32
: 32 bit modu64
: 64 bit modu32+64
: Her ikisi de
manifest.hal.transport.ip
inet
için gereklidir ve aksi takdirde mevcut OLMAMALIDIR. Uzak arayüzün sunulduğu IP adresini açıklar.manifest.hal.transport.port
inet
için gereklidir ve aksi takdirde mevcut OLMAMALIDIR. Uzak arayüzün sunulduğu bağlantı noktasını açıklar.manifest.hal.version
- İsteğe bağlı, tekrarlanabilir. Bir manifest'teki
hal
etiketleri için bir sürüm.
HIDL ve yerel HAL'ler için biçimMAJOR.MINOR
'dur. Örnekler içinhardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
veyasystem/hardware/interfaces
'e bakın.
HIDL ve yerel HAL'ler, farklı büyük sürümleri temsil ettikleri sürece birden fazla sürüm alanı kullanabilir. Her büyük sürüm için yalnızca bir küçük sürüm sağlanır. Örneğin, 3.1 ve 3.2 birlikte kullanılamaz ancak 1.0 ve 3.4 birlikte kullanılabilir. Bu,override="true"
olmadığı sürece aynı ada sahip tümhal
öğeleri için geçerlidir.<fqname>
bir sürüm taşıdığı için<version>
değerleri<fqname>
ile ilişkili değildir.
AIDL HAL'ler için<version>
, Android 11 ve önceki sürümleri çalıştıran cihazlarda bulunmamalıdır.<version>
, Android 12 ve sonraki sürümlerin yüklü olduğu cihazlarda tek bir tam sayı olmalıdır. Her(package, interface, instance)
tuple'ı için en fazla bir<version>
olmalıdır. Bu parametre yoksa varsayılan olarak1
olur.<fqname>
bir sürüm taşımadığından<version>
değeri, aynı<hal>
içindeki tüm<fqname>
ile ilişkilendirilir. manifest.hal.interface
- Zorunlu, yinelenen olmadan tekrarlanabilir. Pakette, örnek adı içeren bir arayüz belirtin. Bir
<hal>
içinde birden fazla<interface>
öğesi bulunabilir; adlar farklı olmalıdır. manifest.hal.interface.name
- Zorunlu. Arayüzün adı.
manifest.hal.interface.instance
- Zorunlu, tekrarlanabilir. Arayüzün örnek adı. Bir arayüz için birden fazla örnek olabilir ancak yinelenen
<instance>
öğeler olamaz.
manifest.hal.fqname
- İsteğe bağlı, tekrarlanabilir.
manifest.hal.name
adlı HAL örneğini belirtmenin alternatif bir yolu.- HIDL HAL'leri için biçim
@MAJOR.MINOR::INTERFACE/INSTANCE
şeklindedir. - AIDL HAL'ler için biçim
INTERFACE/INSTANCE
şeklindedir.
- HIDL HAL'leri için biçim
manifest.sepolicy
- Zorunlu. sepolicy ile ilgili tüm girişleri içerir.
manifest.sepolicy.version
- Cihaz manifesti için gereklidir. SELinux sürümünü belirtir.
SDK_INT.PLAT_INT
biçimindedir. manifest.vendor-ndk
- Zorunlu, tekrarlanabilir; çerçeve manifesti için gereklidir. Cihaz manifestinde bulunmamalıdır. Birden çok
<vendor-ndk>
girişinin farklı<version>
değerleri olmalıdır. Çerçeve tarafından sağlanan bir dizi VNDK anlık görüntüsünü açıklar. manifest.vendor-ndk.version
- Zorunlu. Bu, VNDK anlık görüntüsünün sürümünü temsil eden pozitif bir tam sayıdır.
manifest.vendor-ndk.library
- İsteğe bağlı, yinelenebilir ancak aynısı tekrarlanamaz. Bu VNDK satıcı anlık görüntüsü için çerçeve tarafından sağlanan bir VNDK kitaplığı grubunu açıklar. Değer, bir kitaplığın dosya adıdır (ör.
libjpeg.so
).lib
ön ekiyle ve.so
son ekiyle birlikte kullanılır. Yol bileşenlerine izin verilmez. manifest.system-sdk.version
- İsteğe bağlı, kopya olmadan tekrarlanabilir; yalnızca çerçeve manifesti tarafından kullanılır. Çerçeve tarafından tedarikçi uygulamalarına sağlanan bir dizi sistem SDK sürümü açıklanır.
manifest.kernel
- İsteğe bağlı. Çekirdekle ilgili statik bilgileri açıklar.
manifest.kernel.target-level
- İsteğe bağlı. Çekirdek dalını açıklar. Bu özellik mevcut değilse varsayılan değeri
manifest.target-level
olur.manifest.target-level
veya daha büyük olmalıdır. Ayrıntılar için çekirdek eşleşme kurallarına bakın.