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

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:

  1. SDK bayt kodu (DEX) dosyalarını SDK'ya varlık olarak kopyalayın.
  2. SDK Java kaynaklarını öğe olarak ayrılmış SDK'ya 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ı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 SdkSandboxControllerCompatuygulaması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.

ziyaret edin.