שינויים בהתנהגות: כל האפליקציות

פלטפורמת Android 16 כוללת שינויים בהתנהגות שעשויים להשפיע על האפליקציה שלכם. השינויים הבאים בהתנהגות חלים על כל האפליקציות כשהן פועלות ב-Android 16, ללא קשר ל-targetSdkVersion. מומלץ לבדוק את האפליקציה ואז לשנות אותה לפי הצורך כדי לתמוך בשינויים האלה, במקרים הרלוונטיים.

חשוב גם לעיין ברשימת השינויים בהתנהגות שמשפיעים רק על אפליקציות שמטרגטות ל-Android 16.

פונקציונליות עיקרית

Android 16 (רמת API 36) כולל את השינויים הבאים, שמשנה או מרחיבים יכולות ליבה שונות של מערכת Android.

אופטימיזציה של מכסות ב-JobScheduler

החל מ-Android 16, אנחנו משנים את המכסה של זמן הריצה לביצוע משימות רגילות ומשימות מואצות על סמך הגורמים הבאים:

  • הקטגוריה של האפליקציה במצב המתנה: ב-Android 16, קטגוריות פעילות של אפליקציות במצב המתנה יתחילו להיות מופעלות באמצעות מכסה נדיבה של זמן ריצה.
  • אם המשימה מתחילה לפעול בזמן שהאפליקציה במצב 'מופעלת': ב-Android 16, משימות שהתחילו לפעול בזמן שהאפליקציה גלויה למשתמש והמשיכו לפעול אחרי שהאפליקציה הפכה לבלתי נראית, יתחייבו למכסת זמן הריצה של המשימה.
  • אם המשימה פועלת בזמן הפעלת שירות שפועל בחזית: ב-Android 16, משימות שפועלות בו-זמנית עם שירות שפועל בחזית יתחייבו למכסת זמן הריצה של המשימה. אם אתם משתמשים במשימות להעברת נתונים שהמשתמשים יזמו, כדאי להשתמש במקום זאת במשימות של העברת נתונים שהמשתמשים יזמו.

השינוי הזה משפיע על משימות שתזמנתם באמצעות WorkManager,‏ JobScheduler ו-DownloadManager. כדי לנפות באגים ולברר למה המשימה הופסקה, מומלץ לקרוא ל-WorkInfo.getStopReason() כדי לתעד את הסיבה להפסקה (במשימות של JobScheduler, צריך לקרוא ל-JobParameters.getStopReason()).

במאמר מגבלות משאבים לניהול צריכת החשמל מוסבר איך המצב של האפליקציה משפיע על המשאבים שבהם היא יכולה להשתמש. למידע נוסף על שיטות מומלצות לשמירה על אופטימיזציה של הסוללה, אפשר לעיין בהנחיות בנושא אופטימיזציה של השימוש בסוללה ב-API לניהול משימות.

מומלץ גם להשתמש ב-API החדש JobScheduler#getPendingJobReasonsHistory שנוסף ב-Android 16 כדי להבין למה משימה לא בוצעה.

בדיקה

כדי לבדוק את ההתנהגות של האפליקציה, אפשר להפעיל שינוי של אופטימיזציות מסוימות של מכסות משימות, כל עוד האפליקציה פועלת במכשיר עם 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

הסיבה להפסקה של משימות ריקות שננטשו

משימה נטושה מתרחשת כשאובייקט JobParameters המשויך למשימה נאסף על ידי מנהל האשפה, אבל לא בוצע קריאה ל-JobService#jobFinished(JobParameters, boolean) כדי לסמן את סיום המשימה. המשמעות היא שהמשימה עשויה לפעול ולהיבחר מחדש ללא ידיעת האפליקציה.

אפליקציות שמסתמכות על JobScheduler לא שומרות הפניה חזקה לאובייקט JobParameters, ועכשיו הסיבה החדשה להפסקת המשימה STOP_REASON_TIMEOUT_ABANDONED תוקצה לתפוגה במקום STOP_REASON_TIMEOUT.

אם יהיו מקרים תדירים של הסיבה החדשה להפסקה, המערכת תבצע פעולות כדי לצמצם את תדירות המשימות.

באפליקציות צריך להשתמש בסיבה החדשה להפסקה כדי לזהות משימות שננטשו ולהפחית את מספרן.

אם אתם משתמשים ב-WorkManager, ב-AsyncTask או ב-DownloadManager, השינוי לא ישפיע עליכם כי ממשקי ה-API האלה מנהלים את מחזור החיים של המשימה בשם האפליקציה.

הוצאה משימוש מלאה של JobInfo#setImportantWhileForeground

JobInfo.Builder#setImportantWhileForeground(boolean) 方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。

自 Android 12(API 级别 31)起,此方法已废弃。从 Android 16 开始,它不再有效,系统会忽略调用此方法。

此功能移除也适用于 JobInfo#isImportantWhileForeground()。从 Android 16 开始,如果调用该方法,该方法会返回 false

היקף העדיפות של שידור ממוין כבר לא גלובלי

Android 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 android:priority 属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority() API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。

在 Android 16 中,无法保证使用 android:priority 属性或 IntentFilter#setPriority() 在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。

此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITYSYSTEM_HIGH_PRIORITY 设置为广播优先级。

如果您的应用执行以下任一操作,可能会受到影响:

  1. 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
  2. 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。

