Zgodność wsteczna środowiska wykonawczego SDK

W tym dokumencie przedstawiamy nową bibliotekę Jetpack, która pomoże deweloperom w migracji do Środowisko wykonawcze SDK. Dokument ten wyjaśnia, jak środowisko wykonawcze SDK będzie obsługiwane w poprzednich wersjach platformy Android (od kompilacji do wykonania) oraz jakie różnice i ograniczenia w środowisku wykonawczym mogą się pojawić. Ta biblioteka umożliwia deweloperom tworzenie jednej wersji aplikacji lub pakietu SDK, która może działać na urządzeniach z wsparciem środowiska wykonawczego pakietu SDK lub bez niego.

Zgodność wsteczną zapewniają te komponenty:

  • Wtyczka Android do obsługi Gradle (AGP) + Bundletool tworzy wariant aplikacji dla na urządzeniach, które nie obsługują środowiska wykonawczego SDK, dodając środowisko wykonawcze SDK do pliku APK.

  • Biblioteka klienta środowiska wykonawczego SDK (androidx.privacysandbox.sdkruntime:sdkruntime-client) wczytuje pakiet Pakiet SDK pochodzi z komponentów z linkiem do aplikacji i emuluje środowisko wykonawcze SDK na urządzeniach, które nie obsługują środowiska wykonawczego SDK.

  • Biblioteka dostawcy środowiska wykonawczego SDK (androidx.privacysandbox.sdkruntime:sdkruntime-provider) udostępnia interfejs API do Pakiety SDK umożliwiające wczytywanie z biblioteki środowiska wykonawczego SDK.

Dostarczanie pakietów SDK za pomocą narzędzia Bundletool

Na urządzeniach z obsługą środowiska wykonawczego pakietu SDK będą one dostarczane i instalowane jako osobne pakiety.

Aby zapewnić obsługę wersji platformy, które nie obsługują środowiska wykonawczego SDK, pakiet SDK utworzyć co najmniej jeden wariant zestawu plików APK aplikacji, który zawiera wszystkie pakiety SDK aplikacji. zależy od tego, Każdy pakiet SDK jest częścią osobnego pakietu APK. Ponadto wykonywane są te przekształcenia:

  1. Skopiuj pliki bajtowe (DEX) pakietu SDK do pakietu SDK jako zasoby.
  2. Skopiuj do pakietu SDK zasoby Javy z pakietu SDK podzielone jako zasoby.
  3. Przemapuj zasoby pakietu SDK i połącz je z zasobami aplikacji.
  4. Wygeneruj konfiguracje biblioteki klienta środowiska wykonawczego SDK.

Wczytywanie pakietów SDK za pomocą biblioteki klienta środowiska wykonawczego SDK

Biblioteka klienta środowiska wykonawczego SDK udostępnia interfejsy API podobne do interfejsów API platformy, ale obsługują zarówno pakiety SDK w środowisku wykonawczym SDK, jak i pakiety SDK zawarte w pakiecie wariantu aplikacji.

Aby używać biblioteki klienta środowiska wykonawczego SDK, dodaj zależność androidx.privacysandbox.sdkruntime:sdkruntime-client i użyj SdkSandboxManagerCompat zamiast SdkSandboxManager.

Gdy aplikacja próbuje wczytać pakiet SDK, biblioteka najpierw sprawdza, czy dołączanych do aplikacji podczas kompilacji. Jeśli był on pakietowany, biblioteka wyodrębnia Pakiet SDK z pakietu SDK został podzielony i wczytywany w procesie aplikacji. Jeśli pakiet SDK nie został załączony do aplikacji, biblioteka deleguje interfejs API platformy do wczytania pakietu SDK.

Wyodrębnianie pakietu SDK z komponentów

Gdy aplikacja próbuje wczytać pakiet SDK, biblioteka klienta środowiska wykonawczego SDK sprawdza, jeśli pliki DEX pakietu SDK zostały już rozpakowane do pamięci urządzenia (code_cache), a w razie potrzeby – wyodrębnia je z zasobów.

Biblioteka zwykle wyodrębni pliki tylko raz po zainstalowaniu lub zaktualizowaniu aplikacji.

Jeśli dostępne miejsce na dane jest mniejsze niż dozwolony próg (obecnie 100 MB) i nie wyodrębniono żadnych plików DEX, biblioteka próbuje załadować pakiet SDK bezpośrednio z zasobów na obsługiwanych urządzeniach (API 27 lub nowszy). Spowoduje to większe obciążenie pamięci.

Moduł pobierania klas pakietu SDK

Aby uniknąć konfliktów między pakietami SDK a klasami aplikacji, wszystkie klasy pakietu SDK są ładowane za pomocą osobnego ładowacza klas, który jest całkowicie niezależny od ładowacza głównego.

W obecnej wersji środowiska wykonawczego pakietu SDK cała komunikacja między aplikacją a pakietami SDK odbywa się za pomocą wywołań interfejsu Binder IPC. W pakietach są używane te same obiekty Binder SDK Pakiety SDK oraz serializacja transakcji Binder pozwalają deweloperom aplikacji na przesyłanie pakietów SDK Powiąż obiekty z interfejsami powiązań SDK po stronie aplikacji.

W przypadku innych interakcji wewnętrznych (takich jak inicjowanie pakietu SDK, udostępnienie polecenia interfejsu API kontrolera do pakietu SDK itd.), biblioteka używa Reflection Dynamiczne serwery proxy działają z różnymi modułami ładującymi.

