Obsługa wersji to kluczowy element strategii uaktualniania i utrzymywania aplikacji. Przechowywanie wersji jest ważne, ponieważ:
- Użytkownicy muszą mieć konkretne informacje o wersji aplikacji zainstalowanej na ich urządzeniach oraz o wersjach licencji dostępnych do zainstalowania.
- Inne aplikacje, w tym te, które publikujesz w ramach pakietu, muszą wysyłać do systemu zapytanie o wersję aplikacji, aby ustalić jej zgodność i określić zależności.
- Usługi, w których publikujesz aplikację, mogą również wymagać sprawdzenia wersji aplikacji, aby wyświetlić ją użytkownikom. Usługa publikowania może też sprawdzać wersję aplikacji, aby określić zgodność i nawiązać relacje między przejściem na wyższą a niższą wersję.
System Android wykorzystuje informacje o wersji aplikacji, aby chronić Cię przed przejściem na niższą wersję. System nie używa informacji o wersji aplikacji do egzekwowania ograniczeń dotyczących uaktualnień czy zgodności aplikacji innych firm. Twoja aplikacja musi egzekwować wszelkie ograniczenia wersji i informować o nich użytkowników.
System Android wymusza zgodność wersji systemu, zgodnie z ustawieniem minSdk
w plikach kompilacji. To ustawienie pozwala aplikacji określić minimalny interfejs API systemu, z którym jest zgodna.
Więcej informacji o wymaganiach dotyczących interfejsu API znajdziesz w artykule Określanie wymagań dotyczących poziomu interfejsu API.
Wymagania dotyczące obsługi wersji różnią się w zależności od projektu. Wielu deweloperów uważa jednak semantyczną obsługę wersji jako dobrą podstawę strategii obsługi wersji.
Ustawianie informacji o wersji aplikacji
Aby określić informacje o wersji aplikacji, ustaw wartości dla ustawień wersji w plikach kompilacji Gradle:
Odlotowy
android { namespace 'com.example.testapp' compileSdk 33 defaultConfig { applicationId "com.example.testapp" minSdk 24 targetSdk 33 versionCode 1 versionName "1.0" ... } ... } ...
Kotlin
android { namespace = "com.example.testapp" compileSdk = 33 defaultConfig { applicationId = "com.example.testapp" minSdk = 24 targetSdk = 33 versionCode = 1 versionName = "1.0" ... } ... } ...
Ustawienia wersji
Określ wartości dla obu dostępnych ustawień wersji: versionCode
i versionName
.
versionCode
- Dodatnia liczba całkowita używana jako wewnętrzny numer wersji.
Ta liczba pomaga określić, czy poszczególne wersje są nowsze od innych. Wyższe liczby oznaczają nowsze wersje. To nie jest numer wersji wyświetlany użytkownikom. Ten numer jest określany w ustawieniu
versionName
. System Android używa wartościversionCode
, by chronić użytkowników przed przejściem na niższą wersję, ponieważ uniemożliwia użytkownikom instalowanie pliku APK z wartościąversionCode
niższą niż ta zainstalowana na urządzeniu.Wartość jest dodatnią liczbą całkowitą, aby inne aplikacje mogły ją automatycznie ocenić, na przykład aby sprawdzić relację przejścia na wyższą lub niższą wersję usługi. Możesz ustawić dowolną dodatnią liczbę całkowitą. Zadbaj jednak o to, by każda kolejna wersja aplikacji miała wyższą wartość.
Uwaga: największa wartość
versionCode
w Google Play to 2 100 000 000.Nie możesz przesłać do Sklepu Play pliku APK za pomocą kodu
versionCode
użytego już w poprzedniej wersji.Uwaga: w niektórych sytuacjach możesz przesłać wersję aplikacji, która ma parametr
versionCode
niższy niż najnowsza wersja. Jeśli na przykład publikujesz wiele plików APK, możesz mieć gotowe zakresyversionCode
dla poszczególnych plików APK. Więcej informacji o przypisywaniu wartościversionCode
do wielu plików APK znajdziesz w sekcji Przypisywanie kodów wersji.Zazwyczaj publikujesz pierwszą wersję aplikacji z wartością
versionCode
ustawioną na 1, a następnie monotonicznie zwiększasz tę wartość z każdą wersją aplikacji niezależnie od tego, czy jest ona wersją główną czy podrzędną. Oznacza to, że wartośćversionCode
nie musi być podobna do wersji aplikacji, którą widzi użytkownik. Aplikacje i usługi publikowania nie powinny wyświetlać użytkownikom tej wartości. versionName
Ciąg znaków używany jako numer wersji wyświetlany użytkownikom. To ustawienie można określić jako ciąg nieprzetworzony lub jako odwołanie do zasobu tekstowego.
Wartość jest ciągiem znaków, dzięki czemu możesz opisać wersję aplikacji w postaci ciągu <główna>.<podrzędny>.<punkt> lub jako dowolny inny typ bezwzględnego bądź względnego identyfikatora wersji.
versionName
jest jedyną wartością wyświetlaną użytkownikom.
Zdefiniuj wartości wersji
Możesz zdefiniować wartości domyślne tych ustawień, umieszczając je w bloku defaultConfig {}
, zagnieżdżonym w bloku android {}
pliku build.gradle
lub build.gradle.kts
modułu. Następnie możesz zastąpić te wartości domyślne dla różnych wersji aplikacji, definiując osobne wartości dla poszczególnych typów kompilacji lub rodzajów usług. Poniższy plik zawiera ustawienia versionCode
i versionName
w bloku defaultConfig {}
oraz blok productFlavors {}
.
Wartości te są następnie łączone z plikiem manifestu aplikacji podczas kompilacji.
Odlotowy
android { ... defaultConfig { ... versionCode 2 versionName "1.1" } productFlavors { demo { ... versionName "1.1-demo" } full { ... } } }
Kotlin
android { ... defaultConfig { ... versionCode = 2 versionName = "1.1" } productFlavors { create("demo") { ... versionName = "1.1-demo" } create("full") { ... } } }
W bloku defaultConfig {}
w tym przykładzie wartość versionCode
wskazuje, że bieżący plik APK zawiera drugą wersję aplikacji, a ciąg versionName
wskazuje, że użytkownikom będzie ona wyświetlana w wersji 1.1. Ten plik definiuje również 2 rodzaje produktu: „demo” i „full”. Typ produktu „demonstracyjny” definiuje versionName
jako „1.1-demo”, dlatego kompilacja „demonstracyjna” używa tego versionName
zamiast wartości domyślnej.
„Pełny” blok smaku produktu nie definiuje elementu versionName
, dlatego używana jest wartość domyślna „1.1”.
Uwaga: jeśli aplikacja definiuje wersję aplikacji bezpośrednio w elemencie <manifest>
, wartości wersji w pliku kompilacji Gradle zastępują ustawienia w pliku manifestu. Poza tym zdefiniowanie tych ustawień w plikach kompilacji Gradle umożliwia określenie różnych wartości dla różnych wersji aplikacji. Aby zapewnić większą elastyczność i uniknąć potencjalnego zastąpienia podczas scalania pliku manifestu, usuń te atrybuty z elementu <manifest>
i określ ustawienia wersji w plikach kompilacji Gradle.
Platforma Android udostępnia interfejs API, który umożliwia wysyłanie do systemu zapytań o informacje o wersji aplikacji. Aby uzyskać informacje o wersji, użyj metody
PackageManager.getPackageInfo(java.lang.String, int)
.
Określ wymagania dotyczące poziomu interfejsu API
Jeśli Twoja aplikacja wymaga określonej minimalnej wersji platformy Androida, możesz określić ten wymóg w ustawieniach na poziomie interfejsu API w pliku build.gradle
lub build.gradle.kts
aplikacji. Podczas kompilacji ustawienia te są scalane z plikiem manifestu aplikacji. Określenie wymagań dotyczących poziomu interfejsu API sprawi, że Twoją aplikację będzie można instalować tylko na urządzeniach z zgodną wersją platformy Androida.
Uwaga: jeśli wymagania dotyczące poziomu interfejsu API określisz bezpośrednio w pliku manifestu aplikacji, ustawienia w pliku manifestu zastąpią odpowiednie ustawienia w plikach kompilacji. Poza tym zdefiniowanie tych ustawień w plikach kompilacji Gradle umożliwia określenie różnych wartości dla różnych wersji aplikacji. Aby zapewnić większą elastyczność i uniknąć potencjalnego zastąpienia podczas scalania pliku manifestu, usuń te atrybuty z elementu <uses-sdk>
i określ ustawienia poziomu interfejsu API w plikach kompilacji Gradle.
Dostępne są 2 ustawienia na poziomie interfejsu API:
minSdk
– minimalna wersja platformy Androida, na której będzie działać aplikacja, określona za pomocą identyfikatora poziomu interfejsu API platformy.targetSdk
– poziom interfejsu API, na którym ma działać aplikacja. W niektórych przypadkach pozwala to aplikacji korzystać z elementów manifestu lub zachowań zdefiniowanych na docelowym poziomie interfejsu API, zamiast ograniczać się tylko do tych zdefiniowanych na minimalnym poziomie interfejsu API.
Aby określić domyślne wymagania dotyczące poziomu interfejsu API w pliku build.gradle
lub build.gradle.kts
, dodaj co najmniej 1 ustawienie na poziomie interfejsu API do bloku defaultConfig{}
umieszczonego w bloku android {}
. Możesz też zastąpić te wartości domyślne w przypadku różnych wersji aplikacji, dodając ustawienia do typów kompilacji lub rodzajów usług.
Ten plik określa domyślne ustawienia minSdk
i targetSdk
w bloku defaultConfig {}
oraz zastępuje minSdk
w przypadku jednego rodzaju produktu:
Odlotowy
android { ... defaultConfig { ... minSdk 21 targetSdk 33 } productFlavors { main { ... } afterNougat { ... minSdk 24 } } }
Kotlin
android { ... defaultConfig { ... minSdk = 21 targetSdk = 33 } productFlavors { create("main") { ... } create("afterNougat") { ... minSdk = 24 } } }
Przygotowując się do zainstalowania aplikacji, system sprawdza wartości tych ustawień i porównuje je z wersją systemu. Jeśli wartość minSdk
jest większa niż wersja systemu, system uniemożliwia instalację aplikacji.
Jeśli nie określisz tych ustawień, system przyjmie, że aplikacja jest zgodna ze wszystkimi wersjami platformy. Jest to odpowiednik ustawienia minSdk
na 1
.
Więcej informacji znajdziesz w artykule Co to jest poziom interfejsu API?. Informacje o ustawieniach kompilacji Gradle znajdziesz w artykule o konfigurowaniu wariantów kompilacji.