Manifestler

VINTF nesnesi, cihazdan veri toplar manifest ve çerçeve manifesti dosyaları (XML). Her ikisi manifest'ler belirli bir biçime sahiptir ancak tüm öğeler her ikisi için de geçerli değildir (ayrıntılar için Manifest dosyası şeması bölümüne bakın).

Cihaz manifesti

Cihaz manifesti (cihaz tarafından sağlanır) tedarikçi firma manifestinden oluşur ve ODM manifesti.

  • Tedarikçi firma manifesti, bir SoC'de ortak olan HAL'leri, SELinux politika sürümlerini vb. belirtir. Google Android kaynak ağacına yerleştirilmesi önerilir: device/VENDOR/DEVICE/manifest.xml, ancak birden çok parça dosyalar kullanılabilir. Ayrıntılar için Manifest parçaları bölümüne bakın ve Oluştur Parçalardan gelen DM.
  • ODM manifest'inde, ürüne özel HAL'ler şunlardır: ODM bölümü. VINTF nesnesi, ODM manifestini şu sırayla yükler:
    1. SKU tanımlanırsa (burada SKU, ro.boot.product.hardware.sku mülkü), /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 bölümündeki ürüne özel HAL'leri listeler. VINTF nesnesi, tedarikçi manifestini şu sırayla yükler:
    1. SKU tanımlanırsa (burada SKU, ro.boot.product.vendor.sku mülkü), /vendor/etc/vintf/manifest_SKU.xml
    2. /vendor/etc/vintf/manifest.xml
  • VINTF nesnesi, cihaz manifestini şu sırayla yükler:
    1. Tedarikçi firma manifesti varsa aşağıdakileri birleştirin:
      1. Tedarikçi firma manifesti
      2. İsteğe bağlı tedarikçi firma manifest 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 ile birleştirin. manifest parçalarına bakın.
    3. /vendor/manifest.xml (eski, parça yok)
    4. Son olarak, herhangi bir tedarikçi APEX'in manifest parçalarını birleştirin.

    Unutmayın:

    • Eski cihazlarda eski tedarikçi firma manifesti ve ODM manifesti kullanılır. İlgili içeriği oluşturmak için kullanılan ODM manifesti, eski tedarikçi firma manifestini tamamen geçersiz kılabilir.
    • Android 9 ile kullanıma sunulan cihazlarda ODM manifesti bunu tedarikçi firma manifestinizde kullanabilirsiniz.
    • Manifest listesi birleştirilirken listede daha sonra görünen manifestler geçersiz kılınabilir Listenin başlarında görünen manifest dosyalarında, manifest dosyası override="true" özelliğine sahiptir. Örneğin, ODM manifesti Tedarikçi firma manifestindeki bazı <hal> etiketlerini geçersiz kıl. Şuna ilişkin dokümanlara bakın: override özelliğini aşağıda bulabilirsiniz.

Bu kurulum, aynı panodaki birden fazla ürünün aynı değeri paylaşmasını sağlar. tedarikçi firma görüntüsü (ortak HAL'ler sağlar) ancak farklı ODM görüntülerine (ortak HAL'ler) sahiptir. ürüne özel HAL'leri belirtmeniz gerekir).

Örnek bir tedarikçi firma manifestini burada görebilirsiniz.

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

OTA paketindeki örnek bir cihaz manifestini burada bulabilirsiniz.

<?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 Manifest'e göz atın. Geliştirme.

Çerçeve manifesti

Çerçeve manifest dosyası; sistem manifesti, ürün manifesti ve system_ext manifestini yükleyebilir.

  • Sistem manifesti (Google tarafından sağlanır) manuel olarak oluşturulur ve Android kaynak ağacında bulunmaktadır. /system/libhidl/manifest.xml
  • Ürün manifest'inde (cihaz tarafından sağlanır), ürün bölümü için geçerlidir.
  • system_ext manifestinde (cihaz tarafından sağlanır) aşağıdakiler listelenir:
    • system_ext bölümünde yüklü modüller tarafından sunulan HAL'ler;
    • VNDK sürümleri;
    • Sistem SDK sürümü.

Cihaz manifestine benzer şekilde, birden çok parçalı dosya kullanılabilir. Ayrıntılar için bkz. Manifest parçaları.

Örnek bir çerçeve manifestini aşağıda bulabilirsiniz.

<?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 dosyası ilişkilendirebilirsiniz HAL modülüyle giriş yapma. Böylece projenizin HAL modülünü derleme sistemine koşullu olarak eklemelidir.

Örnek

