Satıcı Yerel Geliştirme Seti'ne (VNDK) genel bakış

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

Kullanımdan Kaldırma

Android 8.0'da, çerçeve ve satıcı kodu arasında API'ler sağlamak için satıcı NDK'sı kullanıma sunuldu. VNDK uzun yıllardır başarıyla kullanılsa da bazı dezavantajları vardır:
  • Depolama
    • Tek bir VNDK APEX paketi, cihazda kullanılıp kullanılmadıklarına bakılmaksızın tüm VNDK kitaplıklarını içerir.
    • GSI, birden fazla satıcı görüntüsünü desteklemek için VNDK APEX'lerinin birden fazla sürümünü içerir.
  • Güncellenebilme durumu
    • VNDK APEX'lerini platform güncellemesinden ayrı olarak güncellemek zordur.
    • Tedarikçi resimleri kablosuz olarak (OTA) sık sık güncellenir. Bu durum, VNDK'nın sistem resminde paketlenmesinin avantajlarını azaltır.
Bu sorunlar nedeniyle, Android 15'ten itibaren VNDK'yı kullanımdan kaldırmaya karar verdik.

VNDK desteğinin sonlandı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 desteğinin sonlandırılmasıyla birlikte, eski VNDK kitaplıkları diğer tedarikçi tarafından kullanılabilen kitaplıklar gibi tedarikçi (veya ürün) görüntüsüne yüklenir. Bu özellikler, VNDK desteğinin sonlandırılmasıyla birlikte kaldırılır:
  • Android 15 için VNDK APEX
  • Tedarikçi veya ürün bölümleri Android 15 için oluşturulmuşsa hedef VNDK'nın 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
    • use_vndk_as_stable Tedarikçi APEX'leri için
  • VNDK'ya büyük ölçüde bağlı olan tedarikçi anlık görüntüsü

Kullanımdan kaldırma işleminden muaf tutulanlar

VNDK desteğinin sonlandırılmasıyla birlikte bu özelliklerde değişiklik olmayacak:
  • Mevcut satıcı resimlerini desteklemek için gereken VNDK sürüm 14 veya önceki sürümlere sahip VNDK APEX'leri.
  • LL-NDK, VNDK'nın bir parçası değildir.

Neden VNDK?

AOSP, yalnızca çerçeve güncellemelerine izin verir. Bu güncellemelerde sistem bölümü en son çerçeve sürümüne yükseltilirken satıcı bölümü değiştirilmez. Farklı zamanlarda oluşturulmuş olsalar da 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 tedarikçi 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üllerinin geliştirilmesine istenmeyen kısıtlamalar getiriyordu.
  • AOSP kitaplıklarına yönelik 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ına ekstra 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 bozulmaları önlemeyle ilgili yönergeler için VNDK uzantıları başlıklı makaleyi inceleyin.

Android, bu zorlukların üstesinden gelmek için 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'ye ö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ı bağımlılıkları oluşturur.
  • İşlemler, yürütülebilir dosyalardan oluşturulan işletim sistemi görevleridir. İşlemler, çalışma zamanı bağımlılıkları oluşturur.
  • Çerçeve ile ilgili şartlar, 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.
    • Framework modülleri hem framework paylaşılan kitaplıklarını hem de framework 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 nitelikli terimler vendor bölümleriyle ilgilidir:
    • Tedarikçi çalıştırılabilir dosyaları, /vendor/bin içindeki çalıştırılabilir dosyaları ifade eder.
    • Sağlayıcı tarafından paylaşılan kitaplıklar, /vendor/lib[64] altındaki paylaşılan kitaplıkları ifade eder.
    • Tedarikçi modülleri, hem tedarikçi yürütülebilir dosyalarını hem de tedarikçi 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ümler dünyasında, çerçeve süreçleri tedarikçi tarafından paylaşılan kitaplıkları yüklemez, tüm tedarikçi süreçleri yalnızca tedarikçi tarafından paylaşılan kitaplıkları (ve çerçeve tarafından paylaşılan kitaplıkların bir bölümünü) yükler ve çerçeve süreçleri ile tedarikçi süreçleri arasındaki iletişimler HIDL ve donanım bağlayıcı tarafından yönetilir.

