Satıcı Yerel Geliştirme Kiti (VNDK), dlopen için satıcı veya ürün bölümündeki diğer kitaplıklar ya da ikili programlar tarafından çalışma zamanında kullanılan bir kitaplık grubudur.
Desteği sonlandırma
Satıcı NDK'sı, Android 8.0'da çerçeve ile tedarikçi kodu arasında API'ler sağlamak için kullanıma sunulmuştur. VNDK uzun yıllardır başarıyla kullanılsa da bazı dezavantajları vardır:- Depolama
- Tek bir VNDK APEX, cihazda kullanılıp kullanılmadıklarına bakılmaksızın tüm VNDK kitaplıklarını paketler.
- GSI, tedarikçi firma resimlerinin birden fazla sürümünü desteklemek için VNDK APEX'lerin birden fazla sürümünü içerir.
- Güncellenebilinme durumu
- VNDK APEX'leri platform güncellemesinden ayrı olarak güncellemek zordur.
- Tedarikçi firma resimleri sık sık kablosuz olarak (OTA) güncellendiğinden VNDK'nın sistem resmi içinde paketlenmesinin avantajları azalır.
VNDK desteğinin sonlandırılması hakkında ayrıntılar
Tüm VNDK kitaplıkları VNDK APEX'e paketlenir ve sistem (-ext) görüntüsüne yüklenir. VNDK'nın desteğinin sonlandırılmasıyla birlikte, eski VNDK kitaplıkları, tedarikçi firma tarafından sunulan diğer kitaplıklarla aynı şekilde tedarikçi firma (veya ürün) resmine yüklenir. VNDK desteğinin sonlandırılmasıyla birlikte aşağıdaki özellikler de kaldırılır:- Android 15 için VNDK APEX
- Tedarikçi veya ürün bölümleri Android 15 için derlenirse hedef VNDK sürümünü belirten sistem özellikleri kaldırılır:
ro.vndk.version
ro.product.vndk.version
- VNDK olmadığı için VNDK optimizasyonları kullanılamaz:
- Android Go cihazlar için
TARGET_VNDK_USING_CORE_VARIANT
- Tedarikçi APEX'leri için
use_vndk_as_stable
- Android Go cihazlar için
- VNDK'ya büyük ölçüde bağlı olan tedarikçi firma anlık görüntüsü
Kullanımdan kaldırma kapsamında olmayanlar
VNDK desteğinin sonlandırılmasıyla birlikte aşağıdaki özelliklerde değişiklik olmayacak:- Mevcut tedarikçi firma resimlerini desteklemek için gereken VNDK 14 veya daha eski sürümlere sahip VNDK APEX'leri.
- LL-NDK, VNDK'nın bir parçası değildir.
Neden VNDK?
AOSP, sistem bölümünün en son çerçeve sürümüne yükseltilebileceği, tedarikçi bölümü ise değiştirilmeden bırakılabileceği yalnızca çerçeve güncellemelerine izin verir. Her bölümdeki ikili dosyalar, farklı zamanlarda oluşturulmuş olsalar bile birbirleriyle çalışabilmelidir.
Yalnızca çerçeve güncellemeleri aşağıdaki zorlukları içerir:
- Çerçeve modülleri ile tedarikçi firma modülleri arasındaki bağımlılık. Android 8.0'dan önce tedarikçi ve sistem bölümündeki modüller birbirine bağlanabiliyordu. Ancak tedarikçi modüllerinden gelen bağımlılıklar, çerçeve modülleri geliştirmeye istenmeyen kısıtlamalar getiriyordu.
- 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 CTS'yi geçmesini zorunlu kılar. Ancak tedarikçiler, performansı artırmak veya HIDL uygulamalarında ek işlevler eklemek için AOSP kitaplıklarını genişlettikçe sistem bölümünü standart bir GSI ile flaşlamak tedarikçinin HIDL uygulamasını bozabilir. Bu tür kesintilerin önlenmesine ilişkin kurallar için VNDK uzantıları başlıklı makaleyi inceleyin.
Android, bu zorlukları gidermek için VNDK (bu bölümde açıklanmaktadır), HIDL, hwbinder, cihaz ağacı yer paylaşımı ve sepolicy yer paylaşımı gibi çeşitli özellikler içerir.
VNDK'ya özgü şartlar
VNDK ile ilgili belgelerde aşağıdaki terminoloji kullanılır:- Modüller, paylaşılan kitaplıkları veya yürütülebilir dosyaları ifade eder. Modüller, derleme zamanındaki bağımlılıkları oluşturur.
- İşlemler, yürütülebilir dosyalardan oluşturulan işletim sistemi görevleridir. İşlemler, çalışma zamanında bağımlılıklar oluşturur.
- Ç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 dosyaları ifade eder. - Çerçeve paylaşılan kitaplıkları,
/system/lib[64]
altındaki paylaşılan kitaplıkları ifade eder. - Çerçeve modülleri hem çerçevenin paylaşılan kitaplıklarını hem de çerçevenin yürütülebilir dosyalarını ifade eder.
- Çerçeve işlemleri,
/system/bin/app_process
gibi çerçeve yürütülebilir dosyalarından oluşturulan işlemlerdir. - Tedarikçi firma nitelikli terimler
vendor
bölümleriyle ilgilidir: - Tedarikçi firma yürütülebilir dosyaları,
/vendor/bin
- Tedarikçi firmanın paylaşılan kitaplıkları,
/vendor/lib[64]
altındaki paylaşılan kitaplıkları ifade eder. - Tedarikçi firma modülleri hem tedarikçi firma yürütülebilir dosyalarını hem de tedarikçi firma paylaşılan kitaplıklarını ifade eder.
- Tedarikçi işlemleri,
/vendor/bin/android.hardware.camera.provider@2.4-service
gibi tedarikçi yürütülebilir dosyalarından oluşturulan işlemlerdir.
VNDK kavramları
İdeal bir Android 8.0 ve sonraki sürümlerde, çerçeve işlemleri tedarikçi firmanın paylaşılan kitaplıklarını yüklemez, tüm tedarikçi firma işlemleri yalnızca tedarikçi firmanın paylaşılan kitaplıklarını (ve çerçevenin paylaşılan kitaplıklarının bir kısmını) yükler ve çerçeve işlemleri ile tedarikçi firma işlemleri arasındaki iletişim HIDL ve donanım bağlayıcısı tarafından yönetilir.
Bu tür bir dünyada, çerçevenin paylaşılan kitaplıklarındaki kararlı, herkese açık API'lerin tedarikçi modülü geliştiricileri için yeterli olmayabileceği (API'ler Android sürümleri arasında değişebilse de) ihtimali vardır. Bu da, çerçevenin paylaşılan kitaplıklarının bir kısmının tedarikçi süreçlerine erişilebilir olmasını gerektirir. Ayrıca, performans koşulları ödünlere yol açabileceğinden, yanıt süresi açısından kritik olan bazı HAL'ler farklı şekilde ele alınmalıdır.
Aşağıdaki bölümlerde, VNDK'nın tedarikçi firmalar ve aynı işlem HAL'leri (SP-HAL'ler) için çerçeve paylaşılan kitaplıklarını nasıl işlediği ayrıntılı olarak açıklanmaktadır.
Tedarikçi firma için çerçeve paylaşılan kitaplıkları
Bu bölümde, tedarikçi firma süreçlerinin erişebildiği paylaşılan kitaplıkların sınıflandırılmasına ilişkin ölçütler açıklanmaktadır. Tedarikçi modüllerini birden fazla Android sürümünde desteklemenin iki yolu vardır:
- Çerçevenin paylaşılan kitaplıklarının ABI'lerini/API'lerini sabitleyin. Yeni çerçeve modülleri ve eski tedarikçi firma modülleri, bellek ayak izini ve depolama alanı boyutunu azaltmak için aynı paylaşılan kitaplığı kullanabilir. Benzersiz bir paylaşılan kitaplık, aynı öğenin birden fazla kez yüklenmesiyle ilgili sorunları da önler. Ancak kararlı ABI'leri/API'leri korumanın geliştirme maliyeti yüksektir ve her çerçevenin paylaşılan kitaplığı tarafından dışa aktarılan tüm ABI'leri/API'leri kararlı hale getirmek gerçekçi değildir.
- Eski çerçevenin 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 ile tedarikçi modülleri arasında iletişim kurmak için kullanılan tüm mekanizmalar olarak tanımlanan yan kanallara karşı güçlü kısıtlamalar içerir. İletişim protokolü dondurulmamış ve kararlı değilse (ör. hwbinder üzerinden HIDL) iletişim olmamalıdır. Paylaşılan kitaplıkların iki kez yüklenmesi de sorunlara neden olabilir. Örneğin, yeni kitaplık tarafından oluşturulan bir nesne eski kitaplıktaki işlevlere aktarılırsa bu kitaplıklar nesneyi farklı şekilde yorumlayabileceğinden hata oluşabilir.
Paylaşılan kitaplıkların özelliklerine bağlı olarak farklı yaklaşımlar kullanılır. Bu nedenle, çerçeve paylaşılan kitaplıkları üç alt kategoriye ayrılır:
- LL-NDK Kitaplıkları, kararlı olduğu bilinen Çerçeve Paylaşılan Kitaplıkları'dır. Geliştiricileri, API/ABI kararlılığı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
velibvulkan.so
,
- LL-NDK aşağıdaki kitaplıkları içerir:
- Uygun VNDK Kitaplıkları (VNDK), iki kez kopyalanması güvenli olan Çerçeve Paylaşılan Kitaplıkları'dır. Çerçeve modülleri ve tedarikçi modülleri kendi kopyalarıyla bağlantı oluşturabilir. Bir çerçeve paylaşılan kitaplığı, yalnızca aşağıdaki ölçütleri karşılıyorsa uygun bir VNDK kitaplığı haline gelebilir:
- Çerçeveyle IPC gönderip almaz.
- ART sanal makinesiyle 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ğil.
- Kod sahibi, tedarikçi firma kullanımlarına itiraz etmiyor.
- Yalnızca Çerçeve Kitaplıkları (FWK-ONLY), yukarıda belirtilen kategorilere ait olmayan Çerçeve Paylaşılan Kitaplıkları'dır. Aşağıdaki kitaplıklar:
- Çerçeve dahili uygulama ayrıntıları olarak kabul edilir.
- Tedarikçi firma modülleri tarafından erişilmemelidir.
- Kararsız ABI'ler/API'ler ve API/ABI uyumluluğu garantisi yoktur.
- Kopyalanmaz.
Aynı İşlem HAL'i (SP-HAL)
Aynı İşlem HAL'i (SP-HAL), Tedarikçi Paylaşılan Kitaplıkları olarak uygulanan ve Çerçeve İşlemleri'ne yüklenen önceden belirlenmiş bir HAL grubudur. SP-HAL'ler bir bağlayıcı ad alanı tarafından izole edilir (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ının çerçeve süreçlerine iki kez yüklenmesinin soruna yol açmaması için VNDK-SP kitaplıkları dikkatlice incelenir. Hem SP-HAL'ler hem de VNDK-SP'ler Google tarafından tanımlanır.
Aşağıdaki kitaplıklar onaylanmış 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 }
belirtmelidir. vndk: {private:true}
de belirtilirse bu kitaplıklar VNDK-SP-Private
olarak adlandırılır ve SP-HALS'ler tarafından görünmez.
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ümlendirme
VNDK paylaşılan kitaplıkları sürümlere sahiptir:
ro.vndk.version
sistem özelliği/vendor/default.prop
'e otomatik olarak eklenir.- VNDK ve VNDK-SP paylaşılan kitaplıkları, VNDK apex olarak
com.android.vndk.v${ro.vndk.version}
yüklenir ve/apex/com.android.vndk.v${ro.vndk.version}
'e monte edilir.
ro.vndk.version
değeri aşağıdaki algoritma tarafından seçilir:
BOARD_VNDK_VERSION
,current
ile eşit değilseBOARD_VNDK_VERSION
değerini kullanın.BOARD_VNDK_VERSION
şuna eşitse:current
:PLATFORM_VERSION_CODENAME
REL
isePLATFORM_SDK_VERSION
(ör.28
) kullanın.- Aksi takdirde
PLATFORM_VERSION_CODENAME
(ör.P
) kullanın.
Tedarikçi Test Paketi (VTS)
Android Satıcı Testi Paketi (VTS), boş olmayan bir ro.vndk.version
mülkünü zorunlu kılar. Hem yeni kullanıma sunulan hem de yükseltilen cihazlar ro.vndk.version
değerini tanımlamalıdır. Bazı VNDK test durumları (ör. VtsVndkFilesTest
ve VtsVndkDependencyTest
), eşleşen uygun VNDK kitaplık veri kümelerini yüklemek için ro.vndk.version
mülküne dayanır.