Satıcı Yerel Geliştirme Kitine (VNDK) genel bakış

Satıcı Yerel Geliştirme Kiti (VNDK), satıcı veya ürün bölümündeki diğer kitaplıklar veya ikili dosyalar tarafından dlopen için çalışma zamanında kullanılan bir kitaplıklar kümesidir.

Neden VNDK?

AOSP, satıcı bölümü değişmeden bırakılırken sistem bölümünün en son çerçeve sürümüne yükseltilebildiği yalnızca çerçeve güncellemelerine izin verir. Farklı zamanlarda oluşturulmuş olsalar bile, her bölümdeki ikili dosyalar birbirleriyle çalışabilmelidir.

Yalnızca çerçeve güncellemeleri aşağıdaki zorlukları içerir:

  • Çerçeve modülleri ile satıcı modülleri arasındaki bağımlılık . Android 8.0'dan önce, satıcı ve sistem bölümündeki modüller birbirine bağlanabiliyordu. Ancak satıcı modüllerden gelen bağımlılıklar, çerçeve modüllerinin geliştirilmesine istenmeyen kısıtlamalar getirdi.
  • AOSP kitaplıklarının uzantıları . Android, sistem bölümü standart bir Genel Sistem Görüntüsü (GSI) ile değiştirildiğinde tüm Android cihazlarının CTS'yi geçmesini gerektirir. Ancak satıcılar performansı artırmak veya HIDL uygulamaları için ekstra işlevsellikler eklemek amacıyla AOSP kitaplıklarını genişlettikçe, sistem bölümünün standart bir GSI ile güncellenmesi satıcının HIDL uygulamasını bozabilir. Bu tür kesintileri önlemeye yönelik yönergeler için bkz. VNDK uzantıları .

Bu zorlukların üstesinden gelmek için Android, VNDK (bu bölümde açıklanmıştır), HIDL , hwbinder, cihaz ağacı kaplaması ve sepolicy kaplaması gibi çeşitli özellikler içerir.

VNDK'ya özgü terimler

VNDK ile ilgili belgeler aşağıdaki terminolojiyi kullanır:
  • Modüller , paylaşılan kitaplıkları veya yürütülebilir dosyaları ifade eder. Modüller derleme zamanı bağımlılıkları oluşturur.
  • İşlemler, yürütülebilir dosyalardan oluşturulan işletim sistemi görevleridir. Süreçler çalışma zamanı bağımlılıkları yaratır.
  • Çerçeve nitelikli terimler system bölümüyle ilgilidir:
    • Çerçeve yürütülebilir dosyaları, /system/bin veya /system/xbin içindeki yürütülebilir dosyalara atıfta bulunur.
    • Çerçeve paylaşımlı kitaplıkları /system/lib[64] altındaki paylaşılan kitaplıklara atıfta bulunur.
    • Çerçeve modülleri, hem çerçeve paylaşılan kitaplıklarına hem de çerçeve yürütülebilir dosyalarına atıfta bulunur.
    • Çerçeve işlemleri , /system/bin/app_process gibi çerçeve yürütülebilir dosyalarından oluşturulan işlemlerdir.
  • Satıcı nitelikli terimler vendor bölümleriyle ilgilidir:
    • Satıcının yürütülebilir dosyaları /vendor/bin içindeki yürütülebilir dosyalara atıfta bulunur
    • Satıcının paylaşılan kitaplıkları /vendor/lib[64] altındaki paylaşılan kitaplıkları ifade eder.
    • Satıcı modülleri hem satıcının yürütülebilir dosyalarına hem de satıcının paylaşılan kitaplıklarına atıfta bulunur.
    • Satıcı işlemleri , /vendor/bin/android.hardware.camera.provider@2.4-service gibi Satıcı Yürütülebilir Dosyalarından oluşturulan işlemlerdir.

VNDK kavramları

İdeal bir Android 8.0 ve üzeri dünyada, çerçeve süreçleri satıcının paylaştığı kitaplıkları yüklemez, tüm satıcı süreçleri yalnızca satıcının paylaştığı kitaplıkları (ve çerçeve paylaşılan kitaplıkların bir kısmını) yükler ve çerçeve süreçleri ile satıcı süreçleri arasındaki iletişimler HIDL ve donanım tarafından yönetilir. bağlayıcı.