Android.bp veya Android.mk dosyanıza herhangi bir modüle vintf_fragments. Örneğin, HAL uygulamanızı içeren modül (my.package.foo@1.0-service-bar).

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

manifest_foo.xml adlı dosyada inceleyeceğiz. Bu manifest, derleme sırasında cihaza eklenir. Ekleme buradaki giriş, cihazın ana manifest dosyasına bir giriş eklemekle aynıdır. Bu, istemcilerin arayüzü kullanmasına ve VTS'nin hangi HAL'yi tanımlamasına olanak verir? ne olduğunu öğreneceğiz. Normal manifestteki her şey aynı şekilde çalışıyor.

Aşağıdaki örnekte Şuna yüklenen android.hardware.foo@1.0::IFoo/default: vendor veya odm bölümü. Yüklüyse system, product veya system_ext bölümü, kullanım türü Şunun yerine framework: device yazı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ü bir tedarikçi firma APEX'te paketlenmişse ilişkili VINTF parçalarını aynı APEX içinde prebuilt_etc ile paketleme VINTF parçaları olarak açıklanır.

Manifest dosyası şeması

Bu bölümde, bu XML etiketlerinin anlamı açıklanmaktadır. Bazı "zorunlu" etiketleri Android kaynak ağacındaki kaynak dosyada eksik olabilir ve assemble_vintf. olduğunu unutmayın. Gerekli etiketler, olanak tanır.

?xml
İsteğe bağlı. Yalnızca XML ayrıştırıcıya bilgi sağlar.
manifest.version
Zorunlu. Bu manifestin meta sürümü. Açıklama öğesi olması gerekir. XML sürümüyle ilgili değildir.
manifest.type
Zorunlu. Bu manifestin türü. Şunun için device değerine sahiptir: cihaz manifest dosyası ve çerçeve manifesti için framework dosyası olarak kaydedin.
manifest.target-level
Cihaz manifesti için gereklidir. Çerçeve uyumluluk matrisini belirtir Bu cihaz manifestinin uyumlu olmasını hedeflediği (FCM) sürümü ekleyebilirsiniz. Cihazın gönderim FCM sürümü olarak da adlandırılır.
manifest.hal
İsteğe bağlı, tekrarlanabilir. Tek bir HAL (HIDL veya GL gibi yerel), format özelliğine bağlıdır.
manifest.hal.format
İsteğe bağlı. Değer şunlardan biri olabilir:
  • hidl: HIDL HAL'leri. Bu, varsayılan ayardır.
  • aidl: AIDL HAL'leri. Yalnızca manifest meta sürümü 2.0 ve üzeri için geçerlidir.
  • native: Yerel HAL'ler.
manifest.hal.max-level
İsteğe bağlı. Yalnızca çerçeve manifestlerinde geçerlidir. Ayarlandığında, maksimum seviye daha düşük olan HAL'ler daha fazla hedef FCM sürümü devre dışı bırakıldı.
manifest.hal.override
İsteğe bağlı. Değer şunlardan biri olabilir:
  • true: Diğer <hal> öğelerini şununla geçersiz kıl: aynı <name> ve ana sürüm. Yanıt hayır ise <version> veya <fqname> burada <hal> öğesi, ardından <hal> öğesi bu HAL'nin devre dışı bırakıldığını beyan eder.
  • false: Diğer <hal> öğelerini geçersiz kılma aynı <name> ve ana sürümle.
manifest.hal.name
Zorunlu. HAL'nin tam nitelikli paket adı. Birden çok HAL girişi için aynı ada sahip olmalıdır. Örnekler:
  • android.hardware.camera (HIDL veya AIDL HAL)
  • GLES (yerel HAL, yalnızca ad gerekir)
manifest.hal.transport
manifest.hal.format == "hidl" olduğunda zorunludur. ŞART OLMAMALIDIR gösterir. Bir arayüzden bir arayüze geçiş yapıldığında hangi aktarımın Bu paket, hizmet yöneticisi tarafından sorgulandı. Değer şunlardan biri olabilir:
  • hwbinder: Binderlenmiş mod
  • passthrough: Geçiş modu
ziyaret edin.
'nı inceleyin.
Şu durumlarda isteğe bağlıdır: manifest.hal.format == "aidl". ŞART OLMAMALIDIR gösterir. Bir arayüz sunulduğunda hangi aktarımın kullanıldığını belirtir bazı ipuçları vereceğim. Değer şöyle olmalıdır:
  • inet: Giriş soketi
