Model udostępniania aplikacji w Google Play wykorzystuje pakiety Android App Bundle do generowania i udostępniania zoptymalizowanych plików APK dla konfiguracji urządzenia każdego użytkownika. Dzięki temu użytkownicy pobierają tylko kod i zasoby potrzebne do uruchomienia aplikacji.
Funkcja Play Feature Delivery wykorzystuje zaawansowane możliwości pakietów aplikacji, umożliwiając warunkowe dostarczanie lub pobieranie na żądanie niektórych funkcji aplikacji. 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 modułu tę 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 standardowej wtyczki aplikacji jest też dostępnych dla modułu funkcji. W sekcjach poniżej opisujemy właściwości, które należy i których nie należy uwzględniać w konfiguracji kompilacji modułu funkcji.
Czego nie umieszczać w konfiguracji kompilacji modułu funkcji
Każdy moduł funkcji jest zależny 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 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 w konfiguracji kompilacji modułu podstawowego. Dlatego 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. versionCodeiversionName: podczas tworzenia pakietu aplikacji Gradle używa informacji o wersji aplikacji, które udostępnia moduł podstawowy. Te właściwości należy pominąć w plikubuild.gradlemodułu funkcji.
Nawiązywanie relacji z modułem podstawowym
Gdy Android Studio tworzy moduł funkcji, udostępnia go modułowi podstawowemu, 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 dla każdego modułu funkcji, używając 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 modułu podstawowego) w czasie kompilacji. Dlatego, chociaż 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 standardowy sposób, wybierając na pasku menu Run > Run (Uruchom > Uruchom) lub klikając Run (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 i debugowania w ten sposób:
- Na pasku menu kliknij Run > Edit Configurations (Uruchom > Edytuj konfiguracje).
- W panelu po lewej stronie okna Konfiguracje uruchamiania i debugowania wybierz odpowiednią konfigurację aplikacji na Androida.
- W sekcji Funkcje dynamiczne do wdrożenia na karcie Ogólne zaznacz pole obok każdego modułu funkcji, który chcesz uwzględnić podczas wdrażania aplikacji.
- Kliknij OK.
Domyślnie Android Studio nie wdraża aplikacji za pomocą pakietów aplikacji. Zamiast tego IDE tworzy i instaluje na urządzeniu pliki APK zoptymalizowane pod kątem szybkości wdrażania, a nie rozmiaru. Aby skonfigurować Android Studio do tworzenia i wdrażania plików APK oraz wersji błyskawicznych z pakietu aplikacji, zmień konfigurację uruchamiania i debugowania.
Używanie modułów funkcji do dostarczania niestandardowego
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ć początkowy rozmiar pobieranej aplikacji, możesz skonfigurować niektóre funkcje tak, aby były pobierane na żądanie lub tylko na urządzenia, które obsługują określone funkcje, takie jak robienie zdjęć czy rzeczywistość rozszerzona.
Chociaż po przesłaniu aplikacji jako pakietu aplikacji domyślnie otrzymujesz wysoce zoptymalizowane pliki do pobrania, 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 funkcji modułowych, które można skonfigurować tak, aby były pobierane w razie potrzeby.
Wyobraź sobie aplikację, która umożliwia użytkownikom kupowanie i sprzedawanie towarów na platformie handlowej online. Możesz w rozsądny sposób podzielić każdą z tych funkcji aplikacji na osobne moduły funkcji:
- Logowanie się i tworzenie konta
- Przeglądanie platformy handlowej
- Wystawianie przedmiotu na sprzedaż
- Przetwarzanie płatności
W tabeli poniżej opisano różne opcje dostarczania obsługiwane przez moduły funkcji oraz sposoby ich wykorzystania do optymalizacji początkowego rozmiaru pobierania przykładowej aplikacji rynkowej.
| Opcja dostawy | Zachowanie | Przykładowy przypadek użycia | Pierwsze kroki |
|---|---|---|---|
| Dostarczanie w czasie instalacji | Moduły funkcji, które nie mają skonfigurowanych żadnych opcji dostarczania opisanych powyżej, są domyślnie pobierane podczas instalacji aplikacji. Jest to ważne, ponieważ oznacza, że możesz stopniowo wdrażać zaawansowane opcje dostawy. Na przykład możesz 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.
Możesz też poprosić o odinstalowanie funkcji w późniejszym czasie. Jeśli więc potrzebujesz pewnych 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 zawiera pewne 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 zakończeniu szkolenia przez użytkownika. |
Zastosuj w aplikacji moduły, używając 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órych użytkownik może już nie potrzebować, przeczytaj artykuł o zarządzaniu zainstalowanymi modułami. |
| Dostawa na żądanie | Umożliwia aplikacji żądanie i pobieranie modułów funkcji w razie potrzeby. | Jeśli tylko 20% użytkowników aplikacji rynkowej wystawia produkty na sprzedaż, dobrą strategią na zmniejszenie początkowego rozmiaru pobierania dla większości użytkowników jest udostępnienie funkcji robienia zdjęć, dodawania opisu i wystawiania produktu na sprzedaż jako pobierania na żądanie. Oznacza to, że możesz skonfigurować moduł funkcji sprzedaży w aplikacji tak, aby był pobierany tylko wtedy, gdy użytkownik wyrazi zainteresowanie wystawieniem produktów na sprzedaż na platformie handlowej.
Dodatkowo, jeśli użytkownik nie sprzedaje już produktów po upływie określonego czasu, aplikacja może zmniejszyć swój rozmiar, prosząc o odinstalowanie tej funkcji. |
Utwórz moduł funkcji i skonfiguruj dostarczanie na żądanie. Aplikacja może wtedy użyć biblioteki Play Feature Delivery, aby poprosić o pobranie modułu na żądanie. |
| Dostarczanie 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 rynkowa ma zasięg globalny, może być konieczne obsługiwanie form płatności, które są popularne tylko w niektórych regionach lub lokalizacjach. Aby zmniejszyć początkowy rozmiar aplikacji do pobrania, możesz utworzyć osobne moduły funkcji do przetwarzania określonych typów form płatności i zainstalować je warunkowo na urządzeniu użytkownika na podstawie zarejestrowanego regionu. | Utwórz moduł funkcji i skonfiguruj dostarczanie 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” w Sklepie Google Play lub utworzony przez Ciebie adres URL. Taka forma dostarczania treści ułatwia zwiększanie zaangażowania użytkowników aplikacji.
Dzięki dostawie błyskawicznej możesz wykorzystać aplikację błyskawiczną w Google Play, aby umożliwić użytkownikom natychmiastowe korzystanie z określonych funkcji aplikacji bez konieczności jej instalowania. |
Weźmy pod uwagę grę, która zawiera kilka pierwszych poziomów w lekkim module funkcji. Możesz włączyć obsługę wersji błyskawicznej w tym module, aby użytkownicy mogli natychmiast wypróbować grę za pomocą linku URL lub przycisku „Wypróbuj” bez konieczności instalowania aplikacji. | Utwórz moduł funkcji i skonfiguruj błyskawiczne dostarczanie. Aplikacja może wtedy 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 obsługiwać Aplikację błyskawiczną w Google Play, rozmiar pobieranego modułu podstawowego aplikacji i danej funkcji z obsługą wersji błyskawicznej musi spełniać rygorystyczne wymagania dotyczące rozmiaru. Więcej informacji znajdziesz w artykule Włączanie wersji 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, oto jak 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 załadowaniu dzielonych pakietów APK.
Aby zobaczyć, jak generowany jest identyfikator 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 we fragmencie kodu powyżej odnosi się do nieprzetworzonego zasobu pliku o nazwie „my_video” w module funkcji, kod Uri.Builder() powyżej wygeneruje następujące dane wyjściowe:
android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video
Aplikacja może następnie 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, który pozwala sprawdzić plik APK modułu funkcji i określić nazwę pakietu:
Uwagi dotyczące modułów funkcji
Dzięki modułom funkcji możesz zwiększyć szybkość kompilacji i przyspieszyć pracę inżynierów, a także dostosować dostarczanie funkcji aplikacji, aby zmniejszyć jej rozmiar. Podczas korzystania z modułów funkcji należy jednak pamiętać o pewnych ograniczeniach i przypadkach skrajnych:
- Zainstalowanie co najmniej 50 modułów funkcji na jednym urządzeniu za pomocą dostarczania warunkowego lub na żądanie może spowodować problemy z wydajnością. Moduły instalowane podczas instalacji, które nie są skonfigurowane jako możliwe do usunięcia, są automatycznie uwzględniane w module podstawowym i liczą się jako 1 moduł funkcji na każdym urządzeniu.
- Ogranicz liczbę modułów, które konfigurujesz jako możliwe do usunięcia w przypadku pobierania w czasie instalacji, do maksymalnie 10. W przeciwnym razie czas pobierania i instalowania aplikacji może się wydłużyć.
- Tylko urządzenia z Androidem 5.0 (poziom interfejsu API 21) lub nowszym obsługują pobieranie i instalowanie funkcji na żądanie. Aby funkcja była dostępna 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ć w pliku manifestu aktywności z atrybutem
android:exportedustawionym natrue. 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. - Ponieważ funkcja Play Feature Delivery wymaga opublikowania aplikacji za pomocą pakietu aplikacji, zapoznaj się ze znanymi problemami z pakietami aplikacji.
Plik manifestu modułu funkcji
Gdy tworzysz nowy moduł funkcji za pomocą Android Studio, IDE zawiera większość atrybutów manifestu, których moduł potrzebuje, aby działać jak moduł funkcji. Dodatkowo niektóre atrybuty są wstrzykiwane przez system kompilacji podczas kompilowania, 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 | To jest 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 tworzy pakiet aplikacji, uwzględnia ten atrybut. Dlatego nie należy samodzielnie dodawać ani modyfikować tego atrybutu.
Definiuje nazwę modułu, którą aplikacja określa, gdy żąda 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.
Gdy tworzysz pakiet aplikacji, Gradle używa ostatniego elementu ścieżki podprojektu, aby wstawić ten atrybut manifestu do pliku manifestu modułu. Jeśli na przykład utworzysz nowy moduł funkcji w katalogu |
| android:isFeatureSplit="true | false"> |
Gdy Android Studio tworzy pakiet aplikacji, uwzględnia ten atrybut. Dlatego nie należy dodawać ani modyfikować tego atrybutu ręcznie.
Określa, że ten moduł jest modułem funkcji.
Pliki manifestu w module podstawowym i konfiguracyjnych plikach APK pomijają ten atrybut lub ustawiają go na |
| <dist:module | Definiuje atrybuty, które określają, jak moduł jest pakowany i rozpowszechniany jako pliki APK. |
| dist:instant="true | false" |
Określa, czy moduł powinien być dostępny w aplikacji błyskawicznej w Google Play jako aplikacja błyskawiczna.
Jeśli aplikacja zawiera co najmniej 1 moduł funkcji z obsługą wersji błyskawicznej, 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 zrobi to za Ciebie, gdy utworzysz moduł funkcji z obsługą wersji błyskawicznej. Nie możesz ustawić tego elementu XML na |
| dist:title="@string/feature_name"> |
Określa tytuł modułu widoczny dla użytkownika. Urządzenie może na przykład wyświetlać ten tytuł, gdy prosi o potwierdzenie pobrania.
Musisz uwzględnić zasób tekstowy dla tego tytułu w pliku |
| <dist:fusing dist:include="true | false" /> |
Określa, czy moduł ma być uwzględniany w plikach multi-APK kierowanych na urządzenia z Androidem 4.4 (API na poziomie 20) lub starszym.
Dodatkowo, gdy
używasz narzędzia |
| <dist:delivery> | Zawiera opcje dostosowywania dostarczania modułu, jak pokazano poniżej. Pamiętaj, że każdy moduł funkcji musi mieć skonfigurowany tylko 1 typ tych niestandardowych opcji dostarczania. |
| <dist:install-time> |
Określa, że moduł powinien być dostępny w momencie instalacji. Jest to działanie domyślne w przypadku modułów funkcji, które nie określają innego typu niestandardowej opcji dostarczania.
Aby dowiedzieć się więcej o pobieraniu w czasie instalacji, przeczytaj artykuł o konfigurowaniu 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 lub minimalny poziom interfejsu API. Więcej informacji znajdziesz w artykule Konfigurowanie dostawy warunkowej. |
| <dist:removable dist:value="true | false" /> |
Jeśli ta opcja jest nieskonfigurowana lub ustawiona na Gdy zasada Domyślna wartość to Uwaga: ta funkcja jest dostępna tylko wtedy, gdy używasz wtyczki Androida do obsługi Gradle w wersji 4.2 lub narzędzia bundletool w wersji 1.0 w wierszu 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 pobieraniu na żądanie znajdziesz w artykule Konfigurowanie dostarczania 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 jest później kompilowany do formatu pliku DEX, musisz wykonać te czynności (w przeciwnym razie mogą wystąpić błędy środowiska wykonawczego):
|
| ... </manifest> |
Dodatkowe materiały
Więcej informacji o korzystaniu z modułów funkcji znajdziesz w tych materiałach.
Posty na blogu
- Nowe funkcje, które pomogą Ci tworzyć i publikować aplikacje oraz rozwijać firmę w Google Play
- Najnowsze aktualizacje pakietu Android App Bundle, w tym interfejs API dodatkowych języków
- Patchwork Plaid – A modularization story
Filmy
- Dostarczanie treści z możliwością personalizacji dzięki pakietowi aplikacji i łatwe udostępnianie kompilacji testowych
- Nowe narzędzia do optymalizacji rozmiaru aplikacji i zwiększania liczby instalacji w Google Play
Warunki korzystania z usługi i bezpieczeństwo danych
Korzystając z biblioteki Play Feature Delivery, akceptujesz Warunki korzystania z pakietu SDK podstawowej biblioteki Play. Zanim uzyskasz dostęp do biblioteki, przeczytaj i zrozum wszystkie obowiązujące warunki i zasady.
Bezpieczeństwo danych
Podstawowe biblioteki Play to interfejs środowiska wykonawczego Twojej aplikacji w Sklepie Google Play. W związku z tym, gdy używasz Play Core w aplikacji, Sklep Play uruchamia własne procesy, które obejmują obsługę danych zgodnie z Warunkami korzystania z usługi Google Play. Poniżej znajdziesz informacje o tym, jak podstawowe biblioteki Play przetwarzają dane, aby obsługiwać określone żądania z Twojej aplikacji.
Interfejs API dodatkowych języków
| Dane zbierane podczas 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ą szyfrowane. |
| 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 podczas korzystania z usługi |
Metadane urządzenia Wersja aplikacji |
| Cel zbierania danych | Zebrane dane są używane do udostępniania odpowiedniego modułu na urządzeniu oraz do zachowywania zainstalowanych modułów po aktualizacji, utworzeniu kopii zapasowej i przywróceniu. |
| Szyfrowanie danych | Dane są szyfrowane. |
| 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ę.