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.
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 uwzględnić w konfiguracji kompilacji modułu funkcji, oraz te, których nie należy uwzględniać.
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. Dlatego w pliku build.gradle
modułu funkcji pomiń te punkty:
- 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. versionCode
iversionName
: 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 plikubuild.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 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śl dodatkowe reguły 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'
}
}
Zwróć uwagę, że te reguły ProGuard są scalane z regułami z innych modułów (w tym modułu podstawowego) w czasie 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:
- Na pasku menu kliknij Uruchom > Edytuj konfiguracje.
- W lewym panelu okna Konfiguracje uruchamiania/debugowania wybierz odpowiednią konfigurację aplikacji na Androida.
- 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.
- 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
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 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 do tworzenia modułowych funkcji, które można skonfigurować tak, aby były pobierane w miarę 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 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 podczas 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 zaimplementowaniu 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 określone 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, aplikacja może poprosić o usunięcie funkcji po zakończeniu trenowania użytkownika. |
Modułowa budowa aplikacji za pomocą 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 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 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, język i minimalny poziom interfejsu API, aby określić, czy funkcja modułowa jest pobierana 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 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 przesyłania treści ułatwia zwiększanie zaangażowania użytkowników w 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, rozmiar pliku do pobrania podstawowego modułu aplikacji i konkretnej funkcji obsługiwanej błyskawicznie musi spełniać ścisłe ograniczenia rozmiaru. 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ą interfejsu 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.
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:
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:
- 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ł 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ądzenie.
- Ogranicz liczbę modułów skonfigurowanych jako wymienne w ramach dostarczania 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ć 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ł 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 gwarancji, że urządzenie pobrało moduł funkcji, gdy inna aplikacja próbuje uruchomić działanie. 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. - Usługa Play Feature Delivery wymaga opublikowania aplikacji za pomocą pakietu aplikacji, dlatego pamiętaj o znanych problemach z takimi pakietami.
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. 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 opisano atrybuty pliku manifestu, które są ważne dla 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 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 |
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 |
<dist:module |
Ten nowy element XML definiuje 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 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. Gdy używasz Android Studio 3.5 lub nowszej wersji, IDE wykona to za Ciebie, gdy utworzysz moduł funkcji z natychmiastową aktywacją. Nie możesz ustawić tego elementu XML na |
dist:title="@string/feature_name" |
Określa tytuł modułu widoczny dla użytkownika. Na przykład urządzenie może wyświetlić ten tytuł, gdy poprosi o potwierdzenie pobierania.
Musisz uwzględnić zasób ciągu znaków dla tego tytułu w pliku |
<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 |
<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 działanie w przypadku modułów funkcji, które nie określają innego typu niestandardowej opcji dostarczania.
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" /> |
Gdy zasada jest nieskonfigurowana lub ma wartość Jeśli zasada Domyślna wartość to 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> |
|
<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):
|
Dodatkowe materiały
Więcej informacji o używaniu modułów funkcji znajdziesz w tych materiałach.
Posty na blogu
- Nowe funkcje, które pomogą Ci tworzyć i publikować aplikacje oraz rozwijać swoją firmę w Google Play
- Najnowsze aktualizacje pakietów aplikacji na Androida, w tym interfejs API dodatkowych języków
- Patchwork Plaid – historia modułowości
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
Korzystanie z biblioteki funkcji Play Feature Delivery 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ą obsługę 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 ustalonym okresie przechowywania. |
Play Feature Delivery
Dane o użytkowaniu |
Metadane urządzenia Wersja aplikacji |
Cel zbierania danych | Zebrane 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ę.