Omówienie Play Feature Delivery

Model przesyłania aplikacji w Google Play korzysta z pakietów Android App Bundle, aby generować i przesyłać zoptymalizowane pliki APK pod kątem konfiguracji urządzenia każdego użytkownika. Dzięki temu użytkownicy pobierają tylko kod i zasoby potrzebne do uruchomienia aplikacji.

Play Feature Delivery korzysta z zaawansowanych funkcji pakietów aplikacji, dzięki czemu niektóre funkcje aplikacji mogą być dostarczane warunkowo lub pobierane na żądanie. Aby to zrobić, musisz najpierw oddzielić te funkcje od podstawowej aplikacji i przenieść je do modułów funkcji.

Konfiguracja kompilacji modułu funkcji

Gdy utworzysz nowy moduł funkcji w Android Studio, środowisko IDE zastosuje do pliku build.gradle modułu ten wtyczkę Gradle:

// 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 w standardowej wtyczce aplikacji jest też dostępnych w module funkcji. W kolejnych sekcjach opisujemy właściwości, które należy uwzględnić w konfiguracji kompilacji modułu z funkcjami, oraz te, których nie należy uwzględniać.

Czego nie umieszczać w konfiguracji kompilacji modułu funkcji

Każdy moduł funkcji zależy od modułu podstawowego, więc dziedziczy też pewne konfiguracje. Dlatego w pliku build.gradle modułu funkcji należy pominąć te elementy:

  • Konfiguracje podpisywania: pakiety aplikacji są podpisywane za pomocą konfiguracji podpisywania określonych w module podstawowym.
  • Właściwość minifyEnabled: możesz włączyć zmniejszanie kodu w całym projekcie aplikacji tylko w konfiguracji kompilacji modułu podstawowego. Dlatego pomiń tę właściwość w modułach funkcji. Możesz jednak określić dodatkowe reguły ProGuard dla każdego modułu funkcji.
  • versionCodeversionName: podczas tworzenia pakietu aplikacji Gradle używa informacji o wersji aplikacji dostarczonych przez moduł podstawowy. Pomiń te właściwości w pliku build.gradle modułu funkcji.

Ustanawianie relacji z modułem podstawowym

Gdy Android Studio utworzy moduł funkcji, sprawi, że będzie on widoczny dla modułu podstawowego, dodając właściwość 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 uwzględnia 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ślanie dodatkowych reguł ProGuard

Chociaż tylko konfiguracja kompilacji modułu podstawowego może włączyć zmniejszanie kodu w projekcie aplikacji, możesz podać niestandardowe reguły ProGuard w każdym module 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'
     }
}

Pamiętaj, że te reguły ProGuard są scalane z regułami z innych modułów (w tym z modułu podstawowego) w momencie kompilacji. Każdy moduł funkcji może określać nowy zestaw reguł, ale te reguły obowiązują w przypadku wszystkich modułów w projekcie aplikacji.

Wdrażanie aplikacji

Podczas tworzenia aplikacji z obsługą modułów funkcji możesz wdrożyć ją na podłączonym urządzeniu w zwykły sposób, wybierając Uruchom > Uruchom na pasku menu (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, modyfikując istniejącą konfigurację uruchamiania/debugowania w ten sposób:

  1. Na pasku menu wybierz Uruchom > Edytuj konfiguracje.
  2. W panelu po lewej stronie okna Run/Debug Configurations (Konfiguracje uruchamiania/debugowania) wybierz odpowiednią konfigurację Android App (Aplikacja na Androida).
  3. Na karcie Ogólne w sekcji Dynamiczne funkcje do wdrożenia zaznacz pole obok każdego modułu funkcji, który chcesz uwzględnić podczas wdrażania aplikacji.
  4. Kliknij OK.

Domyślnie Android Studio nie wdraża aplikacji przy użyciu pakietów aplikacji. Zamiast tego środowisko IDE tworzy i instaluje na urządzeniu pliki APK zoptymalizowane pod kątem szybkości wdrażania, a nie rozmiaru. Aby skonfigurować Android Studio tak, aby zamiast tego tworzyło i wdrażało pakiety APK i aplikacje błyskawiczne z pakietu aplikacji, zmodyfikuj 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 API 21) lub nowszym. Aby ograniczyć rozmiar aplikacji na potrzeby pobierania początkowego, możesz skonfigurować niektóre funkcje tak, aby pobierać je w razie potrzeby na żądanie albo tylko na urządzeniach, które obsługują określone funkcje, np. możliwość robienia zdjęć lub obsługę funkcji rzeczywistości rozszerzonej.