Böyle bir dünya, çerçeve paylaşımlı kitaplıklardaki kararlı, genel API'lerin satıcı modül geliştiricileri için yeterli olmayabileceği (API'ler Android sürümleri arasında değişebilmesine rağmen) ve çerçeve paylaşılan kitaplıkların bir kısmının satıcı süreçleri tarafından erişilebilir olmasını gerektirme olasılığını içerir. Ayrıca, performans gereklilikleri uzlaşmalara yol açabileceğinden, yanıt süresi açısından kritik olan bazı HAL'lere farklı şekilde davranılmalıdır.

Aşağıdaki bölümlerde VNDK'nın satıcılar ve Aynı Süreç HAL'leri (SP-HAL'ler) için çerçeve paylaşılan kitaplıklarını nasıl ele aldığı ayrıntılı olarak açıklanmaktadır.

Satıcı için çerçeve paylaşılan kitaplıkları

Bu bölümde satıcı işlemlerinin erişebildiği paylaşılan kitaplıkları sınıflandırma kriterleri açıklanmaktadır. Birden fazla Android sürümünde satıcı modüllerini desteklemek için iki yaklaşım vardır:

  1. Çerçeve paylaşımlı kitaplıklarının ABI'lerini/API'lerini stabilize edin . Yeni çerçeve modülleri ve eski satıcı modülleri, bellek alanını ve depolama boyutunu azaltmak için aynı paylaşılan kitaplığı kullanabilir. Benzersiz bir paylaşılan kitaplık aynı zamanda birçok çift yükleme sorununu da önler. Ancak ABI'leri/API'leri istikrarlı bir şekilde sürdürmenin geliştirme maliyeti yüksektir ve her çerçeve paylaşımlı kitaplığı tarafından dışa aktarılan tüm ABI'leri/API'leri stabil hale getirmek gerçekçi değildir.
  2. Eski çerçeve paylaşılan kitaplıklarını kopyalayın . Bağlayıcı, soket, kanal, paylaşılan bellek, paylaşılan dosya ve sistem özellikleri dahil (ancak bunlarla sınırlı olmamak üzere) çerçeve modülleri ve satıcı modülleri arasındaki iletişim için tüm mekanizmalar olarak tanımlanan yan kanallara karşı güçlü kısıtlamayla birlikte gelir. İletişim protokolü dondurulmadıkça ve kararlı hale gelmedikçe (örn. hwbinder aracılığıyla HIDL) hiçbir iletişim olmamalıdır. Paylaşılan kitaplıkların çift kez yüklenmesi de sorunlara neden olabilir; örneğin yeni kütüphane tarafından oluşturulan bir nesne eski kütüphanedeki fonksiyonlara aktarılırsa bu kütüphaneler nesneyi farklı yorumlayabileceğinden hata oluşabilir.

Paylaşılan kütüphanelerin özelliklerine göre farklı yaklaşımlar kullanılmaktadır. Sonuç olarak, çerçeve paylaşımlı kütüphaneler üç alt kategoriye ayrılır:

  • LL-NDK Kitaplıkları, kararlı olduğu bilinen Çerçeve Paylaşımlı Kitaplıklardır . Geliştiricileri API/ABI stabilitelerini korumaya kararlıdır.
    • LL-NDK şu kütüphaneleri içerir: libEGL.so , libGLESv1_CM.so , libGLESv2.so , libGLESv3.so , libandroid_net.so , libc.so , libdl.so , liblog.so , libm.so , libnativewindow.so , libneuralnetworks.so , libsync.so , libvndksupport.so ve libvulkan.so ,
  • Uygun VNDK Kitaplıkları (VNDK), iki kez kopyalanması güvenli olan Çerçeve Paylaşılan Kitaplıklardır . Çerçeve Modülleri ve Satıcı Modülleri kendi kopyalarına bağlanabilir. Çerçeve paylaşımlı kitaplığı, yalnızca aşağıdaki kriterleri karşılaması durumunda uygun bir VNDK kitaplığı haline gelebilir:
    • Çerçeveye IPC göndermez/almaz.
    • ART sanal makinesi ile ilgili değildir.
    • Kararsız dosya formatlarına sahip dosyaları/bölümleri okumaz/yazmaz.
    • Yasal inceleme gerektiren özel bir yazılım lisansına sahip değildir.
    • Kod sahibinin satıcı kullanımlarına itirazı yoktur.
  • Yalnızca Çerçeve Kitaplıkları (YALNIZCA FWK), yukarıda belirtilen kategorilere ait olmayan Çerçeve Paylaşılan Kitaplıklarıdır . Bu kütüphaneler:
    • Çerçeve iç uygulama ayrıntıları olarak kabul edilir.
    • Satıcı modülleri tarafından erişilmemelidir.
    • Kararsız ABI'lere/API'lere sahip olun ve API/ABI uyumluluk garantisi yok.
    • Kopyalanmaz.

Aynı Süreç HAL (SP-HAL)

Aynı Süreç HAL ( SP-HAL ), Satıcı Paylaşılan Kitaplıkları olarak uygulanan ve Çerçeve Süreçlerine yüklenen, önceden belirlenmiş bir HAL kümesidir. SP-HAL'ler bir bağlayıcı ad alanıyla yalıtılır (paylaşılan kitaplıklar tarafından görülebilen kitaplıkları ve sembolleri kontrol eder). SP-HAL'ler yalnızca LL-NDK ve VNDK-SP'ye bağlı olmalıdır.

VNDK-SP, uygun VNDK kitaplıklarının önceden tanımlanmış bir alt kümesidir. VNDK-SP kitaplıkları, VNDK-SP kitaplıklarının çerçeve süreçlerine çift kez yüklenmesinin sorun yaratmamasını sağlamak için dikkatle incelenir. Hem SP-HAL'ler hem de VNDK-SP'ler Google tarafından tanımlanır.

Aşağıdaki kitaplıklar onaylı SP-HAL'lerdir:

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

VNDK-SP kitaplıkları, Android.bp dosyalarında vndk: { support_system_process: true } öğesini belirtir. vndk: {private:true} da belirtilirse bu kitaplıklara VNDK-SP-Private adı verilir ve SP-HALS tarafından görünmezler.

Aşağıdakiler RS ​​istisnaları olan yalnızca çerçeve kitaplıklarıdır (FWK-ONLY-RS) :

  • libft2.so (Renderscript)
  • libmediandk.so (Renderscript)

VNDK versiyonlama

VNDK paylaşılan kitaplıklarının sürümleri şu şekildedir:

  • ro.vndk.version sistem özelliği otomatik olarak /vendor/default.prop dosyasına eklenir.
  • VNDK ve VNDK-SP paylaşılan kitaplıkları, VNDK apex com.android.vndk.v${ro.vndk.version} olarak yüklenir ve /apex/com.android.vndk.v${ro.vndk.version} öğesine bağlanır.

ro.vndk.version değeri aşağıdaki algoritma tarafından seçilir:

  • BOARD_VNDK_VERSION , current eşit değilse BOARD_VNDK_VERSION kullanın.
  • BOARD_VNDK_VERSION şu anki current eşitse:
    • PLATFORM_VERSION_CODENAME REL ise PLATFORM_SDK_VERSION kullanın (örn. 28 ).
    • Aksi halde PLATFORM_VERSION_CODENAME kullanın (örn. P ).

Satıcı Test Paketi (VTS)

Android Vendor Test Suite (VTS), boş olmayan bir ro.vndk.version özelliğini zorunlu kılar. Hem yeni başlatılan cihazlar hem de yükseltme yapan cihazlar ro.vndk.version tanımlamalıdır. Bazı VNDK test durumları (örneğin VtsVndkFilesTest ve VtsVndkDependencyTest ), eşleşen uygun VNDK kitaplıkları veri kümelerini yüklemek için ro.vndk.version özelliğine dayanır.