Platforma Android 16 zawiera zmiany zachowania, które mogą mieć wpływ na Twoją aplikację.
Poniższe zmiany zachowania dotyczą wszystkich aplikacji na Androidzie 16, niezależnie od targetSdkVersion
. Należy przetestować aplikację, a w razie potrzeby zmodyfikować ją w sposób umożliwiający obsługę tych zmian.
Sprawdź też listę zmian zachowania, które mają wpływ tylko na aplikacje kierowane na Androida 16.
Główna funkcja
Android 16 (poziom interfejsu API 36) zawiera te zmiany, które modyfikują lub rozszerzają różne podstawowe funkcje systemu Android.
Optymalizacja limitu zadań
从 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
Powód 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 metody JobInfo#setImportantWhileForeground,
Metoda JobInfo.Builder#setImportantWhileForeground(boolean)
wskazuje ważność zadania, gdy aplikacja do planowania jest na pierwszym planie lub gdy jest tymczasowo zwolniona z ograniczeń działania w tle.
Ta metoda została wycofana w Androidzie 12 (poziom API 31). Od Androida 16 ta metoda nie działa już prawidłowo i jej wywołanie zostanie zignorowane.
Usunięcie tej funkcji dotyczy również JobInfo#isImportantWhileForeground()
. Od wersji 16 Androida, jeśli metoda jest wywoływana, zwraca ona false
.
Zakres priorytetu porządkowanej transmisji nie jest już globalny
Android 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 android:priority
属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority()
API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。
在 Android 16 中,无法保证使用 android:priority
属性或 IntentFilter#setPriority()
在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。
此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY
+ 1, SYSTEM_HIGH_PRIORITY
- 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITY
、SYSTEM_HIGH_PRIORITY
设置为广播优先级。
如果您的应用执行以下任一操作,可能会受到影响:
- 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
- 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。
如果进程需要相互协调,则应使用其他协调渠道进行通信。
Wewnętrzne zmiany w ART
Android 16 包含 Android 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。
发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。
依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要,因为 ART 更改与设备所运行的平台版本无关,并且会通过 Google Play 系统更新推送到超过 10 亿部设备。
所有开发者都应在 Android 16 上对其应用进行全面测试,以检查其应用是否受到影响。此外,请查看已知问题,了解您的应用是否依赖于我们发现的任何依赖于内部 ART 结构的库。如果您的应用代码或库依赖项受到影响,请尽可能寻找公共 API 替代方案,并在问题跟踪器中创建功能请求,为新用例请求公共 API。
Tryb zgodności z rozmiarem strony 16 KB
Android 15 wprowadził obsługę stron pamięci 16 KB w celu optymalizacji wydajności platformy. Android 16 wprowadza tryb zgodności, który umożliwia uruchamianie niektórych aplikacji utworzonych z użyciem stron pamięci 4 KB na urządzeniu skonfigurowanym pod kątem stron pamięci 16 KB.
Jeśli aplikacja działa na urządzeniu z Androidem 16 lub nowszym, a Android wykryje, że ma ona strony pamięci wyrównane co 4 KB, automatycznie włączy tryb zgodności i wyświetli użytkownikowi powiadomienie. Ustawienie właściwości android:pageSizeCompat
w pliku AndroidManifest.xml
, aby włączyć tryb zgodności wstecznej, uniemożliwi wyświetlanie okna podczas uruchamiania aplikacji. Aby użyć właściwości android:pageSizeCompat
, skompiluj aplikację za pomocą pakietu SDK Androida 16.
Aby zapewnić najlepszą wydajność, niezawodność i stabilność, aplikacja powinna być nadal zgodna z 16 KB. Więcej informacji znajdziesz w tym poście na blogu na temat aktualizowania aplikacji, aby obsługiwały strony pamięci o rozmiarze 16 KB.