Gdy prześlesz aplikację jako pakiet aplikacji, domyślnie uzyskasz wysoce 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 stanowią elementy składowe do tworzenia modułowych funkcji, które można skonfigurować tak, aby w razie potrzeby można było je pobrać.

Rozważ aplikację, która umożliwia użytkownikom kupowanie i sprzedawanie towarów na platformie handlowej online. Każdą z tych funkcji aplikacji możesz podzielić na osobne moduły funkcji:

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

W tabeli poniżej opisujemy różne opcje dostarczania, które obsługują moduły funkcji, oraz sposób, w jaki można ich używać do optymalizacji początkowego rozmiaru pobierania przykładowej aplikacji na platformę handlową.

Opcja dostawy Działanie Przykładowy przypadek użycia Pierwsze kroki
Przesyłanie podczas instalacji Moduły funkcji, które nie konfigurują żadnej z opisanych powyżej opcji dostarczania, są domyślnie pobierane podczas instalacji aplikacji. Jest to ważne, ponieważ oznacza, że możesz stopniowo wprowadzać zaawansowane opcje dostarczania. Możesz na przykład skorzystać z modularyzacji funkcji aplikacji i włączyć dostarczanie na żądanie dopiero po pełnym wdrożeniu pobierania na żądanie za pomocą biblioteki Play Feature Delivery.

Aplikacja może też później poprosić o odinstalowanie funkcji. Jeśli więc potrzebujesz określonych funkcji podczas instalacji aplikacji, ale nie później, możesz zmniejszyć rozmiar instalacji, prosząc o usunięcie funkcji z urządzenia.

Jeśli aplikacja ma określone działania szkoleniowe, takie jak interaktywny przewodnik po kupowaniu i sprzedawaniu produktów na platformie handlowej, możesz domyślnie uwzględnić tę funkcję podczas instalacji aplikacji.

Aby jednak zmniejszyć rozmiar zainstalowanej aplikacji, może ona poprosić o usunięcie funkcji po ukończeniu przez użytkownika szkolenia.

Podziel aplikację na moduły za pomocą modułów funkcji, które nie konfigurują zaawansowanych opcji dostarczania.

Aby dowiedzieć się, jak zmniejszyć rozmiar zainstalowanej aplikacji przez usunięcie niektórych modułów funkcji, które mogą nie być już potrzebne użytkownikowi, przeczytaj artykuł Zarządzanie zainstalowanymi modułami.

Dostawa na żądanie Umożliwia aplikacji wysyłanie żądań pobrania modułów funkcji w razie potrzeby. Jeśli tylko 20% użytkowników aplikacji na platformie handlowej publikuje przedmioty na sprzedaż, dobrą strategią zmniejszenia początkowego rozmiaru pobierania dla większości użytkowników jest udostępnienie funkcji robienia zdjęć, w tym opisu produktu i umieszczania go na sprzedaż, jako pobierania na żądanie. Oznacza to, że możesz skonfigurować moduł funkcji do sprzedaży w aplikacji tak, aby był pobierany tylko wtedy, gdy użytkownik wyrazi zainteresowanie wystawieniem produktów na sprzedaż na platformie handlowej.

Jeśli użytkownik przestanie sprzedawać produkty po pewnym czasie, aplikacja może zmniejszyć swój rozmiar po zainstalowaniu, prosząc o odinstalowanie tej funkcji.

