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.
Kullanımdan kaldırma
Satıcı NDK'sı, Android 8.0'da çerçeve ile satıcı kodu arasında API'ler sağlamak için kullanıma sunulmuştur. VNDK, yıllardır başarıyla kullanılıyor olsa 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 görüntülerinin 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'nın kullanımdan kaldırılmasıyla ilgili 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
- Büyük ölçüde VNDK'ya bağlı olan tedarikçi firma anlık görüntüsü
Kullanımdan kaldırma kapsamında olmayanlar
VNDK'nın kullanımdan kaldırılmasıyla birlikte bu özellikler değişmeyecektir:- 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, satıcı ve sistem bölümündeki modüller birbiriyle bağlantı kurabiliyordu. Ancak tedarikçi modüllerinden kaynaklanan bağımlılıklar, çerçeve modüllerinin geliştirilmesinde istenmeyen kısıtlamalara yol açıyordu.
- AOSP kitaplıklarına 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ı için ek işlevler eklemek için AOSP kitaplıklarını genişlettikçe, sistem bölümünün standart bir GSI ile güncellenmesi 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 özel ş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ında 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 çalışması yürütülebilir dosyaları,
/system/bin
veya/system/xbin
uygulamalarındaki 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çeve paylaşılan kitaplıklarını hem de çerçeve yürütülebilir dosyalarını ifade eder.
- Çerçeve çalışması süreçleri,
/system/bin/app_process
gibi çerçeve yürütülebilir öğelerinden kaynaklanan işlemlerdir. - Tedarikçi firma nitelikli terimler
vendor
bölümleriyle ilgilidir: - Tedarikçi firma yürütülebilir dosyaları
/vendor/bin
dosyasındaki yürütülebilir dosyalara referans verir - 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 süreçleri tedarikçi firmanın paylaşılan kitaplıklarını yüklemez, tüm tedarikçi firma süreçleri 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 süreçleri ile tedarikçi firma süreçleri arasındaki iletişim HIDL ve donanım bağlayıcısı tarafından yönetilir.
Böyle bir durum, çerçeve paylaşılan kitaplıklardaki 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şebiliyor olsa da) anlamına gelir. Bu durumda, çerçeve paylaşılan kitaplıkların bir kısmının tedarikçi işlemleri için erişilebilir olması gerekir. Ayrıca, performans şartları ö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çeve paylaşılan kitaplıkların ABI'lerini/API'lerini dengeleyin. 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. Bununla birlikte, kararlı ABI'leri/API'leri sürdürmenin geliştirme maliyeti yüksektir ve paylaşılan her çerçeve tarafından dışa aktarılan tüm ABI'leri/API'leri sabitlemek 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 çift yüklenmesi de sorunlara neden olabilir. Örneğin, yeni kitaplık tarafından oluşturulan bir nesne, eski kitaplıktaki işlevlere geçirilirse bu kitaplıklar nesneyi farklı şekilde yorumlayabileceğinden hata oluşabilir.
Ortak kitaplıkların özelliklerine bağlı olarak farklı yaklaşımlar kullanılır. Sonuç olarak, ç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. Çerçeve paylaşımlı bir kitaplık, yalnızca aşağıdaki ölçütleri karşıladığı takdirde uygun bir VNDK kitaplığı olabilir:
- Çerçeveye/çerçeveden IPC göndermez/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 içi uygulama ayrıntıları olarak kabul edilir.
- Tedarikçi 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ı, VNDK-SP kitaplıklarının çerçeve işlemlerine iki kez yüklenmesinin soruna neden olmaması için dikkatle 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ının sürümü mevcuttur:
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 cihazlar hem de yeni sürüme geçirilen cihazlar ro.vndk.version
öğesini tanımlamalıdır. Bazı VNDK test durumları (ör. VtsVndkFilesTest
ve VtsVndkDependencyTest
), eşleşen uygun VNDK kitaplıkları veri kümelerini yüklemek için ro.vndk.version
özelliğini kullanır.