Satıcı Yerel Geliştirme Kiti (VNDK)

Vendor Native Development Kit (VNDK), yalnızca satıcıların HAL'lerini uygulaması için bir dizi kitaplıktır. VNDK system.img içinde gönderilir ve çalışma zamanında satıcı koduna dinamik olarak bağlıdır.

Neden VNDK?

Android 8.0 ve üstü, satıcı bölümleri değişmeden kalırken sistem bölümünün en son sürüme yükseltilebildiği yalnızca çerçeve güncellemelerini etkinleştirir. Bu, farklı zamanlarda oluşturulan ikili dosyaların birbirleriyle çalışabilmesi gerektiği anlamına gelir; VNDK, Android sürümlerinde API/ABI değişikliklerini kapsar.

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, her iki taraftaki modüller diğer taraftaki modüllerle bağlantı kurabilirdi. 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 8.0 ve sonraki sürümleri, 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 VNDK uzantılarına bakın.)

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

VNDK kaynakları

Bu bölüm aşağıdaki VNDK kaynaklarını içerir:

  • VNDK kavramları (aşağıda), çerçeve paylaşımlı kitaplıkları, aynı işlem HAL'lerini (SP-HAL'ler) ve VNDK terminolojisini açıklar.
  • VNDK uzantıları , satıcıya özel değişiklikleri kategoriler halinde sınıflandırır. Örneğin, satıcı modüllerinin dayandığı genişletilmiş işlevlere sahip kitaplıklar, satıcı bölümüne kopyalanmalıdır, ancak ABI uyumlu olmayan değişiklikler yasaktır.
  • VNDK Yapı Sistemi Desteği , VNDK ile ilgili yapı sistemi yapılandırmalarını ve modül tanımı sözdizimlerini açıklar.
  • VNDK Tanımlama Aracı , kaynak ağacınızı Android 8.0 ve sonraki sürümlere geçirmenize yardımcı olur.
  • Bağlayıcı Ad Alanı , paylaşılan kitaplık bağlantıları üzerinde ayrıntılı denetim sağlar.
  • Dizinler, Kurallar ve sepolicy , Android 8.0 ve sonraki sürümleri çalıştıran cihazlar için dizin yapısını, VNDK kurallarını ve ilişkili sepolicy tanımlar.
  • VNDK Tasarım sunumu, Android 8.0 ve sonraki sürümlerde kullanılan temel VDNK kavramlarını gösterir.

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 kısmı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 olan 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ü 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 şu 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şılıyorsa 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 dahili 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 Çerçeve Süreçlerine 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. vendor_available: false da 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 terminolojisi

  • Modüller , Paylaşılan Kitaplıklar veya Yürütülebilir Dosyalar anlamına gelir.
  • İşlemler , Yürütülebilir Dosyalardan oluşturulan işletim sistemi görevleridir.
  • Çerçeve nitelikli terimler, sistem bölümüyle ilgili kavramlara atıfta bulunur.
  • Satıcı -nitelikli terimler, satıcı bölümleriyle ilgili kavramlara atıfta bulunur.

Örneğin:

  • Ç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ı hem de Yürütülebilir Çerçeve Dosyaları anlamına gelir.
  • Çerçeve İşlemleri , Yürütülebilir Çerçeve Dosyalarından (örneğin /system/bin/app_process ) oluşturulan işlemlerdir.
  • Satıcı Yürütülebilir Dosyaları, /vendor/bin içindeki yürütülebilir dosyalara başvurur
  • Vendor Shared Libraries , /vendor/lib[64] altındaki paylaşılan kütüphanelere atıfta bulunur.
  • Satıcı Modülleri , hem Satıcı Yürütülebilir Dosyalarına hem de Satıcı Paylaşılan Kitaplıklarına atıfta bulunur.
  • Satıcı İşlemleri , Satıcı Yürütülebilir Dosyalarından oluşturulan işlemlerdir (örn.
  • /vendor/bin/android.hardware.camera.provider@2.4-service ).

VNDK sürüm oluşturma

Android 9'da, VNDK paylaşılan kitaplıklarının sürümü şu şekildedir:

  • ro.vndk.version sistem özelliği otomatik olarak /vendor/default.prop eklenir.
  • VNDK paylaşılan kitaplıkları /system/lib[64]/vndk-${ro.vndk.version} dizinine kurulur.
  • VNDK-SP paylaşılan kitaplıkları /system/lib[64]/vndk-sp-${ro.vndk.version} dizinine kurulur.
  • Dinamik bağlayıcı yapılandırma dosyası /system/etc/ld.config.${ro.vndk.version}.txt kurulur.

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 ).

Cihazları yükseltme

Bir Android 8.x cihazı BOARD_VNDK_VERSION olmadan oluşturularak VNDK çalışma zamanı zorlamasını devre dışı bırakırsa, Android 9'a yükseltirken BoardConfig.mk PRODUCT_USE_VNDK_OVERRIDE := false ekleyebilir.

PRODUCT_USE_VNDK_OVERRIDE false , ro.vndk.lite özelliği /vendor/default.prop öğesine otomatik olarak eklenir ve değeri true olur. Sonuç olarak, dinamik bağlayıcı, yalnızca SP-HAL ve VNDK-SP'yi izole eden /system/etc/ld.config.vndk_lite.txt adresinden bağlayıcı ad alanı yapılandırmasını yükleyecektir.

Android 7.0 veya daha eski bir cihazı Android 9'a yükseltmek için PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := false BoardConfig.mk .

Satıcı Test Paketi (VTS)

Android 9 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.

ro.product.first_api_level özelliği 27'den büyükse, ro.vndk.lite özelliği tanımlanmamalıdır. Yeni başlatılan bir Android 9 cihazında ro.vndk.lite tanımlanırsa VtsTreblePlatformVersionTest başarısız olur.

Belge geçmişi

Bu bölüm, VNDK belgelerinde yapılan değişiklikleri izler.

Android 9 değişiklikleri

  • VNDK sürüm oluşturma bölümü ekleyin.
  • VTS bölümü ekleyin.
  • Bazı VNDK kategorileri yeniden adlandırıldı:
    • LL-NDK-Dolaylı, LL-NDK-Private olarak yeniden adlandırıldı.
    • VNDK-Dolaylı, VNDK-Private olarak yeniden adlandırıldı.
    • VNDK-SP-Dolaylı-Özel, VNDK-SP-Özel olarak yeniden adlandırıldı.
    • VNDK-SP-Dolaylı kaldırıldı.

Android 8.1 değişiklikleri

  • SP-NDK kitaplıkları, LL-NDK kitaplıklarıyla birleştirildi.
  • RS ad alanı bölümünde libft2.so libui.so ile değiştirin. libui.so eklemek bir hataydı.
  • libGLESv3.so ve libandroid_net.so LL-NDK kitaplıklarına ekleyin.
  • VNDK-SP kitaplıklarına libion.so ekleyin.
  • libstdc++.so dosyasını LL-NDK kitaplıklarından kaldırın. Bunun yerine libc++.so kullanın. Bağımsız araç zincirlerinin bazı sürümleri, varsayılan bağlayıcı bayraklarına -lstdc++ ekleyebilir. Varsayılanları devre dışı bırakmak için -nodefaultlibs -lc -lm -ldl LDFLAGS .
  • libz.so LL-NDK'dan VNDK-SP kitaplıklarına taşıyın. Bazı konfigürasyonlarda, libz.so LL-NDK olmaya devam edebilir. Ancak, gözlemlenebilir farklılıklar olmamalıdır.