Manifestler

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:
    1. SKU tanımlıysa (SKU, ro.boot.product.hardware.sku özelliğinin değeridir) /odm/etc/vintf/manifest_SKU.xml
    2. /odm/etc/vintf/manifest.xml
    3. SKU tanımlıysa /odm/etc/manifest_SKU.xml
    4. /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:
    1. SKU tanımlıysa (SKU, ro.boot.product.vendor.sku özelliğinin değeridir) /vendor/etc/vintf/manifest_SKU.xml
    2. /vendor/etc/vintf/manifest.xml
  • VINTF nesnesi, cihaz manifest'ini şu sırayla yükler:
    1. Satıcı manifesti varsa aşağıdakileri birleştirin:
      1. Tedarikçi firma manifesti
      2. İsteğe bağlı tedarikçi firma manifesti parçaları
      3. İsteğe bağlı ODM manifesti
      4. İsteğe bağlı ODM manifest parçaları
    2. Aksi takdirde, ODM manifesti varsa ODM manifestini isteğe bağlı ODM manifesti parçalarıyla birleştirin.
    3. /vendor/manifest.xml (eski, parça yok)
    4. 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.

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çin framework 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ş mod
  • passthrough: 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
Inet bağlantı bilgilerini daha ayrıntılı belirtmek için manifest.hal.transport.ip ve manifest.hal.transport.port kullanılmalıdır.
manifest.hal.transport.arch
passthrough için gereklidir ve hwbinder için mevcut olmamalıdır. Sağlanan geçiş hizmetinin bitliğini açıklar. Değer şunlardan biri olabilir:
  • 32: 32 bit modu
  • 64: 64 bit modu
  • 32+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çim MAJOR.MINOR'dur. Örnekler için hardware/interfaces, vendor/${VENDOR}/interfaces, frameworks/hardware/interfaces veya system/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üm hal öğ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 olarak 1 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.
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.