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

Vendor Native Development Kit (VNDK) , dlopen için çalışma zamanında satıcı veya ürün bölümünde diğer kitaplıklar veya ikili dosyalar tarafından kullanılan bir kitaplık kümesidir.

Neden VNDK?

AOSP, satıcı bölümü değişmeden kalı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ş olmasına rağmen, 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 ve 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ğlanabilirdi. Ancak, satıcı modüllerinden kaynaklanan 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. Bununla birlikte, satıcılar, performansı artırmak veya HIDL uygulamaları için ekstra işlevler eklemek için AOSP kitaplıklarını genişlettikçe, sistem bölümünün standart bir GSI ile yanıp sönmesi, bir satıcının HIDL uygulamasını bozabilir. Bu tür kırılmaları önlemeye ilişkin 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ı yerleşimi ve sepolicy yerleşimi 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ı yapar.
  • İşlemler , yürütülebilir dosyalardan oluşturulan işletim sistemi görevleridir. İşlemler, çalışma zamanı bağımlılıkları yapar.
  • Ç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şımlı kitaplıklarına hem de çerçeve yürütülebilir dosyalarına atıfta bulunur.
    • Çerçeve süreçleri , /system/bin/app_process gibi çerçeve yürütülebilir dosyalarından oluşturulan süreçlerdir.
  • Satıcı -nitelikli terimler, vendor bölümleriyle ilgilidir:
    • Satıcı yürütülebilir dosyaları, /vendor/bin içindeki yürütülebilir dosyalara atıfta bulunur
    • Satıcı tarafından paylaşılan kitaplıklar, /vendor/lib[64] altındaki paylaşılan kitaplıkları ifade eder.
    • Satıcı modülleri , hem satıcı tarafından yürütülebilir dosyalara hem de satıcı tarafından paylaşılan kitaplıklara atıfta bulunur.
    • Satıcı süreçleri , /vendor/bin/android.hardware.camera.provider@2.4-service gibi Satıcı Yürütülebilir Dosyalarından oluşturulan süreçlerdir.

VNDK kavramları

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

Böyle bir dünya, çerçeve paylaşımlı kitaplıklardan gelen 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şebilse de) olasılığını içerir ve çerçeve paylaşılan kitaplıklarının bir kısmının satıcı süreçleri tarafından erişilebilir olmasını gerektirir. Ayrıca, performans gereksinimleri tavizlere yol açabileceğinden, yanıt süresi açısından kritik bazı HAL'lerin farklı şekilde ele alınması gerekir.

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

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

Bu bölüm, satıcı süreçleri tarafından erişilebilir olan paylaşılan kitaplıkları sınıflandırmaya yönelik ölçütleri açıklar. Birden çok Android sürümünde satıcı modüllerini desteklemek için iki yaklaşım vardır:

  1. Çerçeve paylaşılan kitaplıkların ABI'lerini/API'lerini sabitleyin . Yeni çerçeve modülleri ve eski satıcı modülleri, bellek ayak izini ve depolama boyutunu azaltmak için aynı paylaşılan kitaplığı kullanabilir. Benzersiz bir paylaşılan kitaplık ayrıca birkaç çift yükleme sorununu da önler. Ancak, kararlı ABI'leri/API'leri sürdürmenin geliştirme maliyeti yüksektir ve her çerçeve paylaşılan kitaplığı tarafından dışa aktarılan tüm ABI'leri/API'leri stabilize etmek gerçekçi değildir.
  2. Eski çerçeve paylaşılan kitaplıklarını kopyalayın . Bağlayıcı, soket, boru, 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ında iletişim kurmak için tüm mekanizmalar olarak tanımlanan yan kanallara karşı güçlü bir kısıtlama ile birlikte gelir. İletişim protokolü donmuş ve kararlı olmadığı sürece iletişim olmamalıdır (örn. HIDL aracılığıyla hwbinder). Paylaşılan kitaplıkların çift yüklenmesi de sorunlara neden olabilir; örneğin, yeni kütüphane tarafından oluşturulan bir nesne eski kütüphaneden fonksiyonlara aktarılırsa, bu kütüphaneler nesneyi farklı yorumlayabileceğinden bir hata oluşabilir.

Paylaşılan kütüphanelerin özelliklerine göre farklı yaklaşımlar kullanılmaktadır. Sonuç olarak, çerçeve paylaşımlı kitaplıklar üç alt kategoride sınıflandırılır:

  • LL-NDK Kitaplıkları , kararlı olduğu bilinen Çerçeve Paylaşımlı Kitaplıklardır . Geliştiricileri, API/ABI kararlılıklarını korumaya kararlıdır.
    • LL-NDK aşağıdaki kitaplıkları 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şımlı Kitaplıklardır . Çerçeve Modülleri ve Satıcı Modülleri , kendi kopyalarıyla bağlantı kurabilir. Bir çerçeve paylaşımlı kitaplığı, yalnızca aşağıdaki kriterleri karşılaması durumunda uygun bir VNDK kitaplığı haline gelebilir:
    • Çerçeveye/çerçeveden IPC göndermez/almaz.
    • ART sanal makine ile ilgili değildir.
    • Kararsız dosya biçimlerine 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şımlı Kitaplıklardı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ı İşlem HAL (SP-HAL)

Same-Process HAL ( SP-HAL ), Vendor Shared Libraries olarak uygulanan ve Framework Processes'e yüklenen önceden belirlenmiş HAL'ler kümesidir. SP-HAL'ler bir bağlayıcı ad alanı tarafından yalıtılır (paylaşılan kitaplıklara görünen kitaplıkları ve sembolleri denetler). 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 yüklenmesinin sorunlara neden olmamasını sağlamak için dikkatlice gözden geçirilir. 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 } belirtir. vndk: {private:true} belirtilirse, bu kitaplıklara VNDK-SP-Private adı verilir ve bunlar SP-HALS tarafından görülmez.

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

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

VNDK sürüm oluşturma

VNDK paylaşılan kitaplıkları sürümlendirilir:

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

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 , current eşitse :
    • PLATFORM_VERSION_CODENAME REL ise, PLATFORM_SDK_VERSION kullanın (örn. 28 ).
    • Aksi takdirde, 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 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 güvenir.