Böyle bir dünyada, çerçeve paylaşılan kitaplıklarından gelen kararlı ve herkese açık 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) ve çerçeve paylaşılan kitaplıklarının bir kısmının satıcı süreçlerine erişilebilir olması gerekebilir. 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çiler için çerçeve paylaşılan kitaplıklarını ve aynı işlemde HAL'leri (SP-HAL'ler) nasıl işlediği ayrıntılı olarak açıklanmaktadır.

Tedarikçi için çerçeve paylaşılan kitaplıkları

Bu bölümde, satıcı süreçlerinin erişebildiği paylaşılan kitaplıkları sınıflandırma ölçütleri açıklanmaktadır. Tedarikçi modüllerinin birden fazla Android sürümünde desteklenmesi için iki yaklaşım vardır:

  1. Çerçeve paylaşılan kitaplıklarının ABI'lerini/API'lerini dengeleyin. Yeni çerçeve modülleri ve eski tedarikçi modülleri, bellek ayak izini ve depolama alanını azaltmak için aynı paylaşılan kitaplığı kullanabilir. Ayrıca, benzersiz bir paylaşılan kitaplık, birden fazla kez yükleme sorununu da önler. Ancak kararlı ABI'leri/API'leri korumak için gereken geliştirme maliyeti yüksektir ve her çerçeve paylaşılan kitaplığı tarafından dışa aktarılan tüm ABI'leri/API'leri kararlı hale getirmek gerçekçi değildir.
  2. Eski çerçeve paylaşılan kitaplıklarını kopyalayın. Binder, 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 kullanılan tüm mekanizmalar olarak tanımlanan yan kanallara karşı güçlü bir kısıtlama içerir. İletişim protokolü dondurulup sabitlenmediği sürece (ö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 Framework Shared Libraries'dir. 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 Framework Shared Libraries'dir. Framework Modules (Çerçeve Modülleri) ve Vendor Modules (Tedarikçi Modülleri) kendi kopyalarıyla bağlantı oluşturabilir. Paylaşılan bir çerçeve kitaplığı, 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ı yoktur.
    • Kodun sahibi, tedarikçi kullanımlarına itiraz etmiyor.
  • Yalnızca Çerçeve Kitaplıkları (FWK-ONLY), yukarıda belirtilen kategorilere ait olmayan Çerçeve Paylaşımlı Kitaplıklar'dır. Şu kitaplıklar:
    • Çerçevenin dahili uygulama ayrıntıları olarak kabul edilir.
    • Tedarikçi modülleri tarafından erişilememelidir.
    • Kararsız ABI'lere/API'lere sahip olmak ve API/ABI uyumluluğu garantisi vermemek.
    • Kopyalanmaz.

Aynı İşlem HAL'si (SP-HAL)

Aynı Süreç HAL'si (SP-HAL), Vendor Shared Libraries olarak uygulanan ve Framework Processes'e yüklenen bir dizi önceden belirlenmiş HAL'dir. SP-HAL'ler, bağlayıcı ad alanı (paylaşılan kitaplıklara görünür olan kitaplıkları ve sembolleri kontrol eder) tarafından yalıtılır. 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 çift yüklenmesinin sorunlara neden olmaması 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 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ı, vndk: { support_system_process: true } Android.bp dosyalarında belirtir. vndk: {private:true} da belirtilmişse bu kitaplıklar VNDK-SP-Private olarak adlandırılır ve SP-HALS için görünmezdir.

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üm oluşturulur:

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

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

  • BOARD_VNDK_VERSION, current değerine eşit değilse BOARD_VNDK_VERSION değerini kullanın.
  • BOARD_VNDK_VERSION, current'e eşitse:
    • PLATFORM_VERSION_CODENAME, REL ise PLATFORM_SDK_VERSION (ör. 28) kullanın.
    • Aksi takdirde PLATFORM_VERSION_CODENAME simgesini kullanın (ör. P).

Tedarikçi Test Paketi (VTS)

Android Vendor Test Suite (VTS), boş olmayan bir ro.vndk.version özelliği zorunlu kılar. Hem yeni kullanıma sunulan cihazlar hem de yükseltme yapılan cihazlar ro.vndk.version değerini tanımlamalıdır. Bazı VNDK testleri (ör. VtsVndkFilesTest ve VtsVndkDependencyTest), uygun VNDK kitaplıkları veri kümelerini yüklemek için ro.vndk.version özelliğini kullanır.