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

Bu belgede, geliştiricilerin SDK Çalışma Zamanı'na geçişine yardımcı olacak yeni bir Jetpack kitaplığı önerilmektedir. SDK Çalışma Zamanı'nın önceki Android platform sürümlerinde (derlemeden yürütmeye kadar) nasıl destekleneceği ve çalışma zamanı ortamında geliştiricilerin 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 ya da olmayan cihazlarda çalışabilen tek bir sürümünü oluşturması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 Runtime'ı APK'ya paketleyerek SDK Runtime desteği olmayan cihazlar için bir uygulama varyantı oluşturur.

  • SDK Runtime istemci kitaplığı (androidx.privacysandbox.sdkruntime:sdkruntime-client), paketlenmiş SDK'yı uygulama öğelerinden yükler ve SDK Runtime'ı, SDK Runtime desteği olmayan cihazlarda taklit eder.

  • SDK Runtime sağlayıcı kitaplığı (androidx.privacysandbox.sdkruntime:sdkruntime-provider), SDK'ların SDK Runtime istemci kitaplığından yüklenmesine olanak tanıyan bir API sağlar.

Bundletool ile SDK teslimi

SDK Çalışma Zamanı desteği olan cihazlarda SDK'lar ayrı paketler olarak yayınlanır ve yüklenir.

Bundletool, SDK Runtime desteği olmayan platform sürümlerini desteklemek için uygulamanın bağlı olduğu tüm SDK'ları içeren bir veya daha fazla uygulama APK'sı grubu varyantı oluşturur. Her SDK ayrı bir APK paketi olarak sunulur. Ayrıca aşağıdaki dönüşümler gerçekleştirilir:

  1. SDK bayt kodu (DEX) dosyalarını varlık olarak SDK bölmesine kopyalayın.
  2. SDK Java kaynaklarını, SDK bölümüne öğe olarak kopyalayın.
  3. SDK kaynaklarını yeniden eşleyin ve uygulama kaynaklarıyla birleştirin.
  4. SDK Çalışma Zamanı istemci kitaplığı için yapılandırmalar 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 gelen SDK'ları destekler.

SDK Çalışma Zamanı istemci kitaplığını kullanmak için bağımlılığı androidx.privacysandbox.sdkruntime:sdkruntime-client ekleyin ve SdkSandboxManager yerine SdkSandboxManagerCompat kullanın.

Bir uygulama SDK yüklemeye çalıştığında kitaplık, öncelikle SDK'nın derleme sırasında uygulamayla birlikte paketlenip paketlenmediğini kontrol eder. Kitaplık, paketlenmişse SDK'yı SDK bölümünden çıkarır ve uygulama sürecine yükler. SDK uygulamayla birlikte paketlenmemişse kitaplık, SDK'yı yüklemek için platform API'sini temsilci olarak kullanır.

Öğelerden SDK çıkarma

Bir uygulama paketlenmiş bir SDK'yı yüklemeye çalıştığında SDK Çalışma Zamanı istemci kitaplığı, SDK'nın DEX dosyalarının cihaz depolama alanına zaten çıkarılıp çıkarılmadığını (code_cache) kontrol eder. Çıkarılmamışsa bu dosyaları varlıklardan çı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şikten (şu anda 100 MB) daha azsa ve DEX dosyaları ayıklanmamışsa kitaplık, SDK'yı doğrudan desteklenen cihazlardaki (API 27+) öğelerden yüklemeye çalışır. Bu durum, daha büyük bir bellek ayak izine neden olur.

SDK sınıfları için sınıf yükleyici

SDK'lar ve uygulama sınıfları arasındaki ç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, bir uygulama ile SDK'lar arasındaki tüm iletişimler Binder IPC çağrıları kullanılarak gerçekleştirilir. Paketlenmiş SDK'lar için aynı SDK Binder nesneleri kullanılır ve Binder işlem serileştirme, uygulama geliştiricilerin uygulama tarafında SDK Binder nesnelerini SDK Binder arayüzlerine yayınlamasına olanak tanır.

Kitaplık, diğer dahili etkileşimler (ör. SDK başlatma, SDK'ya denetleyici API sağlama vb.) için farklı sınıf yükleyicilerde çalışmak üzere yansıtma ve dinamik proxy'ler 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 olanak tanır.

Kitaplık SDK'sını kullanabilmek için androidx.privacysandbox.sdkruntime:sdkruntime-provider bağımlılığını eklemeniz ve SandboxedSdkProvider yerine SandboxedSdkProviderCompat'yi genişletmeniz gerekir.

Ayrıca, uyumluluk sağlayıcının SDK çalışma zamanı ortamında yüklenmesine izin vermek için SDK sağlayıcı olarak SandboxedSdkProviderAdapter kullanmanız gerekir.

SdkSandboxControllerCompat, SDK, SDK çalışma zamanına yüklendiğinde platform API'sine veya SDK, paketlenmiş bir SDK olarak yüklendiğinde SDKRuntime Client kitaplığına temsilci olarak atanır.

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, SDKRuntime İstemci kitaplığı tarafından SDK yüklendiğinde beklenen davranışlar açıklanmaktadır.

SDK Kaynakları

SDK kaynakları (res/), SDK uygulama sürecine 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 öneki değiştirilerek yeniden eşlenir.

SDK, SDKRuntime İstemci Kitaplığı tarafından yüklendiğinde, packageId, R sınıfı kullanılarak yeniden eşlenen kaynakların adreslenmesine izin vermek için çalışma zamanında güncellenir.

Java kaynakları

SDK, uygulama sürecine yüklendiğinde Java kaynakları desteklenir. Bundletool, tüm SDK Java kaynaklarını uygulama öğelerindeki özel bir dizine kopyalar. SDKRuntime istemci kitaplığı, Java kaynağıyla ilgili tüm çağrıları yeni kök dizine yönlendirmek için ara bir sınıf yükleyici kullanır.

SDK Öğeleri

SDK öğeleri, yeniden eşleme yapılmadan uygulama öğeleriyle birleştirilir.

SDK Depolama Alanı

SDK Depolama'yı desteklemek için SDK Çalışma Zamanı İstemci kitaplığı, uygulama depolama alanında paketlenmiş her 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.

Depolamayla 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

Bu bağlamda createDeviceProtectedStorageContext() çağrısı yapılarak cihazda korunan bir depolama bağlamı oluşturulabilir.

SdkSandboxControllerCompat

SDKRuntime Client kitaplığı, uygulama sürecinde yüklenen paketlenmiş SDK'lar için SdkSandboxControllerCompat uygulaması sağlar.

API'ler istemci kitaplığı tarafından desteklenmiyorsa (ör. 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şlem yok veya istisna).

Sürüm oluşturma

SDKRuntime Client kitaplığı, paketlenmiş bir SDK'yı yüklediğinde SDK içindeki SDKRuntime Provider 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 kullanılamayan API'leri en uygun yedekle (no-op veya istisna) değiştirmek için davranışlarını ayarlar.

Kitaplığın en son sürümünü kullanmanız 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 İstemci kitaplığının herhangi bir sürümü, SDKRuntime Sağlayıcı kitaplığının herhangi bir sürümüne sahip bir SDK'yı yükleyebilir ve bunun tersi de geçerlidir.

Gelecekte bu, SDK'yı belirli bir sağlayıcı kitaplığı sürümüyle yüklemek için gereken minimum istemci kitaplığı sürümü olarak değiştirilecektir.

Bu sayede parçalanma en aza indirilir ve paketlenmiş SDK başarıyla yüklendiyse çoğu API'nin desteklenmesi sağlanır.