Omówienie Play Feature Delivery

Model dostarczania aplikacji w Google Play korzysta z pakietów Android App Bundle, aby generować i przesyłać pliki APK zoptymalizowane pod kątem każdej konfiguracji urządzenia 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 aplikacji podstawowej i umieścić je w modułach funkcji.

Konfiguracja kompilacji modułu funkcji

Gdy tworzysz nowy moduł funkcji za pomocą Android Studio, IDE stosuje do pliku build.gradle tego modułu odpowiedni 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 dla standardowego wtyczka aplikacji jest też dostępnych dla Twojego modułu funkcji. W następnych sekcjach opisaliśmy właściwości, które należy i których nie należy uwzględniać w konfiguracji kompilacji modułu funkcji.

Czego nie należy uwzględniać w konfiguracji kompilacji modułu funkcji

Każdy moduł funkcji zależy od modułu podstawowego, dlatego dziedziczy też niektóre konfiguracje. 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ć kompresję kodu w całym projekcie aplikacji, korzystając tylko z konfiguracji kompilacji modułu podstawowego. Dlatego nie uwzględniaj tej właściwości w modulech 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, które są dostępne w module podstawowym. Te właściwości należy pominąć w pliku build.gradle modułu funkcji.

Utwórz relację z modułem podstawowym

Gdy Android Studio utworzy moduł funkcji, uczyni go widocznym dla modułu podstawowego, dodając do pliku build.gradle modułu podstawowego właściwość android.dynamicFeatures, 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 zawiera 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ć kompresję 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. Oznacza to, że każdy moduł funkcji może określać nowy zestaw reguł, ale te reguły będą stosowane 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, tak jak zwykle, 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ć, które funkcje mają być uwzględnione podczas wdrażania aplikacji. W tym celu zmodyfikuj istniejącą konfigurację uruchamiania/debugowania w ten sposób:

  1. Na pasku menu kliknij Uruchom > Edytuj konfiguracje.
  2. W panelu po lewej stronie w oknie Konfiguracje uruchamiania/debugowania wybierz odpowiednią konfigurację aplikacji na Androida.
  3. Na karcie Ogólne w sekcji Funkcje dynamiczne 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 za pomocą pakietów aplikacji. Zamiast tego kompiluje i instaluje na urządzeniu pliki APK zoptymalizowane pod kątem szybkości wdrażania, a nie ich rozmiaru. Aby skonfigurować Android Studio tak, aby zamiast pakietu aplikacji kompilowało i wdrażało pliki APK oraz aplikacje błyskawiczne, zmodyfikuj konfigurację uruchamiania/debugowania.

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

Unikalną 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 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, takie jak możliwość robienia zdjęć czy obsługa funkcji rzeczywistości rozszerzonej.

Po przesłaniu aplikacji jako pakietu aplikacji domyślnie uzyskujesz dostęp do zoptymalizowanych plików do pobrania, ale bardziej zaawansowane i elastyczne opcje dostarczania funkcji wymagają dodatkowej konfiguracji i modułowej konfiguracji funkcji aplikacji za pomocą modułów funkcji. Oznacza to, że moduły funkcji stanowią elementy składowe modułowych funkcji, które można skonfigurować tak, aby można je było pobierać w miarę potrzeby.

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 rozłożyć na osobne moduły:

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

Tabela poniżej opisuje różne opcje dostarczania obsługiwane przez moduły funkcji oraz sposób ich wykorzystania do optymalizacji początkowego rozmiaru pobierania przykładowej aplikacji z Marketplace.

Opcja dostawy Działanie Przykładowy przypadek użycia Pierwsze kroki
Przesyłanie w momencie instalacji Moduły funkcji, które nie konfigurują żadnych z opisanych powyżej opcji wyświetlania, są domyślnie pobierane podczas instalowania aplikacji. To ważne zachowanie, ponieważ oznacza, że możesz stopniowo stosować 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ż poprosić o odinstalowanie funkcji w późniejszym czasie. Jeśli więc potrzebujesz określonych funkcji podczas instalowania aplikacji, ale nie po zainstalowaniu, możesz zmniejszyć rozmiar instalacji, prosząc o usunięcie funkcji z urządzenia.

Jeśli aplikacja zawiera pewne czynności szkoleniowe, takie jak interaktywny przewodnik po kupowaniu i sprzedawaniu produktów na platformie handlowej, możesz domyślnie włączyć tę funkcję podczas instalacji aplikacji.

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

