Omówienie Play Feature Delivery

Model udostępniania aplikacji w Google Play wykorzystuje pakiety aplikacji na Androida, aby generować i udostępniać zoptymalizowane pliki APK dostosowane do konfiguracji urządzenia każdego użytkownika. Pobierają oni tylko kod i zasoby, których potrzebują do uruchomienia Twojej aplikacji.

Funkcja Play Feature Delivery korzysta z zaawansowanych możliwości pakietów aplikacji, umożliwiając warunkowe lub pobieranie niektórych funkcji aplikacji. Aby to zrobić, musisz najpierw podzielić te funkcje od aplikacji podstawowej na moduły funkcji.

Konfiguracja kompilacji modułu funkcji

Gdy tworzysz nowy moduł funkcji w Android Studio, IDE stosuje poniższą wtyczkę do Gradle do pliku build.gradle modułu.

// The following applies the dynamic-feature plugin to your feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your feature module.

plugins {
  id 'com.android.dynamic-feature'
}

Wiele właściwości dostępnych dla standardowej wtyczki aplikacji jest też dostępnych w module funkcji. W sekcjach poniżej opisujemy właściwości, które należy uwzględnić w konfiguracji kompilacji modułu funkcji, a czego nie.

Czego nie należy umieszczać w konfiguracji kompilacji modułu funkcji

Każdy moduł funkcji jest zależny od modułu podstawowego, dlatego dziedziczy też określone konfiguracje. Dlatego w pliku build.gradle modułu funkcji pomiń te wiersze:

  • Konfiguracje podpisywania: pakiety aplikacji są podpisane przy użyciu konfiguracji podpisywania określonych w module podstawowym.
  • Właściwość minifyEnabled: możesz włączyć zmniejszanie kodu w całym projekcie aplikacji tylko z poziomu konfiguracji kompilacji modułu podstawowego. Z tego względu należy pominąć tę właściwość w modułach funkcji. Możesz jednak określić dodatkowe reguły ProGuard dla każdego modułu funkcji.
  • versionCode i versionName: podczas tworzenia pakietu aplikacji Gradle korzysta z informacji o wersji aplikacji dostarczanych przez moduł podstawowy. Pomiń te właściwości w pliku build.gradle modułu funkcji.

Utwórz relację z modułem podstawowym

Gdy Android Studio tworzy moduł funkcji, staje się widoczny dla modułu podstawowego przez dodanie właściwości android.dynamicFeatures do pliku build.gradle modułu podstawowego, jak pokazano poniżej:

// In the base module’s build.gradle file.
android {
    ...
    // Specifies feature modules that have a dependency on
    // this base module.
    dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}

Dodatkowo Android Studio dołącza moduł podstawowy jako zależność modułu funkcji, jak pokazano poniżej:

// In the feature module’s build.gradle file:
...
dependencies {
    ...
    // Declares a dependency on the base module, ':app'.
    implementation project(':app')
}

Określ dodatkowe reguły ProGuard

Chociaż tylko konfiguracja kompilacji modułu podstawowego może umożliwić zmniejszanie kodu w projekcie aplikacji, możesz podać niestandardowe reguły ProGuard dla każdego modułu funkcji za pomocą właściwości proguardFiles, jak pokazano poniżej.

android.buildTypes {
     release {
         // You must use the following property to specify additional ProGuard
         // rules for feature modules.
         proguardFiles 'proguard-rules-dynamic-features.pro'
     }
}

Zwróć uwagę, że te reguły ProGuard są scalane z regułami z innych modułów (w tym modułu podstawowego) w czasie kompilacji. Mimo że każdy moduł funkcji może określać nowy zestaw reguł, reguły te mają zastosowanie do wszystkich modułów w projekcie aplikacji.

Wdrażanie aplikacji

Podczas tworzenia aplikacji z obsługą modułów funkcji możesz wdrożyć ją na połączonym urządzeniu w normalny sposób, wybierając na pasku menu Uruchom > Uruchom (lub klikając Uruchom na pasku narzędzi).