Utwórz moduł funkcji i skonfiguruj dostarczanie na żądanie. Aplikacja może następnie użyć Play Feature Delivery Library, aby zażądać pobrania modułu na żądanie.
Dostawa warunkowa Umożliwia określenie wymagań dotyczących urządzenia użytkownika, takich jak funkcje sprzętowe, ustawienia regionalne i minimalny poziom API, aby określić, czy modułowa funkcja zostanie pobrana podczas instalacji aplikacji. Jeśli aplikacja platformy handlowej ma zasięg globalny, może być konieczne obsługiwanie form płatności popularnych tylko w niektórych regionach lub lokalizacjach. Aby zmniejszyć rozmiar aplikacji na potrzeby pobierania początkowego, możesz utworzyć osobne moduły funkcji do przetwarzania określonych typów form płatności i instalować je warunkowo na urządzeniu użytkownika na podstawie zarejestrowanej lokalizacji. Utwórz moduł funkcji i skonfiguruj przesyłanie warunkowe.
Natychmiastowa dostawa Aplikacja błyskawiczna w Google Play umożliwia użytkownikom korzystanie z aplikacji bez konieczności instalowania jej na urządzeniu. Zamiast tego mogą wypróbować aplikację, klikając przycisk „Wypróbuj teraz” w Sklepie Google Play lub korzystając z utworzonego przez Ciebie adresu URL. Ta forma dostarczania treści ułatwia zwiększanie zaangażowania w aplikację.

Dzięki natychmiastowej dostawie możesz korzystać z aplikacji błyskawicznych w Google Play, aby umożliwić użytkownikom natychmiastowe wypróbowanie niektórych funkcji aplikacji bez konieczności jej instalowania.

Rozważ grę, która zawiera kilka pierwszych poziomów w lekkim module funkcji. Możesz włączyć wersję błyskawiczną tego modułu, aby użytkownicy mogli od razu wypróbować grę za pomocą linku URL lub przycisku „Wypróbuj”, bez instalowania aplikacji. Utwórz moduł funkcji i skonfiguruj szybkie przesyłanie. Aplikacja może następnie użyć Play Feature Delivery Library, aby zażądać pobrania modułu na żądanie.

Pamiętaj, że podzielenie funkcji aplikacji na moduły funkcji to tylko pierwszy krok. Aby obsługiwać Google Play Instant, rozmiar pobierania modułu podstawowego aplikacji i danej funkcji obsługującej aplikacje błyskawiczne musi spełniać rygorystyczne ograniczenia rozmiaru. Więcej informacji znajdziesz w artykule Włączanie funkcji błyskawicznych przez zmniejszenie rozmiaru aplikacji lub gry.

Tworzenie identyfikatora URI zasobu

Jeśli chcesz uzyskać dostęp do zasobu przechowywanego w module funkcji za pomocą identyfikatora URI, możesz 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 działania, co zapewnia wygenerowanie prawidłowej przestrzeni nazw po wczytaniu podzielonych plików APK.

Załóżmy, że masz aplikację i moduły 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 symbol resId w powyższym fragmencie kodu odnosi się do zasobu pliku surowego o nazwie „my_video” w module funkcji, to powyższy kod resId wygeneruje te dane wyjściowe:Uri.Builder()

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

Ten identyfikator URI może być następnie używany przez aplikację do uzyskiwania dostępu do zasobu modułu funkcji.

Aby sprawdzić ścieżki w identyfikatorze URI, możesz użyć analizatora APK. Pozwoli Ci on sprawdzić plik APK modułu funkcji i określić nazwę pakietu:

Zrzut ekranu przedstawiający analizator APK sprawdzający zawartość skompilowanego pliku zasobów.
Rysunek 1. Użyj Analizatora APK, aby sprawdzić nazwę pakietu w skompilowanym pliku zasobów.

Uwagi dotyczące modułów funkcji

Moduły funkcji pozwalają zwiększyć szybkość kompilacji i pracy inżynierskiej oraz w dużym stopniu dostosować dostarczanie funkcji aplikacji, aby zmniejszyć jej rozmiar. Podczas korzystania z modułów funkcji należy jednak pamiętać o pewnych ograniczeniach i przypadkach brzegowych:

  • Zainstalowanie na jednym urządzeniu co najmniej 50 modułów funkcji w ramach dostarczania warunkowego lub na żądanie może spowodować problemy z wydajnością. Moduły przesyłane podczas instalacji, które nie są skonfigurowane jako usuwalne, są automatycznie uwzględniane w module podstawowym i na każdym urządzeniu liczą się tylko jako jeden moduł funkcji.
  • Ogranicz liczbę modułów skonfigurowanych jako usuwalne w przypadku dostarczania w momencie instalacji do maksymalnie 10. 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ć funkcję we wcześniejszych wersjach Androida, podczas tworzenia modułu funkcji włącz łączenie.
  • Włącz SplitCompat, aby aplikacja miała dostęp do pobranych modułów funkcji dostarczanych na żądanie.
  • Moduły funkcji nie powinny określać aktywności w swoim manifeście z ustawionym na android:exported true. Dzieje się tak, ponieważ nie ma gwarancji, że urządzenie pobrało moduł funkcji, gdy inna aplikacja próbuje uruchomić aktywność. Dodatkowo aplikacja powinna potwierdzić, że funkcja została pobrana, zanim spróbuje uzyskać dostęp do jej kodu i zasobów. Więcej informacji znajdziesz w artykule Zarządzanie zainstalowanymi modułami.
  • Play Feature Delivery wymaga publikowania aplikacji za pomocą pakietu aplikacji, więc zapoznaj się z znanymi problemami dotyczącymi pakietów aplikacji.

