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

פלטפורמת 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 כדי להגדיר את העדיפות. במקרה של מקלטים שמתועדפים לפי הקשר, האפליקציות יכולות להשתמש ב-API‏ IntentFilter#setPriority() כדי להגדיר את העדיפות. כשמפעילים שידור, המערכת מעבירה אותו לנמענים לפי סדר העדיפויות שלהם, מהגבוה לנמוך.

ב-Android 16, לא מובטח שהסדר של העברת השידורים באמצעות המאפיין android:priority או IntentFilter#setPriority() בתהליכים שונים יישמר. המערכת תתייחס לעדיפויות השידור רק באותו תהליך בקשה, ולא בכל התהליכים.

בנוסף, העדיפויות של השידורים יוגבלו באופן אוטומטי לטווח (SYSTEM_LOW_PRIORITY + 1,‏ SYSTEM_HIGH_PRIORITY - 1). רק רכיבי המערכת יוכלו להגדיר את SYSTEM_LOW_PRIORITY ו-SYSTEM_HIGH_PRIORITY כעדיפות השידור.

יכול להיות שהאפליקציה שלכם תושפע אם היא מבצעת אחת מהפעולות הבאות:

  1. ב-Intent הרצוי של השידור יש כמה תהליכים ב-Intent הרצוי של השידור, ויש ציפיות לקבלת ה-Intent האלה בסדר מסוים על סמך העדיפות.
  2. תהליך הבקשה שלכם מתקשר עם תהליכים אחרים, ויש לו ציפיות לגבי קבלת כוונה לשידור בסדר מסוים.

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

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

כשהאפליקציה פועלת במכשיר עם Android מגרסה 16 ואילך, אם מערכת Android מזהה שהאפליקציה כוללת דפי זיכרון בגודל 4KB, היא משתמשת באופן אוטומטי במצב תאימות ומציגה למשתמש תיבת דו-שיח עם התראה. הגדרת המאפיין android:pageSizeCompat בקובץ AndroidManifest.xml כדי להפעיל את מצב התאימות לאחור תמנע את הצגת תיבת הדו-שיח כשהאפליקציה מופעלת. כדי להשתמש בנכס android:pageSizeCompat, צריך לקמפל את האפליקציה באמצעות Android 16 SDK.

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

תיבת הדו-שיח של מצב התאימות שמופיעה כשהמערכת מזהה שאפליקציה שמותאמת ל-4KB עשויה לפעול בצורה אופטימלית יותר אם היא מותאמת ל-16KB.

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

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

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

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

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

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

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

Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。

此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。

“三按钮”导航模式下的预测性返回动画。

סמלי אפליקציות מעוצבים באופן אוטומטי

从 Android 16 QPR 2 开始,Android 会自动将主题应用于应用图标,以打造一致的主屏幕体验。如果应用未提供自己的带主题的应用图标,就会发生这种情况。应用可以通过在自适应图标中添加单色图层来控制主题化应用图标的设计,并在 Android Studio 中预览应用图标的外观。

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

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

ביטול הגדרות של בעלי מכשיר וירטואלי

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

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

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

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

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

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

קובצי עזר

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

אבטחה

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

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

‫Android 16 מספק אבטחה כברירת מחדל מפני Intentהתקפות כלליות של הפניה אוטומטית, עם דרישות מינימליות של תאימות ושינויים למפתחים.

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

הפניה אוטומטית של Intent ב-Android מתרחשת כשהאקר יכול לשלוט באופן חלקי או מלא בתוכן של Intent שמשמש להפעלת רכיב חדש בהקשר של אפליקציה פגיעה, בזמן שאפליקציית הקורבן מפעילה Intent לא מהימן ברמת משנה בשדה תוספות של Intent ("ברמה העליונה"). הדבר עלול להוביל להפעלת רכיבים פרטיים בהקשר של אפליקציית הקורבן על ידי אפליקציית התוקף, להפעלת פעולות עם הרשאות מיוחדות או לקבלת גישת URI לנתונים רגישים, ועלול להוביל לגניבת נתונים ולהרצת קוד שרירותי.

ביטול ההסכמה לטיפול בהפניה אוטומטית של Intent

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

לאפליקציות שעוברות הידור (compilation) עם SDK של Android 16 (רמת API 36) ומעלה

אפשר להשתמש ישירות בשיטה removeLaunchSecurityProtection() באובייקט Intent.

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 כדי לשפר את הקישוריות למכשירים היקפיים.

טיפול משופר באובדן של קשרים

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

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