Środowisko pakietu SDK

Biblioteka SDKRuntime Provider udostępnia interfejsy API deweloperom pakietów SDK. Te interfejsy API są podobne do interfejsów API platformy, ale umożliwiają wczytywanie pakietów SDK zarówno przez środowisko SDK Runtime, jak i bibliotekę klienta SDKRuntime.

Aby móc używać pakietu SDK biblioteki, musisz dodać zależność androidx.privacysandbox.sdkruntime:sdkruntime-provider i rozszerzyć klasę SandboxedSdkProviderCompat zamiast SandboxedSdkProvider.

Musisz też użyć pakietu SDK SandboxedSdkProviderAdapter jako dostawcy, umożliwiają ładowanie dostawcy kompatybilnego w środowisku wykonawczym SDK.

SdkSandboxControllerCompat przekazuje wywołania do interfejsu API platformy, gdy pakiet SDK jest wczytany w czasie działania pakietu SDK, lub przekazuje wywołania do biblioteki klienta SDKRuntime, gdy pakiet SDK jest wczytany jako pakiet SDK w pakiecie.

W przypadku pakietów SDK biblioteka modyfikuje środowisko SDK w sposób, który emuluje działanie środowiska wykonawczego SDK.

W następnych sekcjach opisano oczekiwane działanie, gdy pakiet SDK jest ładowany przez bibliotekę klienta SDKRuntime.

Zasoby SDK

Zasoby pakietu SDK (res/) są obsługiwane, gdy pakiet SDK jest wczytywany w procesie aplikacji. Narzędzie bundletool scala wszystkie zasoby pakietu SDK z zasobami aplikacji.

Aby uniknąć konfliktów, zasoby pakietu SDK są ponownie mapowane przez zmianę prefiksu packageId we wszystkich identyfikatorach zasobów.

Gdy pakiet SDK zostanie wczytany przez bibliotekę klienta SDKRuntime, plik packageId zostanie zaktualizowany w środowisku wykonawczym, co umożliwia adresowanie ponownie przypisanych zasobów za pomocą klasy R.

Zasoby dotyczące Javy

Zasoby Java są obsługiwane, gdy pakiet SDK jest ładowany w ramach procesu aplikacji. Pakiet narzędzi kopiuje wszystkie zasoby pakietu SDK w Javie do specjalnego katalogu w zasobach z linkiem do aplikacji. Biblioteka klienta SDKRuntime używa pośredniego ładowarki klas, aby przekierowywać wszystkie wywołania związane z zasobami Javy do nowego katalogu /root.

Komponenty SDK

Zasoby pakietu SDK są scalane z zasobami aplikacji bez konieczności ich ponownego mapowania.

Pamięć masowa pakietu SDK

Aby obsługiwać pamięć masową SDK, biblioteka klienta środowiska wykonawczego SDK tworzy w pamięci aplikacji osobny katalog główny dla każdego dołączonego pakietu SDK i zapewnia specjalny kontekst, który używa tego katalogu jako głównego katalogu pamięci masowej.

Ten kontekst można pobrać z SandboxedSdkProviderCompat#getContext.

Obsługiwane metody związane z miejscem na dane:

  • getDataDir
  • getCacheDir
  • getCodeCacheDir
  • getNoBackupFilesDir
  • getDir
  • getFilesDir
  • openFileInput
  • openFileOutput
  • deleteFile
  • getFileStreamPath
  • fileList
  • getDatabasePath
  • openOrCreateDatabase
  • moveDatabaseFrom – tylko między kontekstami pakietu SDK
  • deleteDatabase
  • databaseList
  • getSharedPreferences
  • moveSharedPreferencesFrom – tylko między kontekstami pakietu SDK
  • deleteSharedPreferences

Kontekst pamięci chronionej urządzenia można utworzyć, wywołując createDeviceProtectedStorageContext() w tym kontekście.

SdkSandboxControllerCompat

Biblioteka klienta SDKRuntime udostępnia SdkSandboxControllerCompat do pakietów SDK wczytywanych w procesie aplikacji.

Jeśli interfejsy API nie są obsługiwane przez bibliotekę klienta (np. w przypadku pakietu SDK skompilowanego z wersją biblioteki nowszą niż wersja aplikacji), zostanie użyte najbardziej odpowiednie rozwiązanie zastępcze (operacja bezczynna lub wyjątek).

Obsługa wersji

Gdy biblioteka klienta SDKRuntime wczytuje pakiet SDK, nawiązuje połączenie z biblioteką dostawcy SDKRuntime w pakiecie SDK. Podczas nawiązywania połączenia biblioteki wymieniają się wersjami i dostosowują swoje działanie, aby zastąpić niedostępne interfejsy API odpowiednim rozwiązaniem zastępczym (brak działania lub wyjątek).

W przypadku obu aplikacji zdecydowanie zalecamy korzystanie z najnowszej wersji biblioteki. i deweloperów pakietów SDK. Poza tym funkcje, które wymagają obsługi w obu częściach mogą być niedostępne.

Dowolna wersja biblioteki klienta SDKRuntime może wczytywać pakiet SDK z dowolnym biblioteki SDKRuntime Provider i na odwrót.

W przyszłości zostanie ona zmieniona na minimalną wersję biblioteki klienta wymagane do wczytania pakietu SDK konkretnej wersji biblioteki dostawcy.

Pozwoli to zminimalizować fragmentaryzację i zapewnić obsługę większości interfejsów API, jeśli pakiet SDK zostanie prawidłowo załadowany.

.