Jeśli projekt aplikacji zawiera co najmniej 1 moduł funkcji, możesz wybrać funkcje, które mają być uwzględnione podczas wdrażania aplikacji, zmieniając istniejącą konfigurację uruchamiania/debugowania w ten sposób:

  1. Na pasku menu kliknij Uruchom > Edytuj konfiguracje.
  2. W lewym panelu okna Konfiguracje uruchamiania/debugowania wybierz odpowiednią konfigurację aplikacji na Androida.
  3. W sekcji Funkcje dynamiczne do wdrożenia na karcie Ogólne zaznacz pole obok każdego modułu funkcji, który chcesz uwzględnić przy wdrażaniu aplikacji.
  4. Kliknij OK.

Domyślnie Android Studio nie wdraża aplikacji za pomocą pakietów aplikacji. Zamiast tego IDE kompiluje i instaluje na urządzeniu pliki APK zoptymalizowane pod kątem szybkości wdrażania, a nie rozmiar pliku APK. Aby skonfigurować w Android Studio kompilowanie i wdrażanie plików APK oraz aplikacji błyskawicznych z pakietu aplikacji, zmień konfigurację uruchamiania/debugowania.

Używanie modułów funkcji do niestandardowego przesyłania

Wyjątkową zaletą modułów funkcji jest możliwość dostosowania sposobu i czasu pobierania różnych funkcji aplikacji na urządzenia z Androidem 5.0 (poziom interfejsu API 21) lub nowszym. Aby na przykład zmniejszyć rozmiar aplikacji do początkowego pobierania, możesz skonfigurować niektóre funkcje tak, aby były pobierane w zależności od potrzeb lub tylko na urządzeniach, które obsługują określone możliwości, np. robienie zdjęć lub obsługę funkcji rzeczywistości rozszerzonej.

Przesyłanie aplikacji w formie pakietu aplikacji domyślnie zapewnia bardzo zoptymalizowane pobieranie, jednak bardziej zaawansowane i konfigurowalne opcje dostarczania funkcji wymagają dodatkowej konfiguracji i modularyzacji funkcji aplikacji za pomocą modułów funkcji. Oznacza to, że moduły funkcji to elementy składowe do tworzenia funkcji modułowych, które możesz skonfigurować do pobrania w razie potrzeby.

Rozważmy aplikację, która umożliwia użytkownikom kupno i sprzedaż towarów na platformie handlowej online. Możesz w sposób rozsądny połączyć każdą z tych funkcji aplikacji w osobne moduły:

  • Logowanie i tworzenie konta
  • Przeglądanie rynku
  • Wystawianie produktu na sprzedaż
  • Przetwarzanie płatności

W tabeli poniżej znajdziesz różne opcje przesyłania obsługiwane przez moduły i opis sposobu ich wykorzystania do optymalizacji rozmiaru początkowego pobierania przykładowej aplikacji z Marketplace.

Opcja dostawy Działanie Przykładowy przypadek użycia Wprowadzenie
Dostawa w czasie instalacji Moduły funkcji, które nie mają skonfigurowanej żadnej z opisanych powyżej opcji dostarczania, są domyślnie pobierane podczas instalowania aplikacji. Jest to ważne zachowanie, ponieważ oznacza, że zaawansowane opcje wyświetlania można wdrażać stopniowo. Możesz na przykład zastosować modularyzację funkcji aplikacji i włączyć wyświetlanie na żądanie dopiero po pełnym wdrożeniu pobierania na żądanie za pomocą biblioteki Play Feature Delivery.

Ponadto aplikacja może poprosić o odinstalowanie funkcji w późniejszym czasie. Jeśli więc podczas instalowania aplikacji potrzebujesz pewnych funkcji, a później nie, możesz zmniejszyć rozmiar instalacji, wysyłając prośbę o usunięcie ich z urządzenia.

Jeśli aplikacja prowadzi określone działania szkoleniowe, np. interaktywny przewodnik na temat kupowania i sprzedawania produktów w Marketplace, możesz domyślnie dodać tę funkcję do instalacji aplikacji.

Aby jednak zmniejszyć rozmiar zainstalowanej aplikacji, aplikacja może poprosić o usunięcie funkcji po zakończeniu trenowania użytkownika.

Dostosuj aplikację za pomocą modułów funkcji, które nie wymagają konfigurowania zaawansowanych opcji dostarczania.

Aby dowiedzieć się, jak zmniejszyć rozmiar zainstalowanej aplikacji przez usunięcie niektórych modułów funkcji, których użytkownik może już nie potrzebować, przeczytaj artykuł Zarządzanie zainstalowanymi modułami.

