Platforma Android 13 zawiera zmiany w działaniu, które mogą mieć wpływ na Twoją aplikację. Poniższe zmiany dotyczą wszystkich aplikacji działających na Androidzie 13, niezależnie od targetSdkVersion. Przetestuj aplikację i w razie potrzeby zmodyfikuj ją, aby w odpowiednich przypadkach obsługiwała te działania.
Zapoznaj się też z listą zmian w działaniu, które wpływają tylko na aplikacje kierowane na Androida 13.
Wydajność i bateria
Menedżer zadań
Począwszy od Androida 13 (API na poziomie 33), użytkownicy mogą wykonać w panelu powiadomień działanie, które zatrzyma aplikacje z bieżącymi usługami na pierwszym planie, jak pokazano na rysunku 1. Ta funkcja nosi nazwę Menedżer zadań. Aplikacje muszą być w stanie obsłużyć to zatrzymanie zainicjowane przez użytkownika.
Ulepszanie obsługi zadań pobierania wstępnego za pomocą JobScheduler
JobScheduler umożliwia aplikacjom oznaczanie określonych zadań jako zadań „pobierania z wyprzedzeniem” (za pomocą JobInfo.Builder.setPrefetch()), co oznacza, że powinny one zostać uruchomione tuż przed kolejnym uruchomieniem aplikacji, aby poprawić wrażenia użytkownika.
W przeszłości JobScheduler używał sygnału tylko do tego, aby zadania pobierania z wyprzedzeniem mogły korzystać z bezpłatnych lub nadmiarowych danych.
W Androidzie 13 (poziom API 33) i nowszych system próbuje określić, kiedy aplikacja zostanie uruchomiona następnym razem, i wykorzystuje te szacunki do uruchamiania zadań pobierania z wyprzedzeniem. Aplikacje powinny próbować używać zadań pobierania z wyprzedzeniem w przypadku wszystkich zadań, które mają zostać wykonane przed następnym uruchomieniem aplikacji.
Wykorzystanie zasobów baterii
Android 13 (API na poziomie 33) umożliwia systemowi lepsze zarządzanie czasem pracy baterii urządzenia na te sposoby:
- Zaktualizowane reguły dotyczące tego, kiedy system umieszcza aplikację w „ograniczonym” zasobniku czuwania aplikacji.
- Nowe ograniczenia dotyczące działań, które aplikacja może wykonywać, gdy użytkownik umieści ją w stanie „ograniczonym” w celu ograniczenia wykorzystania baterii w tle.
Podczas testowania aplikacji z tymi zmianami sprawdź te kwestie:
Przetestuj, jak aplikacja reaguje, gdy system umieszcza ją w „ograniczonym” zasobniku czuwania aplikacji. Aby przypisać aplikację do tego zasobnika, użyj tego polecenia Android Debug Bridge (ADB):
adb shell am set-standby-bucket PACKAGE_NAME restricted
Sprawdź, jak aplikacja reaguje na te ograniczenia, które zwykle dotyczą aplikacji w stanie „ograniczonym” pod względem wykorzystania baterii w tle:
- Nie można uruchomić usług działających na pierwszym planie
- Istniejące usługi działające na pierwszym planie są usuwane z pierwszego planu.
- Alarmy nie są aktywowane.
- Zadania nie są wykonywane
Aby przełączyć aplikację w stan „ograniczony”, użyj tego polecenia ADB:
adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
Limity wiadomości o wysokim priorytecie w Komunikacji w chmurze Firebase (FCM)
Android 13 (poziom interfejsu API 33) aktualizuje limity Komunikacji w chmurze Firebase (FCM), aby zwiększyć niezawodność dostarczania wiadomości FCM o wysokim priorytecie w przypadku aplikacji, które wyświetlają powiadomienia w odpowiedzi na takie wiadomości. W Androidzie 13 (poziom API 33) wprowadzono te zmiany:
- Zasobniki czuwania aplikacji nie określają już, ile wiadomości FCM o wysokim priorytecie może używać aplikacja.
- System obniża teraz priorytet wiadomości o wysokim priorytecie, jeśli wykryje, że aplikacja stale wysyła wiadomości o wysokim priorytecie, które nie powodują wyświetlenia powiadomienia.
Podobnie jak w poprzednich wersjach Androida, wiadomości FCM o wysokim priorytecie, które przekraczają limit, są obniżane do normalnego priorytetu. Podczas uruchamiania usług działających na pierwszym planie (FGS) w odpowiedzi na FCM zalecamy sprawdzenie wyniku RemoteMessage.getPriority() i potwierdzenie, że jest to PRIORITY_HIGH, lub obsłużenie potencjalnych wyjątków ForegroundServiceStartNotAllowedException.
Jeśli Twoja aplikacja nie zawsze publikuje powiadomienia w odpowiedzi na wiadomości FCM o wysokim priorytecie, zalecamy zmianę priorytetu tych wiadomości na normalny, aby wiadomości, które powodują wyświetlenie powiadomienia, nie były traktowane jako mniej ważne.
Prywatność
Uprawnienia w czasie działania aplikacji dotyczące powiadomień
W Androidzie 13 (poziom API 33) wprowadzono zgodę na wyświetlanie powiadomień w czasie działania: POST_NOTIFICATIONS.
Dzięki tej zmianie użytkownicy mogą skupić się na powiadomieniach, które są dla nich najważniejsze.
Zdecydowanie zalecamy jak najszybsze przejście na Androida 13 lub nowszego, aby móc korzystać z dodatkowej kontroli i elastyczności, które zapewnia ta funkcja.
Dowiedz się więcej o sprawdzonych metodach dotyczących uprawnień aplikacji.
Ukrywanie treści poufnych ze schowka
Jeśli Twoja aplikacja umożliwia użytkownikom kopiowanie do schowka poufnych treści, takich jak hasła czy dane karty kredytowej, przed wywołaniem ClipboardManager#setPrimaryClip() musisz dodać flagę do ClipDescription obiektu ClipData. Dodanie tej flagi zapobiega wyświetlaniu treści o charakterze kontrowersyjnym w podglądzie treści.
Aby oznaczyć treści poufne, dodaj do ClipDescription wartość logiczną. Wszystkie aplikacje powinny to robić, niezależnie od docelowego poziomu interfejsu API.
// When your app is compiled with the API level 33 SDK or higher
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
}
}
// If your app is compiled with a lower SDK
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean("android.content.extra.IS_SENSITIVE", true)
}
}
Więcej informacji o nowym interfejsie schowka znajdziesz na stronie funkcji Kopiowanie i wklejanie.
Bezpieczeństwo
Migracja z udostępnianego identyfikatora użytkownika
Jeśli Twoja aplikacja używa wycofanego atrybutu android:sharedUserId i nie zależy już od jego funkcji, możesz ustawić atrybut android:sharedUserMaxSdkVersion na 32, jak pokazano w tym fragmencie kodu:
<manifest ...> <!-- To maintain backward compatibility, continue to use "android:sharedUserId" if you already added it to your manifest. --> android:sharedUserId="SHARED_PACKAGE_NAME" android:sharedUserMaxSdkVersion="32" ... </manifest>
Ten atrybut informuje system, że aplikacja nie korzysta już ze wspólnego identyfikatora użytkownika. Jeśli aplikacja deklaruje uprawnienie android:sharedUserMaxSdkVersion i jest nowo zainstalowana na urządzeniach z Androidem 13 lub nowszym, zachowuje się tak, jakby uprawnienie android:sharedUserId nigdy nie zostało zdefiniowane. Zaktualizowane aplikacje nadal używają dotychczasowego wspólnego identyfikatora użytkownika.
Udostępnione identyfikatory użytkowników powodują niedeterministyczne zachowanie w menedżerze pakietów. Aplikacja powinna używać odpowiednich mechanizmów komunikacji, takich jak usługi i mechanizmy dostarczania treści, aby ułatwić współdziałanie udostępnianych komponentów.
Interfejs użytkownika
Powiadomienia o usługach na pierwszym planie, które można zamknąć
Na urządzeniach z Androidem 13 lub nowszym użytkownicy mogą domyślnie odrzucać powiadomienia powiązane z usługami działającymi na pierwszym planie.
Główna funkcja
Usunięto starszą kopię implementacji usługi rozpoznawania mowy
Android 13 usuwa z aplikacji Google implementację SpeechService, w tym metodę wprowadzania głosowego RecognitionService i interfejs API oparty na intencjach.
W Androidzie 12 wprowadziliśmy te zmiany:
- Funkcje
SpeechServicezostały przeniesione do aplikacji Usługi głosowe Google, która stała się domyślnym dostawcą funkcjiSpeechService. - Funkcje
RecognitionServicezostały przeniesione do aplikacji Android System Intelligence, aby umożliwić rozpoznawanie mowy na urządzeniu.
Aby zachować zgodność aplikacji z Androidem 12, aplikacja Google używa trampoliny do przekierowywania ruchu do aplikacji Usługi głosowe Google. W Androidzie 13 ta trampolina została usunięta.
Aplikacje powinny używać domyślnego dostawcy urządzenia dla SpeechService, a nie zakodowanej na stałe konkretnej aplikacji.