SDK Çalışma Zamanı için geriye dönük uyumluluk

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:

  1. SDK bayt kodu (DEX) dosyalarını öğe olarak SDK bölmesine kopyalayın.
  2. SDK Java kaynaklarını SDK bölmesine öğe olarak kopyalayın.
  3. SDK kaynaklarını yeniden eşleyip uygulama kaynaklarıyla birleştirin.
  4. 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ında
  • deleteDatabase
  • databaseList
  • getSharedPreferences
  • moveSharedPreferencesFrom - yalnızca SDK bağlamları arasında
  • deleteSharedPreferences

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.