Dostawa na żądanie Zezwala aplikacji na żądanie i pobieranie modułów funkcji zależnie od potrzeb. Jeśli tylko 20% użytkowników aplikacji z Marketplace publikuje produkty na sprzedaż, dobrym rozwiązaniem dla większości użytkowników jest zmniejszenie początkowego rozmiaru pobieranych plików. Warto wprowadzić funkcje robienia zdjęć, w tym opis przedmiotu i udostępnianie go na sprzedaż jako produktu do pobrania na żądanie. Oznacza to, że możesz skonfigurować moduł funkcji sprzedaży aplikacji w taki sposób, aby pobierać go tylko wtedy, gdy użytkownik wykaże zainteresowanie sprzedażą produktów na platformie handlowej.

Dodatkowo, jeśli po pewnym czasie użytkownik przestanie sprzedawać produkty, aplikacja może zmniejszyć rozmiar zainstalowanej aplikacji, prosząc o odinstalowanie tej funkcji.

Utwórz moduł funkcji i skonfiguruj dostarczanie na żądanie. Aplikacja może następnie użyć biblioteki Play Feature Delivery, aby poprosić o pobranie modułu na żądanie.
Wyświetlanie warunkowe Umożliwia określenie pewnych wymagań dotyczących urządzenia użytkownika, takich jak funkcje sprzętowe, język i minimalny poziom interfejsu API, aby określić, czy funkcja modułowa jest pobierana podczas instalacji aplikacji. Jeśli aplikacja z Marketplace ma zasięg globalny, może być konieczna obsługa form płatności, które są popularne tylko w niektórych regionach lub lokalnie. Aby zmniejszyć początkowy rozmiar pobieranej aplikacji, możesz utworzyć osobne moduły funkcji do przetwarzania określonych form płatności i instalować je warunkowo na urządzeniu użytkownika w zależności od jego zarejestrowanego języka. Utwórz moduł funkcji i skonfiguruj dostarczanie warunkowe.
Natychmiastowa dostawa Aplikacja błyskawiczna w Google Play umożliwia użytkownikom interakcję z aplikacją bez konieczności instalowania jej na urządzeniu. Mogą ją jednak wypróbować, klikając przycisk „Wypróbuj” w Sklepie Google Play lub pod adresem URL, który utworzysz. Ta forma przesyłania treści ułatwia zwiększanie zaangażowania użytkowników w aplikację.

Błyskawiczne dostarczanie umożliwia korzystanie z aplikacji błyskawicznej w Google Play, dzięki czemu użytkownicy mogą natychmiast korzystać z określonych funkcji aplikacji bez jej instalowania.

Załóżmy, że masz grę, która zawiera kilka pierwszych poziomów gry w uproszczonym module. Możesz natychmiast włączyć ten moduł, aby użytkownicy mogli od razu rozpocząć grę, korzystając z linku URL lub przycisku „Wypróbuj” bez konieczności instalowania aplikacji. Utwórz moduł funkcji i skonfiguruj natychmiastowe dostarczanie. Aplikacja może następnie użyć biblioteki Play Feature Delivery, aby poprosić o pobranie modułu na żądanie.

Pamiętaj, że modularyzacja funkcji aplikacji za pomocą modułów funkcji to tylko pierwszy krok. Aby aplikacja błyskawiczna mogła działać w Google Play, rozmiar pobieranego modułu podstawowego aplikacji oraz danej funkcji obsługującej aplikacje błyskawiczne muszą spełniać rygorystyczne ograniczenia dotyczące rozmiaru. Więcej informacji znajdziesz w artykule Włączanie aplikacji błyskawicznych, zmniejszając rozmiar aplikacji lub gry.

Tworzenie identyfikatora URI zasobu

Jeśli chcesz uzyskać dostęp do zasobu zapisanego w module funkcji za pomocą identyfikatora URI, wykonaj te czynności, aby wygenerować identyfikator URI zasobu modułu funkcji za pomocą Uri.Builder():

Kotlin

val uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build()

Java

String uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build().toString();

Każda część ścieżki do zasobu jest tworzona w czasie wykonywania, dzięki czemu po wczytaniu podzielonych pakietów APK tworzona jest prawidłowa przestrzeń nazw.

