Przesyłany plik APK musi spełniać wymagania Google Play dotyczące docelowego poziomu interfejsu API.
Od 31 sierpnia 2023 r.:
Nowe aplikacje muszą być kierowane na Androida w wersji 13 (poziom API 33) lub nowszej. Nie dotyczy to aplikacji na Wear OS, które muszą być kierowane na wersje od 11 (poziom interfejsu API 30) do 13 (poziom API 33) włącznie.
Aktualizacje aplikacji muszą być kierowane na Androida 13 lub nowszego i dostosowywać się do zmian w działaniu Androida 13. Nie dotyczy to aplikacji na Wear OS, które muszą być kierowane na Androida 11.
Aplikacje trwale prywatne – dostępne tylko dla użytkowników w konkretnej organizacji i przeznaczone tylko do dystrybucji wewnętrznej – nie muszą spełniać wymagań dotyczących docelowego poziomu interfejsu API.
Dlaczego warto kierować reklamy na nowsze pakiety SDK?
Każda nowa wersja Androida wprowadza zmiany, które poprawiają bezpieczeństwo i wydajność oraz zwiększają wygodę użytkowników Androida. Niektóre z tych zmian dotyczą tylko aplikacji, które jawnie deklarują obsługę za pomocą atrybutu manifestu targetSdkVersion
(nazywanego też docelowym poziomem interfejsu API).
Kierowanie aplikacji na aktualny poziom interfejsu API zapewnia użytkownikom korzyści z tych ulepszeń. Aplikacja nadal będzie działać na starszych wersjach Androida. Kierowanie na aktualny poziom interfejsu API umożliwia też aplikacji korzystanie z najnowszych funkcji platformy, aby zadowolić użytkowników. Poza tym na Androidzie 10 (poziom interfejsu API 29) użytkownicy wyświetlają ostrzeżenie przy pierwszym uruchomieniu aplikacji, jeśli jest ona kierowana na Androida 5.1 (poziom interfejsu API 22) lub niższy.
W tym dokumencie znajdziesz ważne informacje, które musisz wiedzieć, aby zaktualizować docelowy poziom interfejsu API, aby spełniał wymagania Google Play. W zależności od wersji, do której przenosisz dane, zapoznaj się z instrukcjami w poniższych sekcjach.
.Migracja z Androida 12 (poziom interfejsu API 31) na Androida 13 (poziom API 33)
Aby zaktualizować aplikację, aby była kierowana na Androida 13, wykonaj te czynności.
Migracja z Androida 11 (poziom interfejsu API 30) na Androida 12 (poziom API 31)
Zabezpieczenia i uprawnienia
- Bluetooth: deklaracje uprawnień
BLUETOOTH
iBLUETOOTH_ADMIN
musisz zastąpić uprawnieniamiBLUETOOTH_SCAN
,BLUETOOTH_ADVERTISE
lubBLUETOOTH_CONNECT
. Nie musisz już wysyłać żądań uprawnieńLOCATION
w czasie działania w przypadku operacji Bluetooth. - Lokalizacja: użytkownicy mogą prosić aplikacje o dostęp tylko do przybliżonej lokalizacji. Zawsze, gdy prosisz o dostęp do
ACCESS_FINE_LOCATION
, musisz poprosić o uprawnienieACCESS_COARSE_LOCATION
.- Filtry intencji: jeśli aplikacja zawiera aktywności, usługi lub odbiorniki transmisji, które używają filtrów intencji, musisz wyraźnie zadeklarować atrybut android:exported dla tych komponentów.
- Hibernacja: aplikacje mogą przejść w tryb hibernacji, jeśli nie są używane przez określony czas. W trybie hibernacji uprawnienia czasu działania oraz pamięć podręczna aplikacji są resetowane i nie możesz uruchamiać zadań ani alertów. Możesz sprawdzić stan hibernacji aplikacji.
- Oczekująca zmienność intencji: musisz określić zmienność każdego obiektu PendingIntent tworzonego przez aplikację.
Interfejs użytkownika
- Powiadomienia niestandardowe: powiadomienia z niestandardowymi widokami treści nie będą już korzystać z pełnego obszaru powiadomień. Zamiast tego system zastosuje szablon standardowy. Ten szablon gwarantuje, że powiadomienia niestandardowe
mają taki sam wygląd jak inne powiadomienia we wszystkich stanach. Jest to zachowanie niemal identyczne jak w przypadku
Notification.DecoratedCustomViewStyle
. - Zmiany dotyczące weryfikacji linków aplikacji na Androida: jeśli korzystasz z weryfikacji linku aplikacji na Androida, upewnij się, że filtry intencji zawierają kategorię BROWSABLE i obsługują schemat HTTPS.
Wydajność
Ograniczenia dotyczące uruchamiania usług działających na pierwszym planie: jeśli chcesz kierować użytkowników na Androida 12 lub nowszego, aplikacja nie może uruchamiać usług działających w tle (z wyjątkiem kilku szczególnych przypadków). Jeśli aplikacja próbuje uruchomić usługę na pierwszym planie, gdy działa w tle, występuje wyjątek (z wyjątkiem kilku szczególnych przypadków).
Rozważ użycie WorkManagera do planowania i uruchamiania szybkiej pracy, gdy aplikacja działa w tle. Aby wykonać zależne od czasu działania, o które prosi użytkownik, uruchom usługi na pierwszym planie w ramach konkretnego alarmu.
Ograniczenia trampoliny: gdy użytkownik klika powiadomienia, niektóre aplikacje reagują, uruchamiając komponent, który rozpoczyna działanie, które użytkownik widzi i z którym wchodzi w interakcję. Ten komponent aplikacji jest nazywany trampoliną powiadomień.
Aplikacje nie mogą rozpoczynać działań z usług lub odbiorników, które są używane jako trampoliny z powiadomieniami. Gdy użytkownik kliknie w powiadomieniu przycisk powiadomienia lub działania, aplikacja nie będzie mogła wywołać funkcji
startActivity()
w usłudze ani odbiorniku.
Zobacz pełny zestaw zmian, które wpływają na aplikacje kierowane na Androida 12 (poziom interfejsu API 31).
Migracja z Androida niższego niż 11 (poziom API 30)
Wybierz wersję Androida, z której chcesz przeprowadzić migrację:
Przejdź na Androida 5 (poziom API 21)
Zapoznaj się z odpowiednimi stronami Zmiany w działaniu każdej z poniższych wersji, aby się upewnić, że Twoja aplikacja uwzględnia zmiany wprowadzone w tych wersjach:
Kontynuuj, postępując zgodnie z instrukcjami w następnej sekcji.
Przejdź na Androida 6 (poziom API 23)
W przypadku aplikacji kierowanych na Androida 6.0 i nowsze wersje platformy należy pamiętać o tych kwestiach:
-
-
Niebezpieczne uprawnienia są przyznawane tylko w czasie działania. Przepływy interfejsu użytkownika muszą zapewniać uprawnienia umożliwiające przyznawanie tych uprawnień.
-
W miarę możliwości upewnij się, że aplikacja jest przygotowana na odrzucenie próśb o przyznanie uprawnień. Jeśli na przykład użytkownik odrzuci prośbę o dostęp do GPS-a, upewnij się, że aplikacja ma inny sposób postępowania.
-
Pełną listę zmian wprowadzonych w Androidzie 6.0 (poziom interfejsu API 23) znajdziesz na stronie Zmiany w działaniu w danej wersji platformy.
Kontynuuj, postępując zgodnie z instrukcjami w następnej sekcji.
Przejdź na Androida 7 (poziom API 24)
W przypadku aplikacji kierowanych na Androida 7.0 i nowsze wersje platformy należy pamiętać o tych kwestiach:
-
Uśpienie i czuwanie aplikacji
Projektowanie pod kątem zachowań opisanych w artykule Optymalizacja pod kątem funkcji uśpienia i czuwania aplikacji, która obejmuje stopniowe zmiany wprowadzane w kilku wersjach platformy.
Gdy urządzenie jest w trybie uśpienia i trybie czuwania aplikacji, system działa w następujący sposób:
- Ogranicza dostęp do sieci
- Odkłada alarmy, synchronizacje i zadania
- Ogranicza skanowanie GPS i Wi-Fi
- Ogranicza wiadomości Komunikacji w chmurze Firebase (Firebase) o normalnym priorytecie.
-
Zmiany uprawnień
- System ogranicza dostęp do katalogów prywatnych aplikacji.
-
Ujawnienie identyfikatora URI
file://
poza aplikacją powoduje wywołanieFileUriExposedException
. Jeśli chcesz udostępniać pliki poza aplikacją, zaimplementuj funkcjęFileProvider
-
System zabrania łączenia z bibliotekami innymi niż NDK.
Pełną listę zmian wprowadzonych w Androidzie 7.0 (poziom interfejsu API 24) znajdziesz na stronie Zmiany w działaniu w danej wersji platformy.
Kontynuuj, postępując zgodnie z instrukcjami w następnej sekcji.
Przejdź na Androida 8 (poziom API 26)
W przypadku aplikacji kierowanych na Androida 8.0 i nowsze wersje platformy należy pamiętać o tych kwestiach:
-
Limity wykonywania w tle
-
System ogranicza dostęp do usług aplikacjom, które nie działają na pierwszym planie.
-
startService()
teraz zgłasza wyjątek, gdy aplikacja próbuje ją wywołać, mimo żestartService()
jest zabroniona. -
Aby można było uruchomić usługi działające na pierwszym planie, aplikacja musi używać interfejsów
startForeground()
istartForegroundService()
. - Uważnie przejrzyj zmiany wprowadzone w interfejsie JobScheduler API zgodnie z opisem na stronie Zmiany zachowania w Androidzie 8.0 (poziom interfejsu API 26).
- Komunikacja w chmurze Firebase (FCM) wymaga pakietu SDK Usług Google Play w wersji 10.2.1 lub nowszej.
- W przypadku korzystania z Komunikacji w chmurze Firebase dostarczanie wiadomości podlega limitom wykonywania w tle. Jeśli po otrzymaniu wiadomości wymagana jest praca w tle, na przykład do synchronizacji danych w tle, aplikacja powinna planować zadania za pomocą usługi Firebase Job Dispatcher lub JobIntentService. Więcej informacji znajdziesz w dokumentacji Komunikacji w chmurze Firebase (FCM).
-
-
Komunikaty pośrednie:
-
Komunikaty niejawne są ograniczone. Informacje o obsłudze zdarzeń w tle znajdziesz w dokumentacji interfejsu API
JobScheduler
.
-
Komunikaty niejawne są ograniczone. Informacje o obsłudze zdarzeń w tle znajdziesz w dokumentacji interfejsu API
-
Limity lokalizacji w tle
-
Aplikacje działające w tle mają ograniczony dostęp do danych o lokalizacji.
- Na urządzeniach z Usługami Google Play korzystaj z usług dostawcy uśrednionej lokalizacji, aby okresowo otrzymywać aktualne informacje o lokalizacji.
-
Aplikacje działające w tle mają ograniczony dostęp do danych o lokalizacji.
-
System ogranicza dostęp do usług aplikacjom, które nie działają na pierwszym planie.
-
Kanały powiadomień
- Właściwości wyświetlania powiadomień należy zdefiniować dla poszczególnych kanałów.
- Aby powiadomienia się wyświetlały, musisz przypisać je do kanału.
-
Ta wersja platformy obsługuje
NotificationCompat.Builder
.
-
Prywatność
- Identyfikator ANDROID_ID jest ograniczony do każdego klucza podpisywania aplikacji.
Pełną listę zmian wprowadzonych w Androidzie 8.0 (poziom interfejsu API 26) znajdziesz na stronie Zmiany w działaniu w danej wersji platformy.
Migracja z Androida 8 (API 26) na Androida 9 (API 28)
-
Zarządzanie zasilaniem
- Zasobniki gotowości aplikacji wprowadzają nowe ograniczenia w tle oparte na zaangażowaniu użytkowników w aplikację, takie jak odroczone zadania, alarmy i limity dotyczące wiadomości o wysokim priorytecie
- Ulepszenia oszczędzania baterii zwiększają ograniczenia dotyczące aplikacji w trybie gotowości
-
Uprawnienia usługi działającej na pierwszym planie
- Potrzebne jest normalne uprawnienie
FOREGROUND_SERVICE
(a nie uprawnienie w czasie działania)
- Potrzebne jest normalne uprawnienie
-
Zmiany dotyczące prywatności
- Ograniczony dostęp do czujników w tle
- Ograniczony dostęp do rejestrów połączeń, teraz w grupie uprawnień
CALL_LOG
- Ograniczony dostęp do numerów telefonów, wymaga uprawnienia
READ_CALL_LOG
- Ograniczony dostęp do informacji o sieciach Wi-Fi
Pełną listę zmian wprowadzonych w Androidzie 9.0 (poziom interfejsu API 28) znajdziesz w sekcji Zmiany w działaniu.
Migracja z Androida 9 (poziom interfejsu API 28) na Androida 10 (poziom API 29)
-
Powiadomienia
wyświetlane w trybie pełnoekranowym
-
Musisz poprosić o zwykłe uprawnienia
USE_FULL_SCREEN_INTENT
(a nie uprawnienia w czasie działania).
-
Musisz poprosić o zwykłe uprawnienia
-
Obsługa urządzeń składanych i urządzeń z dużym ekranem.
-
Kilka działań może mieć teraz stan „wznowione” w tym samym czasie, ale tylko jedna z nich będzie się skupiać.
-
Ta zmiana wpływa na działanie
onResume()
ionPause()
. -
Nowa koncepcja cyklu życia dotycząca „najwyższego wznowienia”, którą można wykryć, subskrybując
onTopResumedActivityChanged()
.- Tylko jedno działanie może mieć stan „Najwyższe wznowienie”.
-
Ta zmiana wpływa na działanie
-
Gdy parametr
resizeableActivity
ma wartośćfalse
, aplikacje mogą dodatkowo określićminAspectRatio
, co powoduje automatyczne dodawanie czarnych pasów do aplikacji przy węższych formatach obrazu.
-
Kilka działań może mieć teraz stan „wznowione” w tym samym czasie, ale tylko jedna z nich będzie się skupiać.
-
Zmiany dotyczące prywatności
-
Ograniczone miejsce na dane
- Dostęp do pamięci zewnętrznej jest ograniczony tylko do katalogu specyficznego dla aplikacji i do określonych typów multimediów utworzonych przez aplikację.
-
Ograniczono dostęp do lokalizacji, gdy aplikacja działa w tle, i wymaga uprawnienia
ACCESS_BACKGROUND_LOCATION
. - Ograniczony dostęp do identyfikatorów, których nie można zresetować, takich jak IMEI czy numer seryjny.
-
Ograniczony dostęp do informacji o aktywności fizycznej, takich jak liczba kroków użytkownika, wymaga uprawnienia
ACTIVITY_RECOGNITION
. -
Ograniczony dostęp do niektórych interfejsów API telefonii, Bluetootha i Wi-Fi, który wymaga uprawnień
ACCESS_FINE_LOCATION
. -
Ograniczono dostęp do ustawień Wi-Fi.
- Aplikacje nie mogą już bezpośrednio włączać ani wyłączać sieci Wi-Fi. Muszą to zrobić za pomocą paneli ustawień.
-
Ograniczenia dotyczące inicjowania połączenia z siecią Wi-Fi, które wymagają użycia
WifiNetworkSpecifier
lubWifiNetworkSuggestion
.
-
Ograniczone miejsce na dane
Migracja z Androida 10 (poziom interfejsu API 29) na Androida 11 (poziom API 30)
-
Prywatność
- Wymuszanie ograniczonego dostępu do miejsca na dane : aplikacje powinny korzystać z modelu ograniczonego miejsca na dane, w którym pliki aplikacji, pliki multimedialne oraz inne są zapisywane i otwierane za pomocą specjalnych lokalizacji.
- Automatyczne resetowanie uprawnień: jeśli użytkownicy nie korzystali z aplikacji przez kilka miesięcy, system automatycznie resetuje wrażliwe uprawnienia aplikacji. W większości aplikacji nie powinno to mieć wpływu na działanie aplikacji. Jeśli Twoja aplikacja działa głównie w tle (bez interakcji z użytkownikami), możesz poprosić użytkowników o wyłączenie automatycznego resetowania.
- Dostęp do lokalizacji w tle: aplikacje muszą oddzielnie prosić o dostęp do lokalizacji na pierwszym planie i w tle. Dostęp do lokalizacji w tle można przyznać tylko w ustawieniach aplikacji, a nie w oknach uprawnień w czasie działania.
-
Widoczność pakietu: gdy aplikacja wysyła zapytanie o listę aplikacji i usług zainstalowanych na urządzeniu, zwracana lista jest filtrowana.
- Jeśli korzystasz z usług Zamiana tekstu na mowę lub rozpoznawania mowy, musisz dodać do pliku manifestu elementy zapytań dla usług.
-
Zabezpieczenia
- Skompresowane pliki „resource.arsc” nie są już obsługiwane
- Wymagany jest schemat podpisu pliku APK w wersji 2. Ze względu na zgodność wsteczną deweloperzy powinni nadal podpisywać umowy za pomocą schematu podpisu plików APK w wersji 1.
- Ograniczenie interfejsu innego niż SDK. Korzystanie z interfejsów spoza SDK nie jest zalecane w przypadku aplikacji kierowanych na interfejs API na poziomie 30, ponieważ niektóre z tych interfejsów są teraz zablokowane. Pełną listę zablokowanych interfejsów spoza SDK znajdziesz w artykule Interfejsy spoza SDK, które są teraz blokowane w Androidzie 11.
Pełną listę zmian wprowadzonych w Androidzie 11 (poziom interfejsu API 30) znajdziesz na stronie Zmiany w działaniu.
Przejdź na interfejs API 31, postępując zgodnie z instrukcjami podanymi w poprzedniej sekcji.
Modernizacja aplikacji
Podczas aktualizowania docelowego poziomu interfejsu API swoich aplikacji zastanów się nad wdrożeniem najnowszych funkcji platformy, aby zmodernizować aplikacje i zadowolić użytkowników.
- Rozważ użycie aplikacji CameraX w wersji beta, aby w pełni wykorzystać możliwości aparatu.
- Dzięki komponentom Jetpack możesz postępować zgodnie ze sprawdzonymi metodami, uwolnić się od pisania stałych elementów kodu i uprościć złożone zadania, aby skupić się na tym, na czym najbardziej Ci zależy.
- Używaj Kotlin, aby szybciej i łatwiej pisać aplikacje.
- Przestrzegaj wymagań dotyczących prywatności i przestrzegaj sprawdzonych metod.
- Dodaj obsługę ciemnego motywu do swoich aplikacji.
- Dodaj obsługę nawigacji przy użyciu gestów do swoich aplikacji.
- Przenieś swoją aplikację z Google Cloud Messaging (GCM) do najnowszej wersji Komunikacji w chmurze Firebase (FCM).
- Korzystaj z zaawansowanych funkcji zarządzania oknami.
- Obsługa większych formatów obrazu (ponad 16:9), aby skorzystać z najnowszych osiągnięć sprzętowych. Upewnij się, że rozmiar aplikacji dostosowuje się do dostępnego miejsca na ekranie. Na koniec deklaruj maksymalny współczynnik proporcji. Więcej informacji o maksymalnych współczynnikach proporcji znajdziesz w sekcji Deklarowanie ograniczonej obsługi ekranu.
- Dodaj obsługę wielu okien, aby zwiększyć produktywność aplikacji i zarządzać wieloma wyświetlaczami.
- Jeśli korzystanie z aplikacji w doskonałej formie zminimalizowanej poprawi komfort korzystania z aplikacji, dodaj obsługę obrazu w obrazie.
- Optymalizacja pod kątem urządzeń z wycięciem w wyświetlaczu.
- Nie zakładaj wysokości paska stanu. Zamiast tego użyj właściwości
WindowInsets
iView.OnApplyWindowInsetsListener
. Aby dowiedzieć się więcej, obejrzyj film droidcon NYC 2017. - Nie zakładaj, że aplikacja ma całe okno. Zamiast tego potwierdź jej lokalizację za pomocą właściwości
View.getLocationInWindow()
, a nieView.getLocationOnScreen()
. * Podczas obsługi właściwościMotionEvent
używajMotionEvent.getX()
iMotionEvent.getY()
, a nieMotionEvent.getRawX()
czyMotionEvent.getRawY()
.
Sprawdzanie i aktualizowanie pakietów SDK oraz bibliotek
Upewnij się, że zależności zewnętrznych pakietów SDK obsługują interfejs API 31. Niektórzy dostawcy pakietów SDK publikują go w swoim pliku manifestu, a inni wymagają dodatkowego dochodzenia. Jeśli używasz pakietu SDK, który nie obsługuje interfejsu API 31, podejmij współpracę z dostawcą pakietu SDK w celu rozwiązania problemu.
Pamiętaj też, że targetSdkVersion
Twojej aplikacji lub gry może ograniczać dostęp do prywatnych bibliotek platformy Androida. Więcej informacji znajdziesz w artykule Łączenie aplikacji NDK z bibliotekami platform.
Musisz też sprawdzić wszystkie ograniczenia, które możesz dodać w używanej wersji Biblioteki pomocy Androida. Zawsze musisz zadbać o zgodność głównej wersji biblioteki pomocy na Androida z dokumentacją compileSdkVersion
Twojej aplikacji.
Zalecamy wybranie zasobu targetSdkVersion
mniejszego lub równego wersji głównej Biblioteki pomocy. Zachęcamy do aktualizacji do najnowszej zgodnej biblioteki pomocy, co pozwoli Ci korzystać z najnowszych funkcji zgodności i poprawek błędów.
Testowanie aplikacji
Po odpowiednim zaktualizowaniu poziomu interfejsu API i funkcji interfejsu API musisz przetestować niektóre podstawowe przypadki użycia. Podane niżej sugestie nie są wyczerpujące, ale pomogą Ci pokierować procesem testowania. Zalecamy testowanie:
- Kompilacja aplikacji do interfejsu API 29 nie zawiera błędów ani ostrzeżeń.
Aplikacja ma strategię działającą w przypadkach, gdy użytkownik odrzuca prośbę o przyznanie uprawnień i prosi o nie. Aby to zrobić:
- Otwórz ekran Informacje o aplikacji i wyłącz poszczególne uprawnienia.
- Otwórz aplikację i upewnij się, że nie doszło do awarii.
- Przeprowadź testy głównych przypadków użycia i upewnij się, że wymagane uprawnienia zostały ponownie wysłane.
Obsługa funkcji Uśpienie z oczekiwanymi wynikami i bez błędów.
- Korzystając z adb, umieść urządzenie testowe w uśpieniu, gdy aplikacja jest uruchomiona.
- Przetestuj wszystkie przypadki użycia, które wywołują wiadomości Komunikacji w chmurze Firebase (FCM).
- Przetestuj przypadki użycia, w których są używane alarmy lub zadania.
- Wyeliminuj wszelkie zależności od usług działających w tle.
- Ustawianie aplikacji w trybie gotowości aplikacji
- Przetestuj wszystkie przypadki użycia, które wywołują wiadomości Komunikacji w chmurze Firebase (FCM).
- Przetestuj przypadki użycia, w których są używane Alarmy.
- Korzystając z adb, umieść urządzenie testowe w uśpieniu, gdy aplikacja jest uruchomiona.
Obsługa nowych zdjęć i filmów
- Sprawdź, czy aplikacja prawidłowo obsługuje objęte ograniczeniami
ACTION_NEW_PICTURE
orazACTION_NEW_VIDEO
transmisje (czyli zostały przeniesione do zadań JobScheduler). - Upewnij się, że wszystkie krytyczne przypadki użycia, które zależą od tych zdarzeń, nadal działają.
- Sprawdź, czy aplikacja prawidłowo obsługuje objęte ograniczeniami
Obsługa udostępniania plików innym aplikacjom – przetestuj każdy przypadek użycia, w którym dane plików są udostępniane innej aplikacji (nawet innej aplikacji tego samego dewelopera)
- Sprawdź, czy treść jest widoczna w innej aplikacji i nie powoduje awarii.
Dodatkowe informacje
Wyraź zgodę na otrzymywanie e-maili w Konsoli Google Play, abyśmy mogli wysyłać Ci ważne informacje i powiadomienia dotyczące Androida i Google Play, w tym comiesięczny newsletter dla partnerów.