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ę i w razie potrzeby zmodyfikuj ją, aby w odpowiednich przypadkach 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
Od Androida 16 dostosowujemy limit czasu wykonywania zwykłych i przyspieszonych zadań na podstawie tych czynników:
- Do którego zasobnika gotowości aplikacji należy aplikacja: w Androidzie 16 aktywne zasobniki gotowości będą egzekwowane przez duży limit czasu działania.
- Jeśli zadanie rozpocznie się, gdy aplikacja jest na pierwszym planie: w Androidzie 16 zadania rozpoczęte, gdy aplikacja jest widoczna dla użytkownika, i kontynuowane po tym, jak aplikacja stanie się niewidoczna, będą podlegać limitowi czasu wykonywania zadania.
- Jeśli zadanie jest wykonywane podczas działania usługi na pierwszym planie: w Androidzie 16 zadania wykonywane równocześnie z usługą na pierwszym planie będą podlegać limitowi czasu wykonywania zadania. Jeśli używasz zadań do przesyłania danych inicjowanego przez użytkownika, rozważ użycie zadań przesyłania danych inicjowanego przez użytkownika.
Ta zmiana ma wpływ na zadania zaplanowane za pomocą WorkManagera, JobSchedulera i DownloadManagera. Aby sprawdzić, dlaczego zadanie zostało zatrzymane, zalecamy zarejestrowanie przyczyny zatrzymania zadania przez wywołanie funkcji WorkInfo.getStopReason() (w przypadku zadań JobScheduler wywołaj funkcję JobParameters.getStopReason()).
Informacje o tym, jak stan aplikacji wpływa na zasoby, z których może korzystać, znajdziesz w sekcji Limity zasobów związane z zarządzaniem energią. Więcej informacji o sprawdzonych metodach optymalnego wykorzystania baterii znajdziesz w przewodniku na temat optymalizacji wykorzystania baterii w przypadku interfejsów API do planowania zadań.
Zalecamy też korzystanie z nowego interfejsu API JobScheduler#getPendingJobReasonsHistory wprowadzonego w Androidzie 16, aby dowiedzieć się, dlaczego zadanie nie zostało wykonane.
Testowanie
Aby przetestować działanie aplikacji, możesz włączyć zastępowanie niektórych optymalizacji limitu zadań, o ile aplikacja działa na urządzeniu z Androidem 16.
Aby wyłączyć egzekwowanie zasady „najwyższy stan będzie zgodny z limitem czasu działania zadania”, uruchom to polecenie: adb
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
Aby wyłączyć egzekwowanie zasady „zadania wykonywane równocześnie z usługą na pierwszym planie będą podlegać limitowi czasu działania zadania”, uruchom to polecenie:adb
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
Aby przetestować określone zachowanie zasobnika gotowości aplikacji, możesz ustawić zasobnik gotowości aplikacji za pomocą tego polecenia adb:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
Aby sprawdzić, w którym zasobniku gotowości aplikacji znajduje się Twoja aplikacja, możesz użyć tego polecenia adb:
adb shell am get-standby-bucket APP_PACKAGE_NAME
Powód zatrzymania porzuconych pustych zadań
Porzucenie zadania ma miejsce, gdy powiązany z nim obiekt JobParameters został usunięty, ale metoda JobService#jobFinished(JobParameters,
boolean) nie została wywołana, aby zasygnalizować ukończenie zadania. Oznacza to, że zadanie może być wykonywane i przeplanowywane bez wiedzy aplikacji.
Aplikacje korzystające z JobScheduler nie utrzymują silnego odwołania do obiektu JobParameters, a czas oczekiwania będzie teraz mieć nowy powód zatrzymania zadania STOP_REASON_TIMEOUT_ABANDONED zamiast STOP_REASON_TIMEOUT.
Jeśli nowy powód zaniechania będzie występował często, system podejmie działania zaradcze, aby zmniejszyć częstotliwość wykonywania zadań.
Aplikacje powinny używać nowego powodu zatrzymania, aby wykrywać i zmniejszać liczbę porzuconych zadań.
Jeśli używasz WorkManagera, AsyncTaska lub DownloadManagera, nie musisz nic robić, ponieważ te interfejsy API zarządzają cyklem pracy w imieniu aplikacji.
Całkowite wycofanie 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 uporzą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。
如果进程需要相互协调,则应使用其他协调渠道进行通信。
Zmiany wewnętrzne ART
Android 16 zawiera najnowsze aktualizacje środowiska wykonawczego Android Runtime (ART), które poprawiają wydajność tego środowiska i zapewniają obsługę dodatkowych funkcji Javy. Dzięki aktualizacjom systemowym Google Play te ulepszenia są też dostępne na ponad miliardzie urządzeń z Androidem 12 (poziom interfejsu API 31) lub nowszym.
Po wprowadzeniu tych zmian biblioteki i kod aplikacji korzystające z wewnętrznych struktur ART mogą nie działać prawidłowo na urządzeniach z Androidem 16 oraz na starszych wersjach Androida, które aktualizują moduł ART za pomocą aktualizacji systemu Google Play.
Używanie wewnętrznych struktur (np. interfejsów innych niż SDK) może zawsze prowadzić do problemów ze zgodnością, ale szczególnie ważne jest unikanie korzystania z kodu (lub bibliotek zawierających kod), który wykorzystuje wewnętrzne struktury ART, ponieważ zmiany w ART nie są powiązane z wersją platformy, na której działa urządzenie, i są udostępniane ponad miliardowi urządzeń za pomocą aktualizacji systemu Google Play.
Wszyscy deweloperzy powinni dokładnie przetestować swoje aplikacje na Androidzie 16, aby sprawdzić, czy nie są one dotknięte problemami. Dodatkowo sprawdź znane problemy, aby sprawdzić, czy Twoja aplikacja jest zależna od zidentyfikowanych przez nas bibliotek, które korzystają z wewnętrznych struktur ART. Jeśli masz kod aplikacji lub zależności biblioteki, które są dotknięte, poszukaj alternatywnych publicznych interfejsów API i poproś o publiczne interfejsy API do nowych zastosowań, tworząc prośbę o dodanie funkcji w naszym systemie śledzenia problemów.
Tryb zgodności z rozmiarem strony 16 KB
Android 15 引入了对 16 KB 内存页面的支持,以优化平台性能。Android 16 添加了兼容模式,让一些针对 4 KB 内存页面构建的应用可以在配置为 16 KB 内存页面的设备上运行。
当您的应用在搭载 Android 16 或更高版本的设备上运行时,如果 Android 检测到您的应用具有 4 KB 对齐的内存页面,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。如需使用 android:pageSizeCompat 属性,请使用 Android 16 SDK 编译您的应用。
为了实现最佳性能、可靠性和稳定性,应用仍应以 16 KB 对齐。如需了解详情,请参阅我们近期发布的博文,了解如何更新应用以支持 16 KB 的内存页面。
Interfejs użytkownika i systemowy
Android 16 (poziom interfejsu API 36) zawiera te zmiany, które mają na celu zapewnienie bardziej spójnego i intuicyjnego działania.
Wycofanie uciążliwych komunikatów dotyczących 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 zgodne z wybranym motywem
从 Android 16 QPR 2 开始,Android 会自动将主题应用于应用图标,以打造一致的主屏幕体验。如果应用未提供自己的带主题的应用图标,就会发生这种情况。应用可以通过在自适应图标中添加单色图层来控制主题化应用图标的设计,并在 Android Studio 中预览应用图标的外观。
Formaty urządzeń
Android 16 (poziom interfejsu 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
虚拟设备所有者是创建和管理虚拟设备的可信或特权应用。虚拟设备所有者在虚拟设备上运行应用,然后将应用投影到远程设备的显示屏上,例如个人电脑、虚拟现实设备或车载信息娱乐系统。虚拟设备所有者位于本地设备(例如手机)上。
按应用替换项
在搭载 Android 16(API 级别 36)的设备上,虚拟设备所有者可以替换其管理的特定虚拟设备上的应用设置。例如,为了改进应用布局,虚拟设备所有者可以在将应用投影到外接显示屏时忽略屏幕方向、宽高比和可调整大小限制。
常见破坏性更改
Android 16 行为可能会影响应用在汽车显示屏或 Chromebook 等大屏设备上的界面,尤其是专为纵向小屏幕设计的布局。如需了解如何使应用适应所有设备外形规格,请参阅自适应布局简介。
参考
Bezpieczeństwo
Android 16 (poziom API 36) zawiera zmiany, które zwiększają bezpieczeństwo systemu, aby chronić aplikacje i użytkowników przed szkodliwymi aplikacjami.
Lepsza ochrona przed atakami polegającymi na przekierowaniu intencji
Android 16 默认提供针对一般 Intent 重定向攻击的安全防护,只需进行极少的兼容性和开发者更改。
我们正在引入默认安全强化解决方案,以防范 Intent 重定向漏洞。在大多数情况下,正常使用 intent 的应用不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会遇到中断。
当攻击者部分或完全控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容,而受害者应用在(“顶级”)intent 的 extra 字段中启动不受信任的子级 intent 时,Android 中就会出现 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 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.
Połączenia
Android 16 (poziom API 36) wprowadza te zmiany w stosie Bluetooth, aby poprawić łą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.