Aby podać przykład generowania identyfikatora URI, załóżmy, że masz moduły aplikacji i funkcji o tych nazwach:

  • Nazwa pakietu aplikacji: com.example.my_app_package
  • Nazwa pakietu zasobów funkcji: com.example.my_app_package.my_dynamic_feature

Jeśli resId we fragmencie kodu powyżej odnosi się do zasobu surowego pliku o nazwie „my_video” w module funkcji, powyższy kod Uri.Builder() zwróci następujący komunikat:

android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video

Aplikacja może użyć tego identyfikatora URI, by uzyskać dostęp do zasobu modułu funkcji.

Aby zweryfikować ścieżki identyfikatora URI, możesz użyć Analizatora plików APK do sprawdzenia pliku APK modułu funkcji i określenia jego nazwy:

Zrzut ekranu pokazujący Analizatora plików APK sprawdzający zawartość skompilowanego pliku zasobów.

Rysunek 2. Użyj Analizatora plików APK do sprawdzenia nazwy pakietu w skompilowanym pliku zasobów.

Uwagi dotyczące modułów funkcji

Dzięki modułom funkcji możesz zwiększyć szybkość kompilacji i pracę nad rozwojem aplikacji, a także w znacznym stopniu dostosować sposób dostarczania funkcji aplikacji, aby zmniejszyć jej rozmiar. Podczas korzystania z modułów funkcji pamiętaj jednak o pewnych ograniczeniach i przypadkach skrajnych:

  • Instalacja co najmniej 50 modułów funkcji na 1 urządzeniu w ramach dostarczania warunkowego lub na żądanie może spowodować problemy z wydajnością. Moduły instalacyjne, które nie są skonfigurowane jako wymienne, są automatycznie umieszczane w module podstawowym i liczone jako 1 moduł funkcji na każdym urządzeniu.
  • Ogranicz do maksymalnie 10 modułów skonfigurowanych jako wymienne na potrzeby dostarczania w czasie instalacji. W przeciwnym razie czas pobierania i instalowania aplikacji może się wydłużyć.
  • Pobieranie i instalowanie funkcji na żądanie jest obsługiwane tylko na urządzeniach z Androidem 5.0 (poziom interfejsu API 21) lub nowszym. Aby udostępnić tę funkcję we wcześniejszych wersjach Androida, włącz Fusing podczas tworzenia modułu funkcji.
  • Włącz SplitCompat, aby aplikacja miała dostęp do pobranych modułów funkcji, które są dostarczane na żądanie.
  • Moduły funkcji nie powinny określać działań w pliku manifestu z wartością android:exported ustawioną na true. Dzieje się tak, ponieważ nie ma gwarancji, że urządzenie pobrało moduł funkcji, gdy inna aplikacja próbuje uruchomić działanie. Aplikacja powinna też sprawdzić, czy funkcja została pobrana, zanim spróbujesz uzyskać dostęp do jej kodu i zasobów. Więcej informacji znajdziesz w artykule Zarządzanie zainstalowanymi modułami.
  • Usługa Play Feature Delivery wymaga opublikowania aplikacji za pomocą pakietu aplikacji, dlatego pamiętaj o znanych problemach z takimi pakietami.

Dokumentacja w pliku manifestu modułu funkcji

Gdy tworzysz nowy moduł funkcji w Android Studio, IDE zawiera większość atrybutów manifestu, które są wymagane, aby moduł działał jak moduł funkcji. Dodatkowo niektóre atrybuty są wstrzykiwane przez system kompilacji podczas kompilacji, więc nie musisz ich określać ani modyfikować samodzielnie. W tabeli poniżej opisujemy atrybuty pliku manifestu, które są ważne przy korzystaniu z modułów funkcji.

Atrybut Opis
<manifest
...
To typowy blok <manifest>.
xmlns:dist="http://schemas.android.com/apk/distribution" Wskazuje nową przestrzeń nazw XML dist:, która została opisana poniżej.
split="split_name" Gdy Android Studio tworzy pakiet aplikacji, uwzględnia ten atrybut. Dlatego nie należy samodzielnie dodawać ani modyfikować tego atrybutu.

Definiuje nazwę modułu wskazywaną przez aplikację, gdy wysyłasz żądanie modułu na żądanie za pomocą biblioteki Play Feature Delivery.

Jak Gradle określa wartość tego atrybutu:

Gdy tworzysz moduł funkcji w Android Studio, IDE używa podanej przez Ciebie nazwy modułu do identyfikowania modułu jako podprojektu Gradle w pliku ustawień Gradle.

Gdy tworzysz pakiet aplikacji, Gradle używa ostatniego elementu ścieżki podprojektu, aby wstawić ten atrybut manifestu w pliku manifestu modułu. Jeśli na przykład utworzysz nowy moduł funkcji w katalogu MyAppProject/features/ i podasz „dynamic_feature1” jako nazwę modułu, IDE doda ':features:dynamic_feature1' jako podprojekt w pliku settings.gradle. Podczas tworzenia pakietu aplikacji Gradle, a następnie wstawia <manifest split="dynamic_feature1"> w pliku manifestu modułu.

android:isFeatureSplit="true | false"> Gdy Android Studio tworzy pakiet aplikacji, uwzględnia ten atrybut. Z tego względu nie należy dodawać ani modyfikować tego atrybutu ręcznie.

Określa, że ten moduł jest modułem funkcji. Pliki manifestu w plikach APK modułu podstawowego i plików APK konfiguracji pomijają ten atrybut lub ustawiają go na false.

<dist:module Ten nowy element XML definiuje atrybuty określające sposób pakowania i dystrybucji modułu jako plików APK.
dist:instant="true | false" Określa, czy moduł ma być dostępny w aplikacji błyskawicznej w Google Play jako aplikacja błyskawiczna.

Jeśli Twoja aplikacja zawiera co najmniej 1 moduł funkcji z obsługą wersji błyskawicznych, musisz też włączyć obsługę wersji błyskawicznej w module podstawowym. Jeśli używasz Androida Studio w wersji 3.5 lub nowszej, IDE robi to za Ciebie, gdy tworzysz moduł funkcji z obsługą wersji błyskawicznych.

Nie możesz ustawić tego elementu XML na true razem z ustawieniem <dist:on-demand/>. Nadal jednak możesz prosić o pliki do pobrania na żądanie modułów funkcji obsługujących aplikacje błyskawiczne jako aplikacje błyskawiczne za pomocą biblioteki Play Feature Delivery. Gdy użytkownik pobierze i zainstaluje Twoją aplikację, urządzenie domyślnie pobierze i zainstaluje jej moduły funkcji z obsługą aplikacji błyskawicznych oraz podstawowy plik APK.

dist:title="@string/feature_name" Określa tytuł modułu widoczny dla użytkowników. Urządzenie może na przykład wyświetlić ten tytuł, gdy poprosi o potwierdzenie pobrania.

Musisz umieścić zasób tekstowy dla tego tytułu w pliku module_root/src/source_set/res/values/strings.xml modułu podstawowego.

<dist:fusing dist:include="true | false" />
</dist:module>
Określa, czy moduł ma być uwzględniany w wielu plikach APK przeznaczonych na urządzenia z Androidem 4.4 (poziom interfejsu API 20) lub starszym.

Poza tym, jeśli używasz bundletool do generowania plików APK z pakietu aplikacji, w uniwersalnym pliku APK, czyli monolitycznym pliku APK, który jest monolitycznym plikiem APK zawierającym kod i zasoby dla wszystkich konfiguracji urządzeń obsługiwanych przez aplikację, zostaną uwzględnione tylko moduły funkcji, które mają ustawioną tę właściwość na true.

<dist:delivery> Obejmuje opcje umożliwiające dostosowanie wyświetlania modułów, jak pokazano poniżej. Pamiętaj, że każdy moduł funkcji może skonfigurować tylko jeden typ tych niestandardowych opcji dostarczania.
<dist:install-time> Określa, że moduł powinien być dostępny w momencie instalacji. Jest to domyślne działanie w przypadku modułów funkcji, które nie określają innego typu niestandardowej opcji dostarczania.

Więcej informacji o pobieraniu podczas instalacji znajdziesz w artykule Konfigurowanie dostarczania podczas instalacji.

Ten węzeł może też określać warunki ograniczające moduł do urządzeń spełniających określone wymagania, takie jak funkcje urządzenia, kraj użytkownika czy minimalny poziom interfejsu API. Więcej informacji znajdziesz w artykule o konfigurowaniu dostarczania warunkowego.

<dist:removable dist:value="true | false" />