Informacje o pliku manifestu modułu funkcji

Podczas tworzenia nowego modułu funkcji w Android Studio środowisko IDE zawiera większość atrybutów pliku manifestu, których moduł wymaga do działania jako moduł funkcji. Poza tym niektóre atrybuty są wstrzykiwane przez system kompilacji w czasie kompilacji, więc nie musisz ich samodzielnie określać ani modyfikować. W tabeli poniżej opisano atrybuty pliku manifestu, które są ważne w przypadku modułów funkcji.

Atrybut Opis
<manifest Jest to typowy blok <manifest>.
xmlns:dist="http://schemas.android.com/apk/distribution" Określa nową dist:przestrzeń nazw XML, która jest 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.

Określa nazwę modułu, którą aplikacja podaje podczas żądania modułu na żądanie za pomocą biblioteki Play Feature Delivery.

Jak Gradle określa wartość tego atrybutu:

Domyślnie podczas tworzenia modułu funkcji w Android Studio IDE używa nazwy podanej jako Nazwa modułu do identyfikowania modułu jako podprojektu Gradle w  pliku ustawień Gradle.

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

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

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

<dist:module Określa atrybuty, które decydują o sposobie pakowania i dystrybucji modułu w postaci plików APK.
dist:instant="true | false" Określa, czy moduł powinien być dostępny w Google Play Instant jako aplikacja błyskawiczna.

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

Nie możesz ustawić tego elementu XML na true, jeśli ustawisz też <dist:on-demand/>. Możesz jednak nadal żądać pobierania na żądanie modułów funkcji z obsługą wersji błyskawicznej jako aplikacji błyskawicznych za pomocą biblioteki Play Feature Delivery. Gdy użytkownik pobierze i zainstaluje Twoją aplikację, urządzenie domyślnie pobierze i zainstaluje moduły funkcji aplikacji obsługujące aplikacje natychmiastowe wraz z podstawowym plikiem APK.

dist:title="@string/feature_name"> Określa tytuł modułu widoczny dla użytkownika. Na przykład urządzenie może wyświetlać ten tytuł, gdy prosi o potwierdzenie pobierania.

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

<dist:fusing dist:include="true | false" /> Określa, czy moduł ma być uwzględniony w zestawie wielu plików APK, które są kierowane na urządzenia z Androidem 4.4 (API na poziomie 20) lub starszym.

Dodatkowo, gdy używasz bundletool do generowania plików APK z pakietu aplikacji, w uniwersalnym pliku APK (czyli monolitycznym pliku APK, który zawiera kod i zasoby dla wszystkich konfiguracji urządzeń obsługiwanych przez aplikację) uwzględniane są tylko moduły funkcji, w których ta właściwość ma wartość true.

<dist:delivery> Zawiera opcje dostosowywania dostarczania modułów, jak pokazano poniżej. Pamiętaj, że każdy moduł funkcji musi konfigurować tylko jeden typ tych niestandardowych opcji dostawy.
<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 opcji dostawy niestandardowej.

Więcej informacji o pobieraniu w momencie instalacji znajdziesz w artykule Konfigurowanie dostawy w momencie instalacji.

Ten węzeł może też określać warunki, które ograniczają moduł do urządzeń spełniających określone wymagania, takie jak funkcje urządzenia, kraj użytkownika lub minimalny poziom interfejsu API. Więcej informacji znajdziesz w artykule Konfigurowanie dostawy warunkowej.

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

