Platforma Android 16 zawiera zmiany w działaniu, które mogą mieć wpływ na Twoją aplikację. Poniższe zmiany w działaniu dotyczą wszystkich aplikacji działających na Androidzie 16 niezależnie od targetSdkVersion. Przetestuj aplikację, a następnie w razie potrzeby zmodyfikuj ją, aby obsługiwała te zmiany.
Zapoznaj się też z listą zmian w działaniu, które wpływają tylko na aplikacje kierowane na Androida 16.
Główna funkcja
Android 16 (API na poziomie 36) zawiera te zmiany, które modyfikują lub rozszerzają różne podstawowe funkcje systemu Android.
Optymalizacje limitów JobScheduler
从 Android 16 开始,我们将根据以下因素调整常规作业和加急作业的执行运行时配额:
- 应用所处的应用待机存储分区:在 Android 16 中,活跃待机存储分区将开始通过宽松的运行时配额强制执行。
- 如果作业在应用处于前台状态时开始执行:在 Android 16 中,如果作业在应用对用户可见时开始执行,并在应用变为不可见后继续执行,则会遵守作业运行时配额。
- 如果作业在运行前台服务时执行:在 Android 16 中,与前台服务同时执行的作业将遵守作业运行时配额。如果您利用作业进行用户发起的数据传输,请考虑改用用户发起的数据传输作业。
此变更会影响使用 WorkManager、JobScheduler 和 DownloadManager 调度的任务。如需调试作业停止的原因,我们建议您通过调用 WorkInfo.getStopReason()(对于 JobScheduler 作业,请调用 JobParameters.getStopReason())来记录作业停止的原因。
如需了解应用的状态如何影响其可使用的资源,请参阅电源管理资源限制。 如需详细了解电池优化方面的最佳实践,请参阅有关针对任务调度 API 优化电池使用的指南。
我们还建议利用 Android 16 中引入的新 JobScheduler#getPendingJobReasonsHistory API 来了解作业未执行的原因。
测试
如需测试应用的行为,只要应用在 Android 16 设备上运行,您就可以启用对某些作业配额优化功能的替换。
如需停用“顶级状态将遵守作业运行时配额”的强制执行,请运行以下 adb 命令:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
如需停用“在与前台服务同时执行时,作业将遵守作业运行时配额”的强制执行,请运行以下 adb 命令:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
如需测试特定应用待机分桶行为,您可以使用以下 adb 命令设置应用的应用待机分桶:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
如需了解应用所在的待机分桶,您可以使用以下 adb 命令获取应用的待机分桶:
adb shell am get-standby-bucket APP_PACKAGE_NAME
Przyczyna zatrzymania porzuconych pustych zadań
如果与作业关联的 JobParameters 对象已被垃圾回收,但尚未调用 JobService#jobFinished(JobParameters,
boolean) 来指示作业已完成,则会发生作业被废弃的情况。这表示作业可能会在应用不知情的情况下运行和重新调度。
依赖于 JobScheduler 的应用不会维护对 JobParameters 对象的强引用,并且超时现在将获得新的作业停止原因 STOP_REASON_TIMEOUT_ABANDONED,而不是 STOP_REASON_TIMEOUT。
如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。
应用应使用新的停止原因来检测和减少被废弃的作业。
如果您使用的是 WorkManager、AsyncTask 或 DownloadManager,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。
Całkowite wycofanie JobInfo#setImportantWhileForeground
The JobInfo.Builder#setImportantWhileForeground(boolean)
method indicates the importance of a job while the scheduling app is in the
foreground or when temporarily exempted from background restrictions.
This method has been deprecated since Android 12 (API level 31). Starting in Android 16, it no longer functions effectively and calling this method will be ignored.
This removal of functionality also applies to
JobInfo#isImportantWhileForeground(). Starting in Android
16, if the method is called, the method returns false.
Zakres priorytetu uporządkowanego rozgłaszania nie jest już globalny
Aplikacje na Androida mogą definiować priorytety odbiorników transmisji, aby kontrolować kolejność, w jakiej odbiorniki otrzymują i przetwarzają transmisję. W przypadku odbiorników zadeklarowanych w manifeście aplikacje mogą używać atrybutu android:priority do definiowania priorytetu, a w przypadku odbiorników zarejestrowanych w kontekście aplikacje mogą używać interfejsu API IntentFilter#setPriority() do definiowania priorytetu. Gdy przesyłasz transmisję, system dostarcza ją odbiorcom w kolejności priorytetów, od najwyższego do najniższego.
W Androidzie 16 kolejność wysyłania danych w ramach transmisji z użyciem atrybutu android:priority lub IntentFilter#setPriority() w różnych procesach nie będzie gwarantowana. Priorytety transmisji będą uwzględniane tylko w ramach tego samego procesu aplikacji, a nie wszystkich procesów.
Priorytety transmisji będą automatycznie ograniczone do zakresu (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1). Ustawienie SYSTEM_LOW_PRIORITY, SYSTEM_HIGH_PRIORITY jako priorytetu transmisji będzie możliwe tylko dla komponentów systemowych.
Na Twoją aplikację może mieć wpływ:
- Twoja aplikacja ma zadeklarowane 2 procesy z tym samym zamiarem przesyłania strumienia danych i oczekuje, że te zamiary będą odbierane w określonej kolejności na podstawie priorytetu.
- Proces aplikacji wchodzi w interakcje z innymi procesami i oczekuje określonej kolejności otrzymywania intencji rozgłoszenia.
Jeśli procesy muszą ze sobą współpracować, powinny komunikować się za pomocą innych kanałów koordynacji.
Wewnętrzne zmiany ART
Android 16 includes the latest updates to the Android Runtime (ART) that improve the Android Runtime's (ART's) performance and provide support for additional Java features. Through Google Play System updates, these improvements are also available to over a billion devices running Android 12 (API level 31) and higher.
As these changes are released, libraries and app code that rely on internal structures of ART might not work correctly on devices running Android 16, along with earlier Android versions that update the ART module through Google Play system updates.
Relying on internal structures (such as non-SDK interfaces) can always lead to compatibility problems, but it's particularly important to avoid relying on code (or libraries containing code) that leverages internal ART structures, since ART changes aren't tied to the platform version the device is running on and they go out to over a billion devices through Google Play system updates.
All developers should check whether their app is impacted by testing their apps thoroughly on Android 16. In addition, check the known issues to see if your app depends on any libraries that we've identified that rely on internal ART structures. If you do have app code or library dependencies that are affected, seek public API alternatives whenever possible and request public APIs for new use cases by creating a feature request in our issue tracker.
Tryb zgodności ze stronami o rozmiarze 16 KB
Android 15 introduced support for 16 KB memory pages to optimize performance of the platform. Android 16 adds a compatibility mode, allowing some apps built for 4 KB memory pages to run on a device configured for 16 KB memory pages.
When your app is running on a device with Android 16 or higher, if Android
detects that your app has 4 KB aligned memory pages, it automatically uses
compatibility mode and display a notification dialog to the user. Setting the
android:pageSizeCompat property in the AndroidManifest.xml to enable the
backwards compatibility mode will prevent the display of the dialog when your
app launches. To use the android:pageSizeCompat property, compile your app
using the Android 16 SDK.
For best performance, reliability, and stability, your app should still be 16 KB aligned. Check out our recent blog post on updating your apps to support 16 KB memory pages for more details.
Wrażenia użytkowników i interfejs systemu
Android 16 (poziom interfejsu API 36) zawiera te zmiany, które mają na celu zapewnienie bardziej spójnego i intuicyjnego interfejsu.
Wycofywanie uciążliwych komunikatów ułatwień dostępu
W Androidzie 16 nie są już obsługiwane powiadomienia o ułatwieniach dostępu, które korzystają z announceForAccessibility lub wysyłają zdarzenia ułatwień dostępu TYPE_ANNOUNCEMENT. Mogą one powodować niespójności w działaniu czytnika ekranu TalkBack i Androida, a alternatywne rozwiązania lepiej odpowiadają na potrzeby użytkowników w różnych technologiach wspomagających na Androidzie.
Przykłady alternatyw:
- W przypadku istotnych zmian w interfejsie, np. zmian w oknach, użyj
Activity.setTitle(CharSequence)isetAccessibilityPaneTitle(java.lang.CharSequence). W sekcji Tworzenie wiadomości użyj skrótuModifier.semantics { paneTitle = "paneTitle" }. - Aby poinformować użytkownika o zmianach w kluczowych elementach interfejsu, użyj elementu
setAccessibilityLiveRegion(int). W sekcji Utwórz kliknijModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}. Należy ich używać oszczędnie, ponieważ mogą generować powiadomienia za każdym razem, gdy nastąpi aktualizacja widoku. - Aby powiadomić użytkowników o błędach, wyślij element
AccessibilityEventtypuAccessibilityEvent#CONTENT_CHANGE_TYPE_ERRORi ustaw parametrAccessibilityNodeInfo#setError(CharSequence)lub użyj elementuTextView#setError(CharSequence).
Więcej informacji o sugerowanych zamiennikach znajdziesz w dokumentacji referencyjnej wycofanego interfejsu API announceForAccessibility.
Obsługa nawigacji przy użyciu 3 przycisków
Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。
此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。
Automatyczne ikony aplikacji z motywem
Od Androida 16 QPR2 Android automatycznie stosuje motywy do ikon aplikacji, aby zapewnić spójny wygląd ekranu głównego. Dzieje się tak, jeśli aplikacja nie ma własnej ikony z motywem. Aplikacje mogą kontrolować wygląd ikony tematycznej, dodając warstwę monochromatyczną do ikony adaptacyjnej i sprawdzając, jak będzie wyglądać ikona aplikacji w Android Studio.
Formaty urządzeń
Android 16 (poziom API 36) wprowadza te zmiany w aplikacjach, gdy są one wyświetlane na ekranach przez właścicieli urządzeń wirtualnych.
Zastąpienia właściciela urządzenia wirtualnego
Właścicielem urządzenia wirtualnego jest zaufana aplikacja z uprawnieniami, która tworzy urządzenie wirtualne i nim zarządza. Właściciele urządzeń wirtualnych uruchamiają aplikacje na urządzeniu wirtualnym, a następnie wyświetlają je na ekranie urządzenia zdalnego, takiego jak komputer osobisty, urządzenie do rzeczywistości wirtualnej lub system multimedialny w samochodzie. Właściciel urządzenia wirtualnego korzysta z urządzenia lokalnego, np. telefonu komórkowego.
Zastąpienia na poziomie aplikacji
Na urządzeniach z Androidem 16 (poziom interfejsu API 36) właściciele urządzeń wirtualnych mogą zastępować ustawienia aplikacji na wybranych urządzeniach wirtualnych, którymi zarządzają. Aby na przykład ulepszyć układ aplikacji, właściciel urządzenia wirtualnego może ignorować ograniczenia dotyczące orientacji, proporcji i możliwości zmiany rozmiaru podczas wyświetlania aplikacji na zewnętrznym ekranie.
Typowe zmiany powodujące niezgodność
Zachowanie Androida 16 może mieć wpływ na interfejs aplikacji na urządzeniach z dużym ekranem, takich jak wyświetlacze samochodowe czy Chromebooki, zwłaszcza w przypadku układów zaprojektowanych z myślą o małych ekranach w orientacji pionowej. Aby dowiedzieć się, jak dostosować aplikację do wszystkich typów urządzeń, przeczytaj artykuł Informacje o układach adaptacyjnych.
Odniesienia
Strumieniowe przesyłanie aplikacji towarzyszącej
Bezpieczeństwo
Android 16 (poziom interfejsu API 36) zawiera zmiany, które zwiększają bezpieczeństwo systemu, aby chronić aplikacje i użytkowników przed złośliwymi aplikacjami.
Lepsza ochrona przed atakami polegającymi na przekierowaniu intencji
Android 16 provides default security against general Intent redirection
attacks, with minimum compatibility and developer changes required.
We are introducing by-default security hardening solutions to Intent
redirection exploits. In most cases, apps that use intents normally won't
experience any compatibility issues; we've gathered metrics throughout our
development process to monitor which apps might experience breakages.
Intent redirection in Android occurs when an attacker can partly or fully control the contents of an intent used to launch a new component in the context of a vulnerable app, while the victim app launches an untrusted sub-level intent in an extras field of an ("top-level") Intent. This can lead to the attacker app launching private components in the context of the victim app, triggering privileged actions, or gaining URI access to sensitive data, potentially leading to data theft and arbitrary code execution.
Opt out of Intent redirection handling
Android 16 introduces a new API that allows apps to opt out of launch security protections. This might be necessary in specific cases where the default security behavior interferes with legitimate app use cases.
For applications compiling against Android 16 (API level 36) SDK or higher
You can directly use the removeLaunchSecurityProtection() method on the Intent
object.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
For applications compiling against Android 15 (API level 35) or lower
While not recommended, you can use reflection to access the
removeLaunchSecurityProtection() method.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
// Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }
Aplikacje towarzyszące nie otrzymują już powiadomień o przekroczeniu limitu czasu wykrywania
Android 16 wprowadza nowe zachowanie podczas procesu parowania urządzenia towarzyszącego, aby chronić prywatność lokalizacji użytkownika przed szkodliwymi aplikacjami. Wszystkie aplikacje towarzyszące działające na Androidzie 16 nie są już bezpośrednio powiadamiane o czasie oczekiwania na wykrycie za pomocą RESULT_DISCOVERY_TIMEOUT. Zamiast tego użytkownik o takich zdarzeniach jest informowany za pomocą wizualnego okna. Gdy użytkownik zamknie okno, aplikacja otrzyma powiadomienie o nieudanym powiązaniu z RESULT_USER_REJECTED.
Czas wyszukiwania został też wydłużony z pierwotnych 20 sekund, a użytkownik może w dowolnym momencie przerwać wykrywanie urządzenia. Jeśli w ciągu pierwszych 20 sekund od rozpoczęcia wyszukiwania zostanie wykryte co najmniej 1 urządzenie, CDM przestanie wyszukiwać kolejne urządzenia.
Łączność
Android 16 (poziom API 36) zawiera te zmiany w stosie Bluetooth, które poprawiają łączność z urządzeniami peryferyjnymi:
Ulepszona obsługa utraty połączenia
Od wersji 16 Androida zaktualizowano pakiet Bluetooth, aby zwiększyć bezpieczeństwo i wygodę użytkowników w przypadku wykrycia utraty połączenia z urządzeniem zdalnym. Wcześniej system automatycznie usuwał połączenie i inicjował nowy proces parowania, co mogło prowadzić do niezamierzonego ponownego parowania. W wielu przypadkach aplikacje nieprawidłowo obsługują zdarzenie utraty zabezpieczeń.
Aby ujednolicić obsługę, w Androidzie 16 ulepszono obsługę utraty zabezpieczeń. Jeśli po ponownym połączeniu nie uda się uwierzytelnić wcześniej sparowanego urządzenia Bluetooth, system rozłączy połączenie, zachowa lokalne informacje o sparowaniu i wyświetli okno systemu z informacją o utracie sparowania oraz instrukcją ponownego sparowania.