Platforma Android 13 obejmuje zmiany w działaniu, które mogą mieć wpływ na Twoją aplikację.
te zmiany w działaniu mają zastosowanie do wszystkich aplikacji działających na Androidzie 13:
bez względu na wartość targetSdkVersion
. Przetestuj aplikację, a następnie zmodyfikuj ją jako
które są niezbędne do ich
prawidłowego wspierania w stosownych przypadkach.
Przejrzyj też listę zmian w działaniu, które wpływają tylko na aplikacje kierowanych na Androida 13.
Wydajność i bateria
Menedżer zadań
Począwszy od Androida 13 (poziom interfejsu API 33) użytkownicy mogą wykonywać przepływ pracy z poziomu interfejsu panelu powiadomień, aby zatrzymywać aplikacje działające na pierwszym planie, co pokazuje na ilustracji 1. Afordancja jest znana jako Menedżer zadań. Aplikacje muszą radzić sobie z tym inicjowane przez użytkownika .
Popraw obsługę zadań pobierania z wyprzedzeniem za pomocą JobScheduler
JobScheduler umożliwia aplikacjom oznaczanie konkretnych zadań jako pobierania z wyprzedzeniem
zadań (za pomocą JobInfo.Builder.setPrefetch()
), co oznacza, że w idealnej sytuacji powinny być uruchamiane
tuż przed wprowadzeniem aplikacji i w jej trakcie.
Do tej pory usługa JobScheduler używała sygnału tylko do zezwalania na zadania pobierania z wyprzedzeniem
na wykorzystanie bezpłatnych lub nadmiarowych danych.
W Androidzie 13 (poziom interfejsu API 33) i nowszych system próbuje określić, kiedy aplikacja zostanie uruchomiona, i używać tego oszacowania do zadań pobierania z wyprzedzeniem. Aplikacje powinny próbować pobierać z wyprzedzeniem zadania z wyprzedzeniem do każdej pracy trzeba wykonać przed udostępnieniem następnej aplikacji.
Wykorzystanie zasobów baterii
Android 13 (poziom interfejsu API 33) zapewnia systemowi poniższe sposoby zarządzanie czasem pracy baterii urządzenia:
- Zaktualizowano reguły określające, kiedy system umieszcza aplikację jako „z ograniczeniami” Promująca aplikację Zasobnik gotowości.
- Nowe ograniczenia dotyczące czynności, które Twoja aplikacja może wykonać, gdy użytkownik skorzysta z niej w „z ograniczeniami” stan dla wykorzystanie baterii w tle.
Podczas testowania aplikacji po wprowadzeniu tych zmian sprawdź, czy spełnione są te warunki:
Sprawdź, jak aplikacja reaguje, gdy system umieszcza ją w grupie „z ograniczonym dostępem” Promująca aplikację Zasobnik gotowości. Użyj to polecenie Android Debug Bridge (ADB), aby przypisać aplikację do tego zasobnika:
adb shell am set-standby-bucket PACKAGE_NAME restricted
Sprawdź, jak Twoja aplikacja reaguje na te ograniczenia, które często występują do aplikacji, które są „ograniczone” stan wykorzystanie baterii w tle:
- Nie udało się uruchomić usług działających na pierwszym planie
- Istniejące usługi na pierwszym planie zostaną usunięte
- Alarmy nie są wywoływane
- Zadania nie są wykonywane
Aby umieścić aplikację w tym „ograniczonym” miejscu, użyj tego polecenia ADB: województwo:
adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
Limity FCM (wysoki priorytet) w ramach wiadomości w chmurze Firebase (FCM)
Android 13 (poziom interfejsu API 33) aktualizuje limity Komunikacji w chmurze Firebase (FCM), by zwiększyć niezawodność przesyłania przez FCM o wysokim priorytecie w przypadku aplikacji, które wyświetlają powiadomienia w odpowiedzi na FCM o wysokim priorytecie. W Androidzie 13 (poziom interfejsu API 33) wprowadziliśmy te zmiany:
- Zasobniki gotowości aplikacji nie określają już, z ilu FCM o wysokim priorytecie może korzystać aplikacja.
- Limity w FCM o wysokim priorytecie są skalowane proporcjonalnie do liczby powiadomień wyświetlanych użytkownikowi w odpowiedzi na FCM o wysokim priorytecie.
Podobnie jak w poprzednich wersjach Androida, FCM o wysokim priorytecie, które przekraczają limit, są obniżane do normalnego priorytetu. Gdy uruchamiasz usługi na pierwszym planie w odpowiedzi na FCM, zalecamy sprawdzenie wyniku RemoteMessage.getPriority()
i upewnienie się, że jest to PRIORITY_HIGH
lub obsługuje wszelkie potencjalne wyjątki ForegroundServiceStartNotAllowedException
.
Jeśli Twoja aplikacja nie zawsze publikuje powiadomienia w odpowiedzi na FCM o wysokim priorytecie, zalecamy zmianę ich priorytetu na normal, dzięki czemu wiadomości, które powodują wysłanie powiadomienia, nie zostaną obniżone.
Prywatność
Uprawnienia czasu działania powiadomień
Android 13 (poziom interfejsu API 33) wprowadza środowisko wykonawcze
uprawnienia do wyświetlania powiadomień:
POST_NOTIFICATIONS
.
Ta zmiana pozwoli użytkownikom skupić się na powiadomieniach, które są dla nich najważniejsze
.
Zdecydowanie zalecamy jak najszybsze przejście na Androida 13 lub nowszego aby uzyskać efekty dodatkowej kontroli i elastyczności tę funkcję.
Więcej informacji o sprawdzonych metodach dotyczących uprawnień aplikacji.
Ukryj poufne treści w schowku
Jeśli Twoja aplikacja umożliwia użytkownikom kopiowanie treści poufnych, takich jak hasła lub środki
danych karty, do schowka musisz dodać flagę do
ClipDescription
przed nawiązaniem połączenia ClipboardManager#setPrimaryClip()
. Dodaję
zapobiega wyświetlaniu w podglądzie treści poufnych treści.
![Podgląd tekstu został skopiowany bez oznaczenia treści poufnych](https://developer.android.com/static/images/about/versions/13/sensitive-content-before.png?authuser=19&hl=pl)
![Podgląd tekstu ze zgłoszeniem treści poufnych został skopiowany.](https://developer.android.com/static/images/about/versions/13/sensitive-content-after.png?authuser=19&hl=pl)
Aby oznaczyć treści poufne, dodaj do ClipDescription
element logiczny. Wszystkie
w aplikacjach
bez względu na docelowy poziom 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 w Kopiuj i wklej.
Bezpieczeństwo
Migracja ze wspólnego identyfikatora użytkownika
Jeśli Twoja aplikacja używa wycofanego
Atrybut android:sharedUserId
i nie zależy już od jego funkcjonalności, możesz określić
android:sharedUserMaxSdkVersion
do 32
, jak widać 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 Twoja aplikacja nie korzysta już z udostępnianej
identyfikatora użytkownika. Jeśli Twoja aplikacja deklaruje parametr android:sharedUserMaxSdkVersion
i jest nowa
na urządzeniach z Androidem 13 lub nowszym,
działa tak, jakby element android:sharedUserId
nigdy nie został zdefiniowany. Zaktualizowane aplikacje nadal używają
istniejącego udostępnionego identyfikatora użytkownika.
Udostępniane identyfikatory użytkowników powodują niedeterministyczne działanie w menedżerze pakietów. Aplikacja powinna zamiast tego używać odpowiednich mechanizmów komunikacji, takich jak usługi i dostawcami treści, co ułatwia współdziałanie między współdzielonymi komponentami.
Interfejs użytkownika
Niemożliwe do zamknięcia powiadomienia usługi na pierwszym planie
Na urządzeniach z Androidem 13 lub nowszym użytkownicy mogą zamknąć powiadomienia powiązane z pierwszym planem usług przez wartość domyślną.
Główna funkcja
Usunięto wdrożenie starszej wersji usługi kopii mowy
Android 13 usuwa implementację SpeechService
, w tym
Głosowy edytor IME, RecognitionService
oraz oparte na zamiarach
API – z
w aplikacji Google.
W Androidzie 12 pojawiły się te zmiany:
- Funkcje (
SpeechService
) zostały przeniesione do Usług głosowych przez Google , który został domyślnym dostawcą usługiSpeechService
. - Funkcja aplikacji
RecognitionService
została przeniesiona do systemu Android Aplikacja Intelligence obsługująca rozpoznawanie mowy na urządzeniu.
Aby zachować zgodność aplikacji z Androidem 12, aplikacja Google używa trampoliny, aby przekierować ruch do aplikacji Usługi głosowe Google. W Android 13. Ta trampolina została usunięta.
Aplikacje powinny używać domyślnego dostawcy urządzenia w przypadku usługi SpeechService
, a nie
kodowanie na stałe w konkretnej aplikacji.