Bu dokümanda, geliştiricilerin SDK Çalışma Zamanı'na geçişine yardımcı olacak yeni bir Jetpack kitaplığı önerilmektedir. Bu dokümanda, SDK Çalışma Zamanı'nın önceki Android platform sürümlerinde (derlemeden yürütmeye kadar) nasıl destekleneceği ve geliştiricilerin çalışma zamanı ortamında hangi farklılıkları veya sınırlamaları bekleyebileceği açıklanmaktadır. Bu kitaplık, geliştiricilerin uygulamalarının veya SDK'larının SDK Çalışma Zamanı desteği olan veya olmayan cihazlarda çalışabilme özelliğini içeren tek bir sürümü oluşturmasına olanak tanır.
Geriye dönük uyumluluk aşağıdaki bileşenler aracılığıyla sağlanır:
Android Gradle Plugin (AGP) + Bundletool, SDK Çalışma Zamanı'nı APK'nın bir parçası olarak birleştirerek, SDK Çalışma Zamanı desteği olmayan diğer cihazlara erişebilir.
SDK Çalışma Zamanı istemci kitaplığı (
androidx.privacysandbox.sdkruntime:sdkruntime-client
), Uygulama öğelerinden SDK'ya sahip olan ve SDK Çalışma Zamanı'nı emüle eden SDK Çalışma Zamanı desteği olmayan cihazlar.SDK Çalışma Zamanı sağlayıcı kitaplığı (
androidx.privacysandbox.sdkruntime:sdkruntime-provider
) şunun için API sağlar: SDK Çalışma Zamanı istemci kitaplığından yüklemeye izin veren SDK'lar.
Bundletool ile SDK yayınlama
SDK Çalışma Zamanı desteği olan cihazlarda SDK'lar şu şekilde yayınlanır ve yüklenir: ayrı paketler.
Bundletool, SDK Çalışma Zamanı desteği olmayan platform sürümlerini desteklemek için uygulama APK grubunun, uygulamanın tüm SDK'larını içeren en az bir varyantını derleyin duruma göre değişir. Her SDK, ayrı bir APK bölümü olarak paketlenir. Ayrıca aşağıdaki dönüşümler de gerçekleştirilir:
- SDK bayt kodu (DEX) dosyalarını SDK'ya varlık olarak kopyalayın.
- SDK Java kaynaklarını öğe olarak ayrılmış SDK'ya kopyalayın.
- SDK kaynaklarını yeniden eşleyin ve uygulama kaynaklarıyla birleştirin.
- SDK Çalışma Zamanı istemci kitaplığı için yapılandırma oluşturun.
SDK'ları SDK Çalışma Zamanı istemci kitaplığıyla yükleme
SDK Runtime istemci kitaplığı, platform API'lerine benzer API'ler sağlar ancak hem SDK Runtime ortamındaki SDK'ları hem de varyant uygulamasıyla birlikte paketlenen SDK'ları destekler.
SDK Çalışma Zamanı istemci kitaplığını kullanmak için androidx.privacysandbox.sdkruntime:sdkruntime-client
bağımlılığını ekleyin ve SdkSandboxManager
yerine SdkSandboxManagerCompat
kullanın.
Bir uygulama SDK yüklemeye çalıştığında kitaplık ilk olarak SDK'nın derleme sırasında uygulamayla birlikte paketlenip paketlenmediğini kontrol eder. Paket halindeyse kitaplık, SDK'yı SDK bölmesindeki SDK'dan çıkarır ve uygulama işlemine yükler. SDK uygulamayla paket halinde sunulan kitaplık, SDK'yı yüklemek için platform API'sine yetki verir.
Öğelerden SDK ayıklama
Bir uygulama paketlenmiş bir SDK yüklemeye çalıştığında SDK Çalışma Zamanı istemci kitaplığı, SDK'nın DEX dosyalarının cihaz depolama alanına (code_cache
) önceden ayıklanıp ayıklanmadığını kontrol eder ve ayıklanmadılarsa öğelerden ayıklanır.
Kitaplık, genellikle bir uygulama yüklendikten veya güncellendikten sonra dosyaları yalnızca bir kez ayıklar.
Kullanılabilir depolama alanı, izin verilen eşikten düşükse (şu anda DEX dosyaları çıkarılmazsa kitaplık, SDK'yı yüklemeye çalışır. doğrudan desteklenen cihazlardaki öğelerden (API 27+). Bu, daha büyük bir ayak izidir.
SDK sınıfları için Classloader
SDK'lar ile uygulama sınıfları arasında çakışmaları önlemek için tüm SDK sınıfları, ana uygulama sınıf yükleyicisinden tamamen bağımsız ayrı bir sınıf yükleyici kullanılarak yüklenir.
Mevcut SDK Çalışma Zamanı tasarımında, uygulama ile SDK'lar arasındaki tüm iletişimler Binder IPC çağrıları kullanılarak gerçekleşir. Paketlenmiş SDK'lar için aynı SDK Binder nesneleri kullanılır ve Binder işlemi serileştirmesi, uygulama geliştiricilerin SDK Binder nesnelerini uygulama tarafındaki SDK Binder arayüzlerine yayınlamasına olanak tanır.
Diğer dahili etkileşimler için (ör. bir SDK'yı başlatma, denetleyici API'si vb.) kullanıyorsanız kitaplık, Yansıma ve Farklı classloader'larda çalışmak için Dinamik Proxy'ler.
SDK ortamı
SDKRuntime Sağlayıcı kitaplığı, SDK geliştiricilerine API'ler sağlar. Bu API'ler platform API'lerine benzer ancak SDK'ların hem SDK Runtime ortamı hem de SDKRuntime istemci kitaplığı tarafından yüklenmesine olanak tanır.
Kitaplık SDK'sını kullanabilmek için
androidx.privacysandbox.sdkruntime:sdkruntime-provider
bağımlılık ve genişletme
SandboxedSdkProvider
yerine SandboxedSdkProviderCompat
.
Şunları yapmak için SDK sağlayıcı olarak SandboxedSdkProviderAdapter
kullanmanız gerekir:
uyumlu sağlayıcının SDK Çalışma Zamanı ortamına yüklenmesine izin ver.
SDK şu durumda platform API'sine SdkSandboxControllerCompat
yetki verir:
SDK Çalışma Zamanı'nda yüklendiğinde veya
SDK, paket halinde sunulan bir SDK olarak yüklenmiştir.
Paketlenmiş SDK'lar için kitaplık, SDK ortamını SDK Çalışma Zamanı ortamına benzer davranışları taklit edecek şekilde değiştirir.
Sonraki bölümlerde, SDK'nın SDKRuntime istemci kitaplığı tarafından yüklenmesi durumunda beklenen davranışlar açıklanmaktadır.
SDK Kaynakları
SDK kaynakları (res/), uygulama işleminde SDK yüklendiğinde desteklenir. Bundletool, tüm SDK'ların kaynaklarını uygulama kaynaklarıyla birleştirir.
Çakışmaları önlemek için SDK kaynakları, tüm kaynak kimliklerindeki packageId
ön ekiyle yeniden eşlenir.
SDK, SDKRuntime istemci kitaplığı tarafından yüklendiğinde packageId
güncellenir
yeniden eşlenen kaynakların R sınıfını kullanarak ele alınmasına olanak tanıyacak.
Java kaynakları
Java kaynakları, SDK uygulama işleminde yüklendiğinde desteklenir. Bundletool, tüm SDK Java kaynaklarını uygulama öğelerindeki özel bir dizine kopyalar. SDKRuntime İstemci kitaplığı, tüm öğeleri yönlendirmek için ara bir sınıf yükleyici kullanır Yeni kök dizine Java kaynağıyla ilgili çağrılar.
SDK Öğeleri
SDK öğeleri, yeniden eşlenmeden uygulama öğeleriyle birleştirilir.
SDK Depolama Alanı
SDK Depolama'yı desteklemek için SDK Çalışma Zamanı istemci kitaplığı, uygulama depolama alanındaki her bir paketlenmiş SDK için özel bir kök dizin oluşturur ve bu dizini depolama kökü olarak kullanan özel bir bağlam sağlar.
Bu bağlam şuradan alınabilir:
SandboxedSdkProviderCompat#getContext
Depolama alanıyla ilgili desteklenen yöntemler:
getDataDir
getCacheDir
getCodeCacheDir
getNoBackupFilesDir
getDir
getFilesDir
openFileInput
openFileOutput
deleteFile
getFileStreamPath
fileList
getDatabasePath
openOrCreateDatabase
moveDatabaseFrom
(yalnızca SDK bağlamları arasında)deleteDatabase
databaseList
getSharedPreferences
moveSharedPreferencesFrom
(yalnızca SDK bağlamları arasında)deleteSharedPreferences
Cihaz korumalı bir depolama bağlamı, telefon araması yapılarak oluşturulabilir
Bu bağlamda createDeviceProtectedStorageContext()
.
SdkSandboxControllerCompat
SDKRuntime istemci kitaplığı, uygulama işlemine yüklenen paketlenmiş SDK'lar için SdkSandboxControllerCompat
uygulamasını sağlar.
İstemci kitaplığı API'leri desteklemiyorsa (örneğin, derlenmiş bir SDK ile uygulama sürümünden daha yeni bir kitaplık sürümüne sahip kullanıcılar) uygun bir yedek kullanılır (operasyon yok veya istisna).
Sürüm oluşturma
SDKRuntime istemci kitaplığı, paketlenmiş bir SDK yüklediğinde SDK'daki SDKRuntime sağlayıcı kitaplığıyla el sıkışma işlemi gerçekleştirir. El sıkışma sırasında kitaplıklar sürümlerini değiştirir ve davranışı, mevcut olmayanların yerine kullanılacak şekilde ayarlar En uygun yedeğe sahip API'ler (operasyonsuz veya istisna).
Kitaplığın en son sürümünü kullanmak hem uygulama hem de SDK geliştiricileri için önemle tavsiye edilir. Aksi takdirde, her iki tarafta da destek gerektiren işlevler kullanılamayabilir.
SDKRuntime Client kitaplığının herhangi bir sürümü, sürümünü kullanabilirsiniz.
Gelecekte bu ayar minimum istemci kitaplığı sürümüne geçirilecek SDK'yı sağlayıcı kitaplığının belirli bir sürümüyle yüklemek için gereklidir.
Bu, parçalanmayı en aza indirir ve çoğu API'nin paket halinde sunulan SDK başarıyla yüklenirse desteklenir.
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- SDK Çalışma Zamanı
- SDK Runtime geliştirici kılavuzu
- sdkruntime referansı