Gdy zasada jest nieskonfigurowana lub ma wartość false, narzędzie Packagetool łączy moduły czasu instalacji z modułem podstawowym podczas generowania podzielonych plików APK z pakietu. W wyniku fuzji mniej będzie dzielonych plików APK, więc to ustawienie może poprawić wydajność aplikacji.

Jeśli zasada removable ma wartość true: moduły podczas instalacji nie zostaną połączone z modułem podstawowym. Jeśli chcesz w przyszłości odinstalować moduły, ustaw wartość true. Pamiętaj jednak, że skonfigurowanie zbyt wielu modułów, które da się odłączyć, może wydłużyć czas instalacji aplikacji.

Domyślna wartość to false. Tę wartość trzeba ustawić w pliku manifestu tylko wtedy, gdy chcesz wyłączyć fusing w module funkcji.

Uwaga: ta funkcja jest dostępna tylko wtedy, gdy używasz wtyczki Androida do obsługi Gradle w wersji 4.2 lub używasz narzędzia bundletool w wersji 1.0 z poziomu wiersza poleceń.

</dist:install-time>  
<dist:on-demand/> Określa, że moduł ma być dostępny do pobrania na żądanie. Oznacza to, że moduł jest niedostępny w momencie instalacji, ale aplikacja może poprosić o pobranie go później.

Więcej informacji o pobieraniu na żądanie znajdziesz w artykule Konfigurowanie wyświetlania na żądanie.

</dist:delivery>
<application
android:hasCode="true | false">
...
</application>
Jeśli moduł funkcji nie generuje plików DEX (czyli nie zawiera kodu skompilowanego później do formatu DEX), musisz wykonać te czynności (w przeciwnym razie mogą wystąpić błędy czasu działania):
  1. W pliku manifestu modułu funkcji ustaw android:hasCode na "false".
  2. Dodaj do pliku manifestu modułu base ten kod:
    <application
      android:hasCode="true"
      tools:replace="android:hasCode">
      ...
    </application>
    

Dodatkowe materiały

Aby dowiedzieć się więcej o korzystaniu z modułów funkcji, zapoznaj się z tymi materiałami.

Posty na blogu

Filmy

Warunki korzystania z usługi i bezpieczeństwo danych

Uzyskując dostęp do biblioteki Play Feature Delivery lub korzystając z niej, zgadzasz się na Warunki korzystania z pakietu Play Core Software Development Kit. Przed uzyskaniem dostępu do biblioteki przeczytaj i zrozum wszystkie obowiązujące warunki i zasady.

Bezpieczeństwo danych

Biblioteki podstawowe Play to interfejs środowiska wykonawczego aplikacji w Sklepie Google Play. Dlatego gdy korzystasz z Play Core w swojej aplikacji, Sklep Play ma własne procesy, które obejmują przetwarzanie danych zgodnie z Warunkami korzystania z Google Play. Poniżej znajdziesz informacje o tym, jak biblioteki Google Play obsługują dane na potrzeby przetwarzania konkretnych żądań Twojej aplikacji.

Interfejs API dodatkowych języków

Gromadzenie danych o korzystaniu Lista zainstalowanych języków
Cel zbierania danych Zebrane dane są wykorzystywane do dostarczania różnych wersji językowych aplikacji i zachowania zainstalowanych języków po jej aktualizacji.
Szyfrowanie danych Dane są zaszyfrowane.
Udostępnianie danych Dane nie są przesyłane do żadnych osób trzecich.
Usuwanie danych Dane są usuwane po ustalonym okresie przechowywania.

Play Feature Delivery

Gromadzenie danych o korzystaniu Metadane urządzenia
Wersja aplikacji
Cel zbierania danych Zebrane dane służą do udostępniania odpowiedniego modułu urządzeniu i zachowania zainstalowanych modułów po aktualizacji, utworzeniu kopii zapasowej i przywróceniu.
Szyfrowanie danych Dane są zaszyfrowane.
Udostępnianie danych Dane nie są przesyłane do żadnych osób trzecich.
Usuwanie danych Dane są usuwane po ustalonym okresie przechowywania.

Zależy nam na przejrzystości, ale to Ty ponosisz wyłączną odpowiedzialność za podjęcie decyzji o tym, jak odpowiedzieć w sekcji Bezpieczeństwo danych w Google Play, w kwestii zbierania, udostępniania i zabezpieczania danych użytkownika przez Twoją aplikację.