Modułowo skonfiguruj aplikację, używając modułów funkcji, które nie konfigurują żadnych zaawansowanych opcji wyświetlania.

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.

Dostarczanie na żądanie Umożliwia aplikacji żądanie i pobieranie modułów funkcji w razie potrzeby. Jeśli tylko 20% użytkowników aplikacji na platformie handlowej publikuje produkty na sprzedaż, dobrym sposobem na zmniejszenie początkowego rozmiaru pobierania dla większości użytkowników jest udostępnienie funkcji robienia zdjęć, w tym opisu produktu, oraz umieszczanie produktu na sprzedaż jako pobierania na żądanie. Oznacza to, że możesz skonfigurować moduł funkcji sprzedaży aplikacji tak, aby można go było pobrać tylko wtedy, gdy użytkownik wyrazi zainteresowanie umieszczeniem produktów na platformie handlowej.

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

Utwórz moduł funkcji i skonfiguruj dostarczanie na żądanie. Aplikacja może wtedy użyć biblioteki Play Feature Delivery, aby poprosić o pobieranie modułu na żądanie.
Dostawa warunkowa Umożliwia określenie pewnych wymagań dotyczących urządzenia użytkownika, takich jak funkcje sprzętowe, lokalizacja i minimalny poziom interfejsu API, aby określić, czy funkcja modułowa ma być pobierana podczas instalowania aplikacji. Jeśli aplikacja platformy handlowej ma zasięg globalny, może być konieczne obsługiwanie form płatności popularnych tylko w określonych regionach lub lokalizacjach. Aby zmniejszyć rozmiar początkowego pobierania aplikacji, możesz utworzyć osobne moduły funkcji do przetwarzania określonych typów metod płatności i zainstalować je warunkowo na urządzeniu użytkownika na podstawie zarejestrowanej lokalizacji. Utwórz moduł funkcji i skonfiguruj dostawę warunkową.
Natychmiastowa dostawa Aplikacja błyskawiczna w Google Play umożliwia użytkownikom korzystanie z aplikacji bez konieczności jej instalowania na urządzeniu. Zamiast tego mogą skorzystać z przycisku „Wypróbuj” w Sklepie Google Play lub z adresu URL, który utworzysz. Ta forma dostarczania treści ułatwia zwiększanie zaangażowania użytkowników w Twoją aplikację.

Dzięki dostarczaniu błyskawicznemu możesz korzystać z aplikacji błyskawicznej w Google Play, aby umożliwić użytkownikom natychmiastowe korzystanie z pewnych funkcji aplikacji bez konieczności jej instalowania.

Weź pod uwagę grę, która zawiera kilka pierwszych poziomów w lekkim module funkcji. Możesz włączyć ten moduł, aby użytkownicy mogli od razu grać w grę za pomocą linku URL lub przycisku „Wypróbuj teraz”, bez instalowania aplikacji. Utwórz moduł funkcji i skonfiguruj przesyłanie natychmiastowe. Aplikacja może wtedy użyć biblioteki Play Feature Delivery, aby poprosić o pobieranie modułu na żądanie.

Pamiętaj, że modułowe tworzenie funkcji aplikacji za pomocą modułów funkcji to dopiero pierwszy krok. Aby obsługiwać funkcję Google Play Instant, musisz spełnić rygorystyczne limity rozmiaru pobierania modułu podstawowego aplikacji i konkretnej funkcji obsługiwanej przez funkcję błyskawiczną. Aby dowiedzieć się więcej, przeczytaj artykuł Włączanie aplikacji błyskawicznych poprzez zmniejszanie rozmiaru 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ą funkcji 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, co zapewnia wygenerowanie prawidłowej przestrzeni nazw po załadowaniu podzielonych pakietów APK.

Przykład generowania identyfikatora URI: 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 resId w fragmentzie kodu powyżej odnosi się do zasobu pliku nieprzetworzonego o nazwie „my_video” w module funkcji, kod Uri.Builder() powyżej zwróci następujący wynik:

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, aby uzyskać dostęp do zasobu modułu funkcji.

Aby sprawdzić ścieżki w identyfikatorze URI, możesz użyć APK Analyzer, aby sprawdzić plik APK modułu funkcji i określić nazwę pakietu:

Zrzut ekranu pokazujący narzędzie APK Analyzer sprawdzającego zawartość skompilowanego pliku zasobu.
Rysunek 1. Użyj narzędzia APK Analyzer, aby sprawdzić nazwę pakietu w skompilowanym pliku zasobu.