如果进程需要相互协调,则应使用其他协调渠道进行通信。

שינויים פנימיים ב-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。

מצב תאימות לגודל דף של 16KB

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.

The compatibility mode dialog that displays when the system detects that a 4 KB-aligned app could run more optimally if 16 KB aligned.

חוויית משתמש וממשק המשתמש של המערכת

Android 16 (רמת API 36) כולל את השינויים הבאים, שנועדו ליצור חוויית משתמש עקבית ואינטואיטיבית יותר.

הוצאה משימוש של הודעות מפריעות בנושא נגישות

ב-Android 16 הופסקה התמיכה בהודעות נגישות, שמתאפיינות בשימוש ב-announceForAccessibility או בשליחת אירועי נגישות מסוג TYPE_ANNOUNCEMENT. כתוצאה מכך, חוויית המשתמש של משתמשי TalkBack וקורא המסך של Android עשויה להיות לא עקבית. חלופות יכולות לעזור לטפל בטווח רחב יותר של צרכים של משתמשים במגוון טכנולוגיות העזרה של Android.

דוגמאות לחלופות:

במסמכי העזרה של ממשק ה-API announceForAccessibility, שהוצא משימוש, מופיעים פרטים נוספים על חלופות מוצעות.

תמיכה בניווט ב-3 לחצנים

ב-Android 16 יש תמיכה בתכונה 'חזרה חזותית' בניווט ב-3 לחצנים באפליקציות שהועברו כראוי ל'חזרה חזותית'. לחיצה ארוכה על לחצן החזרה מפעילה אנימציה חזותית של תנועת החזרה, שמאפשרת לכם לראות תצוגה מקדימה של המקום שאליו תגיעו אם תמשיכו להחליק לאחור.

ההתנהגות הזו חלה על כל האזורים במערכת שתומכים באנימציות חיזוי של תנועת החזרה, כולל אנימציות המערכת (חזרה למסך הבית, בין משימות ובין פעילויות).

האנימציות החיזוניות של תנועת החזרה במצב ניווט ב-3 לחצנים.

גורמי צורה של מכשירים

ב-Android 16 (רמת API 36) יש שינויים באפליקציות כשהבעלים של מכשירים וירטואליים מקרינים אותן למסכים.

שינויים מברירת המחדל של הבעלים של המכשיר הווירטואלי

הבעלים של מכשיר וירטואלי הוא אפליקציה מהימנה או בעלת הרשאות שמשמשת ליצירה ולניהול של מכשיר וירטואלי. בעלי מכשיר וירטואלי מריצים אפליקציות במכשיר וירטואלי, ואז מקרינים את האפליקציות במסך של מכשיר מרוחק, כמו מחשב אישי, מכשיר מציאות מדומה או מערכת בידור ברכב. הבעלים של המכשיר הווירטואלי נמצא במכשיר מקומי, כמו טלפון נייד.

בעלים של מכשיר וירטואלי בטלפון יוצר מכשיר וירטואלי שמפזר את האפליקציה למסך מרוחק.

שינויים מברירת המחדל לכל אפליקציה

במכשירים עם Android 16 (API ברמה 36), בעלי מכשירי וירטואליים יכולים לשנות את הגדרות האפליקציות במכשירים וירטואליים נבחרים שבבעלותם. לדוגמה, כדי לשפר את הפריסה של האפליקציות, בעלי המכשיר הווירטואלי יכולים להתעלם מהמגבלות על הכיוון, יחס הגובה-רוחב והיכולת לשנות את הגודל של האפליקציות כשהם מקרינים אותן למסך חיצוני.

שינויי תוכנה נפוצים שעלולים לגרום לכשלים

התנהגות Android 16 עשויה להשפיע על ממשק המשתמש של האפליקציה במכשירים עם מסכים גדולים, כמו מסכי רכב או Chromebooks, במיוחד בפריסות שתוכננו למסכים קטנים בכיוון לאורך. במאמר מידע על פריסות מסתגלות מוסבר איך להתאים את האפליקציה לכל גורמי הצורה של המכשירים.

קובצי עזר

סטרימינג של אפליקציה נלווית

אבטחה

Android 16 (רמת API 36) כולל שינויים שמקדמים את אבטחת המערכת כדי להגן על אפליקציות ועל משתמשים מפני אפליקציות זדוניות.

אבטחה משופרת מפני התקפות של הפניה אוטומטית של כוונה (Intent)

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) }

אפליקציות נלוות לא מקבלות יותר התראות על זמן קצוב לתפוגה של גילוי

Android 16 在配套设备配对流程期间引入了一种新行为,以防恶意应用侵犯用户的位置信息隐私。在 Android 16 上运行的所有配套应用都不再直接通过 RESULT_DISCOVERY_TIMEOUT 收到发现超时通知。而是通过可视对话框通知用户超时事件。当用户关闭对话框时,系统会通过 RESULT_USER_REJECTED 提醒应用关联失败。

搜索时长也从原来的 20 秒延长到了 30 秒,并且用户可以在搜索期间的任何时间停止设备发现。如果在开始搜索的前 20 秒内发现了至少 1 部设备,CDM 会停止搜索其他设备。

קישוריות

Android 16 (רמת API 36) כולל את השינויים הבאים ב-Bluetooth stack כדי לשפר את הקישוריות עם ציוד היקפי.

טיפול משופר באובדן אג"ח

从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。

为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。