Wrażenia użytkownika i interfejs systemu
Android 16 (poziom interfejsu API 36) zawiera te zmiany, które mają na celu zapewnienie bardziej spójnego i intuicyjnego interfejsu.
Wycofane uciążliwe komunikaty 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
AccessibilityEvent
typuAccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
i 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 umożliwia korzystanie z przewidywanego przycisku Wstecz w nawigacji przy użyciu 3 przycisków w przypadku aplikacji, które zostały prawidłowo przeniesione na przewidywane Wstecz. Długie naciśnięcie przycisku Wstecz inicjuje animację przewidywanego przejścia wstecz, która wyświetla podgląd miejsca, do którego prowadzi przesunięcie wstecz.
To zachowanie dotyczy wszystkich obszarów systemu, które obsługują przewidywane animacje wstecz, w tym animacje systemowe (powrót do ekranu głównego, przełączanie się między zadaniami i czynnościami).
Formaty urządzeń
Android 16 (poziom interfejsu API 36) zawiera te zmiany w przypadku aplikacji wyświetlanych na ekranach przez właścicieli wirtualnych urządzeń.
Zastąpienia właściciela urządzenia wirtualnego
虚拟设备所有者是创建和管理虚拟设备的可信或特权应用。虚拟设备所有者可以在虚拟设备上运行应用,然后将应用投影到远程设备(例如个人计算机、虚拟现实设备或汽车信息娱乐系统)的显示屏上。虚拟设备所有者位于本地设备(例如手机)上。

按应用替换项
在搭载 Android 16(API 级别 36)的设备上,虚拟设备所有者可以在虚拟设备所有者管理的部分虚拟设备上替换应用设置。例如,为了改进应用布局,虚拟设备所有者可以在将应用投影到外部显示屏时忽略屏幕方向、宽高比和可调整大小限制。
常见的破坏性更改
Android 16 中的此行为可能会影响应用在汽车显示屏或 Chromebook 等大屏幕设备上的界面,尤其是针对纵向小屏幕设计的布局。如需了解如何让应用适应所有设备类型,请参阅自适应布局简介。
参考文档
Bezpieczeństwo
Android 16 (poziom interfejsu API 36) zawiera zmiany, które poprawiają bezpieczeństwo systemu, aby chronić aplikacje i użytkowników przed szkodliwymi aplikacjami.
Ulepszone zabezpieczenia przed atakami polegającymi na przekierowywaniu intencji
Android 16 提供了针对常规 Intent
重定向攻击的默认安全防护,并且所需的兼容性和开发者更改最少。
我们将默认针对 Intent
重定向漏洞引入安全增强解决方案。在大多数情况下,使用 intent 的应用通常不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会出现故障。
当攻击者部分或完全控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,就会出现 Android 中的 intent 重定向,而受害应用会在 intent(“顶级”intent)的 extras 字段中启动不可信的子级 intent。这可能会导致攻击者应用在受害应用上下文中启动私有组件、触发特权操作或获得对敏感数据的 URI 访问权限,从而可能导致数据被盗和任意代码执行。
停用 intent 重定向处理
Android 16 引入了一个新 API,允许应用选择停用启动安全保护。在默认安全行为干扰合法应用用例的特定情况下,这可能很有必要。
对于针对 Android 16(API 级别 36)SDK 或更高版本进行编译的应用
您可以直接对 intent 对象使用 removeLaunchSecurityProtection()
方法。
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
对于针对 Android 15(API 级别 35)或更低版本进行编译的应用
虽然不建议这样做,但您可以使用反射来访问 removeLaunchSecurityProtection()
方法。
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 są już powiadamiane o przekroczeniu limitu czasu wykrywania
Android 16 在配套设备配对流程期间引入了一种新行为,以防恶意应用侵犯用户的位置信息隐私。在 Android 16 上运行的所有配套应用都不再直接通过 RESULT_DISCOVERY_TIMEOUT
收到发现超时通知。而是通过可视对话框通知用户超时事件。当用户关闭对话框时,系统会通过 RESULT_USER_REJECTED
提醒应用关联失败。
搜索时长也从原来的 20 秒延长到了 30 秒,并且用户可以在搜索期间的任何时间停止设备发现。如果在开始搜索的前 20 秒内发现了至少 1 部设备,CDM 会停止搜索其他设备。
Łączność
Android 16 (poziom interfejsu API 36) zawiera te zmiany w pakiecie Bluetooth, które mają na celu poprawę łączności z urządzeniami peryferyjnymi:
Ulepszona obsługa utraty zabezpieczenia
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.