Uwagi dotyczące modułów funkcji

Dzięki modułom funkcji możesz zwiększyć szybkość kompilacji i szybkość rozwoju oraz w znacznym stopniu dostosować dostarczanie funkcji aplikacji, aby zmniejszyć jej rozmiar. Podczas korzystania z modułów funkcji należy jednak pamiętać o kilku ograniczeniach i przypadkach szczególnych:

  • Instalowanie co najmniej 50 modułów funkcji na jednym urządzeniu za pomocą przesyłania warunkowego lub na żądanie może spowodować problemy z wydajnością. Moduł instalowany w momencie instalacji, który nie jest skonfigurowany jako wymienny, jest automatycznie dołączany do modułu podstawowego i liczy się jako 1 moduł funkcji na urządzeniu.
  • Ogranicz liczbę modułów skonfigurowanych jako wymienne w ramach dostarczonej w czasie instalacji do 10 lub mniej. 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ę w starszych wersjach Androida, podczas tworzenia modułu funkcji włącz opcję Fusing.
  • Włącz SplitCompat, aby aplikacja miała dostęp do pobranych modułów funkcji, które są dostarczane na żądanie.
  • Moduł funkcji nie powinien określać w swoim pliku manifestu aktywności z wartością android:exported równą true. Dzieje się tak, ponieważ nie ma pewności, że gdy inna aplikacja spróbuje uruchomić tę aktywność, urządzenie będzie miało pobrany moduł funkcji. Dodatkowo aplikacja powinna potwierdzić, że dana 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.
  • Ponieważ Play Feature Delivery wymaga opublikowania aplikacji za pomocą pakietu aplikacji, zapoznaj się z znanymi problemami dotyczącymi pakietów aplikacji.

Informacje o pliku manifestu modułu funkcji

Podczas tworzenia nowego modułu funkcji za pomocą Android Studio IDE zawiera większość atrybutów pliku manifestu, których potrzebuje moduł, aby zachowywać się jak moduł funkcji. Ponadto niektóre atrybuty są wstrzykiwane przez system kompilacji w momencie kompilacji, więc nie musisz ich określać ani modyfikować samodzielnie. W tabeli poniżej opisano atrybuty pliku manifestu, które są ważne dla modułów funkcji.

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

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

Jak Gradle określa wartość tego atrybutu:

Domyślnie, gdy tworzysz moduł funkcji za pomocą Android Studio, IDE używa podanej przez Ciebie nazwy modułu, aby zidentyfikować moduł jako podprojekt Gradle w  pliku ustawień Gradle.

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

android:isFeatureSplit="true | false"> Gdy Android Studio kompiluje pakiet aplikacji, uwzględnia ten atrybut. Nie należy go dodawać ani modyfikować ręcznie.

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

<dist:module Określa atrybuty, które określają sposób pakowania i rozpowszechniania modułu w plikach APK.
dist:instant="true | false" Określa, czy moduł ma być dostępny w Google Play Instant jako aplikacja błyskawiczna.

Jeśli Twoja aplikacja zawiera co najmniej 1 moduł funkcji włączany błyskawicznie, musisz też włączyć błyskawicznie moduł podstawowy. Gdy używasz Android Studio 3.5 lub nowszej wersji, IDE wykona to za Ciebie, gdy utworzysz moduł funkcji z natychmiastową aktywacją.

Nie można ustawić tego elementu XML na wartość true, jeśli jednocześnie ustawiasz wartość <dist:on-demand/>. Nadal możesz jednak żądać pobrania na żądanie modułów funkcji z obsługą wersji błyskawicznej jako aplikacji błyskawicznych za pomocą Play Feature Delivery Library. Gdy użytkownik pobiera i instaluje Twoją aplikację, urządzenie domyślnie pobiera i instaluje moduły funkcji z włączoną natychmiastową dostępnością, a także plik APK podstawowej wersji aplikacji.

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

Musisz uwzględnić zasób ciągu 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 pliku APK, który jest kierowany na urządzenia z Androidem 4.4 (interfejs API na poziomie 20) lub starszym.

Dodatkowo, gdy używasz wartości bundletool do generowania plików APK z pakietu aplikacji, do uniwersalnego pliku APK są dołączane tylko te moduły funkcji, dla których ta właściwość ma wartość true. Jest to monolityczny plik APK zawierający kod i zasoby dla wszystkich konfiguracji urządzeń obsługiwanych przez Twoją aplikację.