ziyaret edin. manifest.hal.transport.ip ve manifest.hal.transport.port Inet bağlantı bilgilerini daha ayrıntılı bir şekilde belirtmek için kullanılmalıdır.
manifest.hal.transport.arch
passthrough için gereklidir ve şu süre için mevcut olmamalıdır: hwbinder. Geçiş hizmetinin bitimini açıklar sağlar. Değer şunlardan biri olabilir:
  • 32: 32 bit modu
  • 64: 64 bit modu
  • 32+64: Her ikisi
manifest.hal.transport.ip
inet için gereklidir, aksi takdirde mevcut OLMAMALIDIR. IP adresini açıklar Uzak arayüzün sunulduğu yer.
manifest.hal.transport.port
inet için gereklidir, aksi takdirde mevcut OLMAMALIDIR. Bağlantı noktasını tanımlar Uzak arayüzün sunulmakta olduğu komut dosyasıdır.
manifest.hal.version
İsteğe bağlı, tekrarlanabilir. hal etiketlerinin manifest'ini kullanabilirsiniz.

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

HIDL ve yerel HAL'ler temsil ettikleri sürece birden fazla sürüm alanı kullanabilirler ana sayfa başına yalnızca bir alt sürüm olacak şekilde, farklı ana sürümler sürümü sağlanmış. Örneğin, 3.1 ve 3.2 bir arada bulunamaz, ancak 1.0 ve 3.4 birlikte kullanılabilir. Bu, aynı ada sahip tüm hal öğeleri için geçerlidir. override="true". <version> değerleri değil <fqname> ile ilişkilendirilmiştir çünkü bir <fqname> bir sürüm içerir.

AIDL HAL'leri için, çalışan cihazlarda <version> bulunmamalıdır Android 11 ve önceki sürümler. <version> bir olmalıdır Android 12 ve sonraki sürümleri çalıştıran cihazlarda tek tam sayı Her biri için en fazla bir <version> olmalıdır (package, interface, instance) demeti. Mevcut değilse varsayılan olarak şuna dokunun: 1 <version> değeri şununla ilişkilendirilmiş: tüm <fqname> aynı <hal> içinde olmalı, çünkü <fqname> sürüm taşımıyor.
manifest.hal.interface
Zorunlu, yineleme olmadan tekrarlanabilir. paketinin aynısını kullanın. Birden fazla <hal> içindeki <interface> öğeleri; isimler farklı olmalıdır.
manifest.hal.interface.name
Zorunlu. Arayüzün adı.
manifest.hal.interface.instance
Zorunludur, tekrarlanabilir. Arayüzün örnek adı. Birden çok olabilir bir arayüz için örnekler ancak yinelenen <instance> yok öğeleri.
manifest.hal.fqname
İsteğe bağlı, tekrarlanabilir. HAL için örnek belirtmenin alternatif bir yöntemi manifest.hal.name adında.
  • HIDL HAL'leri için biçim şöyledir: @MAJOR.MINOR::INTERFACE/INSTANCE
  • AIDL HAL'leri için biçim INTERFACE/INSTANCE
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ü tanımlar. İçinde SDK_INT.PLAT_INT biçimindedir.
manifest.vendor-ndk
Zorunludur, tekrarlanabilir; gerekiyor. Mevcut olmamalıdır olması gerekir. Birden çok <vendor-ndk> girişi olmalıdır farklı <version>'ler. Bir VNDK anlık görüntüsü kümesini açıklar tarafından sağlandığından emin olun.
manifest.vendor-ndk.version
Zorunlu. Bu, VNDK sürümünü temsil eden pozitif bir tam sayıdır anlık görüntü.
manifest.vendor-ndk.library
İsteğe bağlıdır, yineleme olmadan tekrarlanabilir. Bir VNDK kitaplık kümesini açıklar bu VNDK tedarikçisinin anlık görüntüsünün çerçevesi tarafından sağlanmıştır. Değer bir kitaplığın dosya adı, ör. Önek dahil libjpeg.so lib ve .so son eki. Yol bileşeni yok izin verilir.
manifest.system-sdk.version
İsteğe bağlı, yineleme olmadan tekrarlanabilir; yalnızca çerçeve tarafından kullanılır manifest'ini kullanabilirsiniz. Çerçevenin şunları sağlamak için sağladığı sistem SDK'sı sürümlerini açıklar: satıcı uygulamalarıdı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. Varsayılan değeri Yoksa manifest.target-level. Şundan büyük olmalıdır: veya manifest.target-level değerine eşit. Görüntüleyin çekirdek eşleşme kuralları inceleyebilirsiniz.