Bu dokümanda, geliştiricilerin SDK Çalışma Zamanı'na geçiş yapmasına yardımcı olacak yeni bir Jetpack kitaplığı önerilmektedir. Bu kılavuzda, SDK Çalışma Zamanı'nın önceki Android platformu sürümlerinde (derlemeden yürütmeye kadar) nasıl destekleneceği ve geliştiricilerin çalışma zamanı ortamında ne tür farklılıklar ya da sınırlamalar bekleyebilecekleri açıklanmaktadır. Bu kitaplık, geliştiricilerin SDK Çalışma Zamanı desteği olan veya olmayan cihazlarda çalıştırabilme özelliği içeren tek bir uygulama veya SDK sürümü oluşturmalarına olanak tanır.
Geriye dönük uyumluluk, aşağıdaki bileşenler aracılığıyla sağlanır:
Android Gradle Eklentisi (AGP) + Bundletool, SDK Çalışma Zamanı'nı APK'ya paketleyerek SDK Çalışma Zamanı desteği bulunmayan cihazlar için uygulama varyantı oluşturur.
SDK Çalışma Zamanı istemci kitaplığı (
androidx.privacysandbox.sdkruntime:sdkruntime-client
), uygulama öğelerinden paket hâlinde sunulan SDK'yı yükler ve SDK Çalışma Zamanı desteği bulunmayan cihazlarda SDK Çalışma Zamanı'nı emüle eder.SDK Çalışma Zamanı sağlayıcı kitaplığı (
androidx.privacysandbox.sdkruntime:sdkruntime-provider
), SDK Çalışma Zamanı istemci kitaplığından yüklemeye izin vermek üzere SDK'lar için bir API sağlar.
Bundletool ile SDK yayınlama
SDK Çalışma Zamanı desteği bulunan cihazlarda SDK'lar ayrı paketler olarak yayınlanır ve yüklenir.
SDK Çalışma Zamanı desteği sunmayan platform sürümlerini desteklemek için Bundletool, uygulamanın bağımlı olduğu tüm SDK'ları içeren uygulama APK grubunun bir veya daha fazla varyantını oluşturur. Her SDK ayrı bir APK bölümü olarak paketlenir. Ayrıca aşağıdaki dönüşümler gerçekleştirilir:
- SDK bayt kodu (DEX) dosyalarını öğe olarak SDK bölmesine kopyalayın.
- SDK Java kaynaklarını SDK bölmesine öğe olarak kopyalayın.
- SDK kaynaklarını yeniden eşleyip uygulama kaynaklarıyla birleştirin.
- SDK Çalışma Zamanı istemci kitaplığı için yapılandırmalar oluşturun.
SDK Çalışma Zamanı istemci kitaplığıyla SDK'ları yükleme
SDK Çalışma Zamanı istemci kitaplığı, platform API'lerine benzer API'ler sağlar ancak hem SDK Çalışma Zamanı ortamındaki SDK'ları hem de varyantla 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 paketlenip paketlenmediğini kontrol eder. Paketlenmişse kitaplık, SDK'yı SDK bölümünden çıkarıp uygulama işlemine yükler. SDK, uygulamayla birlikte paketlenmemişse kitaplık, SDK'yı yüklemesi için platform API'ye yetki verir.
Öğelerden SDK çıkarma
Bir uygulama paket halinde sunulan bir SDK'yı yüklemeye çalıştığında SDK Çalışma Zamanı istemci kitaplığı, SDK'nın DEX dosyalarının önceden cihaz depolama alanına (code_cache
) çıkarılıp çıkarılmadığını kontrol eder. Çıkarılmamışsa bunları öğelerden çıkarır.
Kitaplık, normalde bir uygulama yükleme veya güncelleme işleminden sonra dosyaları yalnızca bir kez çıkarır.
Kullanılabilir depolama alanı, izin verilen eşiğin altındaysa (şu anda 100 MB) ve hiçbir DEX dosyası çıkarılmazsa kitaplık, SDK'yı doğrudan desteklenen cihazlardaki öğelerden (API 27+) yüklemeye çalışır. Bu durum bellekte daha büyük bir ayak izine neden olur.
SDK sınıfları için Classloader
SDK'lar ve uygulama sınıfları arasında çakışma olmasını önlemek için tüm SDK sınıfları, ana uygulama classloader'ından tamamen bağımsız olarak ayrı bir classloader kullanılarak yüklenir.
Mevcut SDK Çalışma Zamanı tasarımında, bir uygulama ile SDK'lar arasındaki tüm iletişimler Bağlayıcı IPC çağrıları kullanılarak gerçekleşir. Paket hâlinde sunulan SDK'lar için aynı SDK Bağlayıcı nesneleri kullanılır ve Bağlayıcı işlemi serileştirme, uygulama geliştiricilerin SDK Bağlayıcı nesnelerini uygulama tarafındaki SDK Bağlayıcı Arayüzlerine yayınlamasına olanak tanır.
Diğer dahili etkileşimlerde (ör. SDK'yı başlatma, SDK'ya denetleyici API sağlama vb.) kitaplık, farklı sınıf yükleyiciler arasında çalışmak için Yansıtma ve Dinamik Proxy'leri kullanır.
SDK ortamı
SDKRuntime Provider kitaplığı, SDK geliştiricilerine API'ler sağlar. Bu API'ler platform API'lerine benzer ancak SDK'ların hem SDK Çalışma Zamanı ortamı hem de SDKRuntime İstemci kitaplığı tarafından yüklenmesine imkan tanır.
Kitaplık SDK'sını kullanabilmek için androidx.privacysandbox.sdkruntime:sdkruntime-provider
bağımlılığını eklemeniz ve SandboxedSdkProvider
yerine SandboxedSdkProviderCompat
öğesini genişletmeniz gerekir.
Uyumlu sağlayıcının SDK Çalışma Zamanı ortamına yüklenmesini sağlamak için SDK sağlayıcı olarak SandboxedSdkProviderAdapter
kullanmanız da gerekir.
SdkSandboxControllerCompat
, SDK Çalışma Zamanı'na yüklendiğinde platform API'ye veya SDK paket halinde sunulan bir SDK olarak yüklendiğinde SDKRuntime İstemci kitaplığına yetki verir.
Kitaplık, paket halinde sunulan SDK'lar için SDK ortamını, SDK Çalışma Zamanı ortamına benzer davranışlar sergileyecek şekilde değiştirir.
Sonraki bölümlerde, SDK SDKRuntime İstemci kitaplığı tarafından yüklendiğinde beklenen davranışlar açıklanmaktadır.
SDK Kaynakları
SDK Kaynakları (res/), SDK uygulama işlemine yüklendiğinde desteklenir. Bundletool, tüm SDK'ların kaynaklarını uygulama kaynaklarıyla birleştirir.
Çakışmaları önlemek için tüm kaynak kimliklerinde packageId
öneki değiştirilerek SDK kaynakları yeniden eşlenir.
SDK, SDKRuntime İstemci kitaplığı tarafından yüklendiğinde, R sınıfı kullanılarak yeniden eşlenen kaynakların ele alınmasına olanak tanımak için packageId
, çalışma zamanında güncellenir.
Java kaynakları
SDK, uygulama işlemine yüklenirken Java kaynakları desteklenir. Bundletool, tüm SDK Java kaynaklarını uygulama öğelerindeki özel bir dizine kopyalar. SDKRuntime İstemci kitaplığı, Java kaynağıyla ilgili tüm çağrıları yeni kök dizine yönlendirmek için ara bir classloader kullanır.
SDK Öğeleri
SDK öğeleri, yeniden eşleme yapılmadan uygulama öğeleriyle birleştirilir.
SDK Depolama Alanı
SDK Çalışma Zamanı İstemci kitaplığı, SDK Depolama'yı desteklemek amacıyla uygulama depolama alanındaki her paket 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 SandboxedSdkProviderCompat#getContext
adresinden alınabilir.
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ındadeleteDatabase
databaseList
getSharedPreferences
moveSharedPreferencesFrom
- yalnızca SDK bağlamları arasındadeleteSharedPreferences
Cihaz korumalı depolama bağlamı, bu bağlamda createDeviceProtectedStorageContext()
çağrısı yapılarak oluşturulabilir.
SdkSandboxControllerCompat
SDKRuntime İstemci kitaplığı, uygulama işleminde yüklenen paketlenmiş SDK'lara SdkSandboxControllerCompat
uygulamasını sağlar.
İstemci kitaplığı API'leri desteklemiyorsa (örneğin, kitaplığın uygulama sürümünden daha yeni bir sürümüyle oluşturulmuş bir SDK ile) en uygun yedek kullanılır (işlemsiz veya istisnai olmayan).
Sürüm Oluşturma
SDKRuntime İstemci kitaplığı, paket halinde sunulan bir SDK'yı yüklediğinde SDK içindeki SDKRuntime Provider kitaplığıyla el sıkışma gerçekleştirir. El sıkışma sırasında kitaplıklar kendi sürümlerini değiştirir ve kullanılamayan API'leri en uygun yedekle (işlemsiz veya istisnai) değiştirecek şekilde davranışları ayarlar.
Hem uygulama hem de SDK geliştiricilerinin kitaplığın en son sürümünü kullanmanız önemle tavsiye edilir. Aksi takdirde her iki bölümde de destek gerektiren işlevler mevcut olmayabilir.
SDKRuntime İstemci kitaplığının herhangi bir sürümü, SDKRuntime Provider kitaplığının herhangi bir sürümüyle SDK'yı yükleyebilir.
Gelecekte bu sürüm, SDK'yı sağlayıcı kitaplığının belirli bir sürümüyle yüklemek için gereken minimum istemci kitaplığı sürümüyle değiştirilecek.
Böylece, parçalanma en aza indirilir ve paket hâlinde sunulan SDK başarıyla yüklendiğinde çoğu API'nin desteklenmesi sağlanır.
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken gösterilir
- SDK Çalışma Zamanı
- SDK Çalışma Zamanı geliştirici kılavuzu
- sdkruntime referansı