<dist:delivery> Zawiera opcje, które umożliwiają dostosowanie dostawy modułu, jak pokazano poniżej. Pamiętaj, że każdy moduł funkcji musi konfigurować tylko jeden typ tych opcji dostawy niestandardowej.
<dist:install-time> Określa, że moduł powinien być dostępny w momencie instalacji. Jest to domyślne zachowanie w przypadku modułów funkcji, które nie określają innego typu opcji przesyłania niestandardowego.

Więcej informacji o pobieraniu w czasie instalacji znajdziesz w artykule Konfigurowanie dostarczania w czasie 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 czy minimalny poziom interfejsu API. Więcej informacji znajdziesz w artykule Konfigurowanie dostawy warunkowej.

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

Jeśli ta opcja nie jest ustawiona lub jest ustawiona na false, bundletool połączy moduły instalowane w czasie instalacji z modułem podstawowym podczas generowania podzielonych plików APK z pakietu. Po złączeniu plików APK będzie ich mniej, co może poprawić skuteczność aplikacji.

Gdy removable ma wartość true: moduły instalowane w momencie instalacji nie będą łączone z modułem podstawowym. Jeśli chcesz odinstalować moduły w przyszłości, ustaw tę opcję na true. Jednak skonfigurowanie zbyt wielu modułów do usunięcia może wydłużyć czas instalacji aplikacji.

Domyślna wartość to false. Tę wartość w pliku manifestu należy ustawić tylko wtedy, gdy chcesz wyłączyć łączenie w przypadku danego modułu funkcji.

Uwaga: ta funkcja jest dostępna tylko przy użyciu wtyczki Android Gradle 4.2 lub narzędzia bundletool w wersji 1.0 z poziomu 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 poprosić o jego pobranie później.

Więcej informacji o plikach do pobrania 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 plików DEX, czyli nie zawiera kodu, który zostanie później skompilowany w formacie pliku DEX, musisz wykonać te czynności (w przeciwnym razie mogą wystąpić błędy w czasie wykonywania):
  1. W pliku manifestu modułu funkcji ustaw wartość android:hasCode na "false".
  2. Dodaj do pliku manifestu modułu podstawowego te informacje:
    <application
      android:hasCode="true"
      tools:replace="android:hasCode">
      ...
    </application>
    

</manifest>

Dodatkowe materiały

Więcej informacji o używaniu modułów funkcji znajdziesz w tych materiałach.

Posty na blogu

Filmy

Warunki korzystania z usługi i bezpieczeństwo danych

Korzystanie z Play Feature Delivery Library oznacza akceptację Warunków korzystania z usługi Play Core Software Development Kit. Zanim uzyskasz dostęp do biblioteki, przeczytaj i zapoznaj się ze wszystkimi obowiązującymi warunkami oraz zasadami.

Bezpieczeństwo danych

Biblioteki Play Core to interfejs aplikacji w czasie jej działania w Sklepie Google Play. Dlatego gdy używasz w aplikacji Play Core, Sklep Play uruchamia własne procesy, które obejmują przetwarzanie danych zgodnie z Warunkami korzystania z usługi Google Play. Poniżej znajdziesz informacje o tym, jak biblioteki Play Core obsługują dane, aby przetwarzać określone żądania z Twojej aplikacji.

Interfejs API dodatkowych języków

Dane o użytkowaniu Lista zainstalowanych języków
Cel zbierania danych Zebrane dane są używane do dostarczania wersji aplikacji w różnych językach oraz do zachowania zainstalowanych języków po aktualizacji aplikacji.
Szyfrowanie danych Dane są zaszyfrowane.
Udostępnianie danych Dane nie są przekazywane osobom trzecim.
Usuwanie danych Dane są usuwane po upływie stałego okresu przechowywania.

Play Feature Delivery

Dane o użytkowaniu Metadane urządzenia
Wersja aplikacji
Cel zbierania danych Zbierane dane są używane do przesyłania odpowiedniego modułu na urządzenie oraz do zachowania zainstalowanych modułów po aktualizacji, tworzeniu kopii zapasowej i przywracaniu.
Szyfrowanie danych Dane są zaszyfrowane.
Udostępnianie danych Dane nie są przekazywane osobom trzecim.
Usuwanie danych Dane są usuwane po upływie stałego okresu przechowywania.

Chociaż staramy się zapewnić jak największą przejrzystość, to Ty 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ę.