Manifestler

Bir VINTF nesnesi , aygıt bildiriminden ve çerçeve bildirim dosyalarından (XML) verileri toplar. Her iki bildirim de aynı formatı paylaşıyor ancak tüm öğeler her ikisine de uygulanmıyor (şemayla ilgili ayrıntılar için bkz . Bildirim dosyası şeması ).

Cihaz bildirimi

Cihaz bildirimi (cihaz tarafından sağlanır), satıcı bildiriminden ve ODM bildiriminden oluşur.

  • Satıcı bildirimi, bir SoC için ortak olan HAL'leri, SELinux ilkesi 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 bkz . Parçaları bildirme ve Parçalardan DM oluşturma .
  • ODM bildirimi, ODM bölümündeki ürüne özel HAL'leri listeler. VINTF nesnesi ODM bildirimini şu sırayla yükler:
    1. SKU tanımlanmışsa (burada 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ımlanmışsa, /odm/etc/manifest_ SKU .xml
    4. /odm/etc/manifest.xml
  • Satıcı manifestosu, satıcı bölümündeki ürüne özel HAL'leri listeler. VINTF nesnesi satıcı bildirimini şu sırayla yükler:
    1. SKU tanımlanmışsa (burada 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 bildirimini şu sırayla yükler:
    1. Satıcı manifestosu mevcutsa aşağıdakileri birleştirin:
      1. Satıcı manifestosu
      2. İsteğe bağlı satıcı bildirimi parçaları
      3. İsteğe bağlı ODM bildirimi
      4. İsteğe bağlı ODM bildirim parçaları
    2. Aksi takdirde, ODM bildirimi mevcutsa, ODM bildirimini isteğe bağlı ODM bildirimi parçalarıyla birleştirin.
    3. /vendor/manifest.xml (eski, parça yok)

    Dikkat:

    • Eski cihazlarda eski satıcı bildirimi ve ODM bildirimi kullanılır. ODM bildirimi, eski satıcı bildirimini tamamen geçersiz kılabilir.
    • Android 9 ile başlatılan cihazlarda ODM bildirimi, satıcı bildirimi ile birleştirilir.
    • Bir manifest listesi birleştirildiğinde, listede daha sonra görünen manifestler, daha sonraki manifestteki etiketlerin override="true" özniteliğine sahip olması koşuluyla, listede daha önce görünen manifestlerdeki etiketleri geçersiz kılabilir. Örneğin, ODM bildirimi satıcı bildirimindeki bazı <hal> etiketlerini geçersiz kılabilir. Öznitelik override için aşağıdaki belgelere bakın.

Bu kurulum, aynı karta sahip birden fazla ürünün aynı satıcı görüntüsünü (ortak HAL'ler sağlayan) paylaşmasına, ancak farklı ODM görüntülerine (ürüne özel HAL'leri belirten) sahip olmasına olanak tanır.

Aşağıda örnek bir satıcı manifestosu yer almaktadır.

<?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>

Örnek bir ODM bildirimini burada bulabilirsiniz.

<?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>

İşte OTA paketindeki örnek bir cihaz bildirimi.

<?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 ayrıntı için bkz. Cihaz Bildirimi Geliştirme .

Çerçeve bildirimi

Çerçeve bildirim dosyası, sistem bildirimi, ürün bildirimi ve system_ext bildiriminden oluşur.

  • Sistem bildirimi (Google tarafından sağlanır) manuel olarak oluşturulur ve /system/libhidl/manifest.xml adresindeki Android kaynak ağacında bulunur.
  • Ürün bildirimi (aygıt tarafından sağlanır), ürün bölümünde kurulu modüller tarafından hizmet verilen HAL'leri listeler.
  • System_ext bildirimi (cihaz tarafından sağlanır) aşağıdakileri listeler:
    • system_ext bölümüne kurulu modüller tarafından hizmet verilen HAL'ler;
    • VNDK versiyonları;
    • Sistem SDK'sı sürümü.

Cihaz bildirimine benzer şekilde birden fazla parça dosyası kullanılabilir. Ayrıntılar için bkz. Bildirim parçaları .

İşte örnek bir çerçeve bildirimi.

<?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>

Bildiri parçaları

Android 10 ve üzeri sürümlerde, bir bildirim girişini yapı sistemindeki bir HAL modülüyle ilişkilendirebilirsiniz. Bu, HAL modülünün yapı sistemine koşullu olarak dahil edilmesini kolaylaştırır.

Örnek

Android.bp veya Android.mk dosyanızda herhangi bir modüle vintf_fragments ekleyin. Örneğin, HAL uygulamanızla ( my.package.foo@1.0-service-bar ) modülü değiştirebilirsiniz.

... {
    ...
    vintf_fragments: ["manifest_foo.xml"],
    ...
}
LOCAL_MODULE := ...
LOCAL_VINTF_FRAGMENTS := manifest_foo.xml

manifest_foo.xml adlı dosyada bu modülün bildirimini oluşturun. Oluşturma sırasında bu bildirim cihaza eklenir. Buraya bir giriş eklemek, cihazın ana bildirimine bir giriş eklemekle aynıdır. Bu, istemcilerin arayüzü kullanmasına olanak tanır ve VTS'nin cihazda hangi HAL uygulamalarının bulunduğunu belirlemesine olanak tanır. Normal bir bildirimin yaptığı her şeyi bu bildirim de yapar.

Aşağıdaki örnek, vendor veya odm bölümüne yüklenen android.hardware.foo@1.0::IFoo/default uygular. system , product veya system_ext bölümüne yüklüyse, 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>

Bildirim dosyası şeması

Bu bölümde bu XML etiketlerinin anlamı açıklanmaktadır. Android kaynak ağacındaki kaynak dosyada bazı "gerekli" etiketler eksik olabilir ve derleme sırasında assemble_vintf tarafından yazılabilir. Cihazdaki ilgili dosyalarda gerekli etiketlerin bulunması gerekir.

?xml
İsteğe bağlı. Yalnızca XML ayrıştırıcısına bilgi sağlar.
manifest.version
Gerekli. Bu bildirimin meta sürümü. Manifestte beklenen unsurları açıklar. XML sürümüyle ilgisi yok.
manifest.type
Gerekli. Bu bildirimin türü. Cihaz bildirim dosyası için değer device ve çerçeve bildirim dosyası için framework sahiptir.
manifest.target-level
Cihaz bildirimi için gereklidir. Bu cihaz bildiriminin uyumlu olmasının hedeflendiği çerçeve uyumluluk matrisi (FCM) sürümünü belirtir. Buna aynı zamanda cihazın nakliye 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 aşağıdakilerden biri olabilir:
  • hidl : HIDL HAL'ler. Bu varsayılandır.
  • aidl : AIDL HAL'ler . Yalnızca manifest meta sürümü 2.0 ve üzeri sürümlerde geçerlidir.
  • native : Yerel HAL'ler.
manifest.hal.max-level
İsteğe bağlı. Yalnızca çerçeve bildirimlerinde geçerlidir. Ayarlanırsa, maksimum düzeyi çerçeve bildirimindeki Hedef FCM Sürümünden daha düşük olan HAL'ler devre dışı bırakılır.
manifest.hal.override
İsteğe bağlı. Değer aşağıdakilerden 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'ın devre dışı bırakıldığını bildirir.
  • false : Aynı <name> ve ana sürüme sahip diğer <hal> öğelerini geçersiz kılmayın.
manifest.hal.name
Gerekli. 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 isim gerektirir)
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 aşağıdakilerden biri olabilir:
  • hwbinder : Bağlayıcı 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 şöyle olmalıdır:
  • inet : İnternet soketi
Inet bağlantı bilgilerini daha ayrıntılı olarak 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 aşağıdakilerden biri olabilir:
  • 32 : 32 bit modu
  • 64 : 64 bit modu
  • 32+64 : İkisi 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. Manifestteki hal etiketlerinin bir versiyonu.

HIDL ve yerel HAL'ler için format MAJOR . MINOR . Örnekler için hardware/interfaces , vendor/${VENDOR}/interfaces , frameworks/hardware/interfaces veya system/hardware/interfaces bakın.

HIDL ve yerel HAL'ler, farklı ana sürümleri temsil ettikleri sürece birden fazla sürüm alanı kullanabilir ve ana sürüm başına yalnızca bir alt sürüm sağlanır. Örneğin 3.1 ve 3.2 bir arada bulunamaz ama 1.0 ve 3.4 bir arada bulunabilir. Bu, override="true" olmadığı sürece aynı ada sahip tüm hal öğeleri için geçerlidir. <version> değerleri <fqname> ile ilişkili değildir çünkü <fqname> bir sürüm taşır.

AIDL HAL'ler için, Android 11 ve önceki sürümleri çalıştıran cihazlarda <version> bulunmamalıdır. <version> Android 12 ve sonraki sürümleri çalıştıran cihazlarda tek bir tam sayı olmalıdır. Her (package, interface, instance) tuple için en fazla bir <version> bulunmalıdır. Mevcut değilse, varsayılan olarak 1 ayarlayın. <version> değeri aynı <hal> içindeki tüm <fqname> ile ilişkilendirilir çünkü <fqname> bir sürüm taşımaz.
manifest.hal.interface
Gereklidir, kopyalar olmadan tekrarlanabilir. Pakette örnek adı olan bir arayüz belirtin. Bir <hal> içinde birden fazla <interface> öğesi olabilir; İsimler farklı olmalıdır.
manifest.hal.interface.name
Gerekli. Arayüzün adı.
manifest.hal.interface.instance
Gerekli, tekrarlanabilir. Arayüzün örnek adı. Bir arayüz için birden fazla örneğe sahip olabilir ancak yinelenen <instance> öğeleri olamaz.
manifest.hal.fqname
İsteğe bağlı, tekrarlanabilir. HAL için manifest.hal.name adıyla bir örnek belirtmenin alternatif bir yolu.
  • HIDL HAL'ler için format @ MAJOR . MINOR :: INTERFACE / INSTANCE .
  • AIDL HAL'ler için format INTERFACE / INSTANCE şeklindedir.
manifest.sepolicy
Gerekli. Sepolicy ile ilgili tüm girişleri içerir.
manifest.sepolicy.version
Cihaz bildirimi için gereklidir. SELinux sürümünü bildirir. SDK_INT . PLAT_INT .
manifest.vendor-ndk
Gereklidir, tekrarlanabilir; çerçeve manifestosu için gereklidir. Cihaz bildiriminde bulunmamalıdır. Birden fazla <vendor-ndk> girişi farklı <version> s'ye sahip 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
Gerekli. Bu, VNDK anlık görüntüsünün sürümünü temsil eden pozitif bir tamsayıdır.
manifest.vendor-ndk.library
İsteğe bağlı, kopyalar olmadan tekrarlanabilir. Bu VNDK satıcı anlık görüntüsü için çerçeve tarafından sağlanan bir dizi VNDK kitaplığını açıklar. Değer, lib ön eki ve .so sonekini içeren bir kitaplığın dosya adıdır; örneğin libjpeg.so . Hiçbir yol bileşenine izin verilmez.
manifest.system-sdk.version
İsteğe bağlı, kopyalar olmadan tekrarlanabilir; yalnızca çerçeve bildirimi tarafından kullanılır. Çerçeve tarafından satıcı uygulamalarına sağlanan bir dizi sistem SDK sürümünü açıklar.
manifest.kernel
İsteğe bağlı. Çekirdek hakkındaki statik bilgileri açıklar.
manifest.kernel.target-level
İsteğe bağlı. Çekirdek dalını açıklar. Eğer mevcut değilse değeri varsayılan olarak manifest.target-level olur. manifest.target-level değerinden büyük veya ona eşit olmalıdır. Ayrıntılar için çekirdek eşleşme kurallarına bakın.