Gdy ta opcja nie jest ustawiona lub ma wartość false, narzędzie BundleTool łączy moduły przesyłane podczas instalacji z modułem podstawowym podczas generowania z pakietu dzielonych plików APK. W wyniku scalania będzie mniej podzielonych plików APK, co może zwiększyć wydajność aplikacji.

Gdy wartość removable to true, moduły przesyłane podczas instalacji nie będą scalane z modułem podstawowym. Ustaw wartość true, jeśli chcesz w przyszłości odinstalować moduły. Skonfigurowanie zbyt wielu modułów jako usuwalnych może jednak wydłużyć czas instalacji aplikacji.

Domyślna wartość to false. Ustawienie tej wartości w pliku manifestu jest konieczne tylko wtedy, gdy chcesz wyłączyć łączenie w przypadku modułu funkcji.

Uwaga: ta funkcja jest dostępna tylko w przypadku korzystania z wtyczki Android Gradle w wersji 4.2 lub nowszej albo z narzędzia bundletool w wersji 1.0 z wiersza poleceń.

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

Więcej informacji o pobieraniu na żądanie znajdziesz w artykule Konfigurowanie dostawy na żądanie.

</dist:delivery>
</dist:module>
<application
android:hasCode="true | false">
...
</application>
Jeśli moduł funkcji nie generuje żadnych plików DEX, czyli nie zawiera kodu, który jest później kompilowany do formatu pliku DEX, musisz wykonać te czynności (w przeciwnym razie mogą wystąpić błędy środowiska wykonawczego):
  1. Ustaw wartość android:hasCode na "false" w pliku manifestu modułu funkcji.
  2. Dodaj do manifestu modułu base te informacje:
    <application
      android:hasCode="true"
      tools:replace="android:hasCode">
      ...
    </application>
...
</manifest>

Dodatkowe materiały

Więcej informacji o korzystaniu z modułów funkcji znajdziesz w tych materiałach.

Posty na blogu

Filmy

Warunki korzystania z usługi i bezpieczeństwo danych

Uzyskanie dostępu do biblioteki dostarczania funkcji w Google Play lub korzystanie z niej oznacza akceptację Warunków korzystania z pakietu SDK Play Core. Przed uzyskaniem dostępu do biblioteki zapoznaj się ze wszystkimi obowiązującymi warunkami i zasadami.

Bezpieczeństwo danych

Biblioteki Play Core to interfejs środowiska wykonawczego aplikacji ze Sklepem Google Play. Dlatego gdy używasz w aplikacji biblioteki Play Core, Sklep Play uruchamia własne procesy, które obejmują przetwarzanie danych zgodnie z Warunkami usługi Google Play. Poniżej znajdziesz informacje o tym, jak biblioteki Play Core przetwarzają dane, aby obsługiwać konkretne żądania z Twojej aplikacji.

Interfejs API dodatkowych języków

Dane zbierane na podstawie sposobu korzystania z usługi Lista zainstalowanych języków
Cel zbierania danych Zebrane dane są używane do dostarczania różnych wersji językowych aplikacji i zachowywania zainstalowanych języków po aktualizacji aplikacji.
Szyfrowanie danych Dane są zaszyfrowane.
Udostępnianie danych Dane nie są przekazywane żadnym osobom trzecim.
Usuwanie danych Dane są usuwane po upływie określonego okresu przechowywania.

Play Feature Delivery

Dane zbierane na podstawie sposobu korzystania z usługi Metadane urządzenia
Wersja aplikacji
Cel zbierania danych Zebrane dane są używane do dostarczania odpowiedniego modułu na urządzenie oraz do zachowywania zainstalowanych modułów po aktualizacji, utworzeniu kopii zapasowej i przywróceniu.
Szyfrowanie danych Dane są zaszyfrowane.
Udostępnianie danych Dane nie są przekazywane żadnym osobom trzecim.
Usuwanie danych Dane są usuwane po upływie określonego okresu przechowywania.

Dążymy do prezentowania informacji w jak najbardziej przejrzysty sposób. Jednak jako deweloper aplikacji ponosisz wyłączną odpowiedzialność za decyzje związane z sekcją Bezpieczeństwo danych w formularzu Google Play dotyczące zbierania, udostępniania i zabezpieczania danych użytkowników przez Twoją aplikację.