פלטפורמת 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_PRIORITY、SYSTEM_HIGH_PRIORITY 设置为广播优先级。
如果您的应用执行以下任一操作,可能会受到影响:
- 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
- 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。
如果进程需要相互协调,则应使用其他协调渠道进行通信。
שינויים פנימיים ב-ART
Android 16 כולל את העדכונים האחרונים ל-Android Runtime (ART), שמשפרים את הביצועים של Android Runtime (ART) ומספקים תמיכה בתכונות נוספות של Java. דרך עדכוני המערכת של Google Play, השיפורים האלה זמינים גם ליותר ממיליארד מכשירים עם Android 12 (רמת API 31) ואילך.
כשהשינויים האלה יפורסמו, יכול להיות שספריות וקוד של אפליקציות שמסתמכים על מבנים פנימיים של ART לא יפעלו כראוי במכשירים עם Android 16, וגם בגרסאות קודמות של Android שבהן מופעלים עדכוני מערכת של Google Play למודול ART.
תמיד יכולות להיות בעיות תאימות אם מסתמכים על מבנים פנימיים (כמו ממשקים שאינם SDK), אבל חשוב במיוחד להימנע מהסתמכות על קוד (או ספריות שמכילות קוד) שמשתמש במבנים פנימיים של ART, כי השינויים ב-ART לא קשורים לגרסה של הפלטפורמה שבה המכשיר פועל, והם מועברים ליותר ממיליארד מכשירים דרך עדכוני המערכת של Google Play.
כל המפתחים צריכים לבדוק אם האפליקציה שלהם מושפעת מהשינוי, על ידי בדיקה יסודית של האפליקציות ב-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.
חוויית המשתמש וממשק המשתמש של המערכת
Android 16 (API ברמה 36) כוללת את השינויים הבאים, שנועדו ליצור חוויית משתמש עקבית ואינטואיטיבית יותר.
הוצאה משימוש של הודעות נגישות מפריעות
Android 16 废弃了无障碍功能通告,其特征是使用 announceForAccessibility 或调度 TYPE_ANNOUNCEMENT 无障碍功能事件。这可能会给 TalkBack 和 Android 屏幕阅读器用户带来不一致的用户体验,而替代方案可以更好地满足各种 Android 辅助技术的用户需求。
替代方案示例:
- 对于窗口更改等重大界面更改,请使用
Activity.setTitle(CharSequence)和setAccessibilityPaneTitle(java.lang.CharSequence)。在 Compose 中,使用Modifier.semantics { paneTitle = "paneTitle" } - 如需向用户告知关键界面的更改,请使用
setAccessibilityLiveRegion(int)。在 Compose 中,请使用Modifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}。应谨慎使用这些事件,因为它们可能会在每次更新视图时生成通知。 - 如需向用户发送错误通知,请发送类型为
AccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR的AccessibilityEvent并设置AccessibilityNodeInfo#setError(CharSequence),或使用TextView#setError(CharSequence)。
已废弃的 announceForAccessibility API 的参考文档中包含有关建议替代方案的更多详细信息。
תמיכה בניווט ב-3 כפתורים
ב-Android 16 יש תמיכה בתכונה 'חזרה חזותית' בניווט ב-3 לחצנים באפליקציות שהועברו כראוי ל'חזרה חזותית'. לחיצה ארוכה על לחצן החזרה מפעילה אנימציה חזותית של תנועת החזרה, שמאפשרת לכם לראות תצוגה מקדימה של המקום שאליו תגיעו אם תמשיכו להחליק לאחור.
ההתנהגות הזו חלה על כל האזורים במערכת שתומכים באנימציות חיזוי של תנועת החזרה, כולל אנימציות המערכת (חזרה למסך הבית, בין משימות ובין פעילויות).
סמלי אפליקציות בעיצוב עקבי באופן אוטומטי
החל מ-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 重定向漏洞。在大多数情况下,正常使用 intent 的应用不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会出现中断。
Intent 重定向在 Android 中出现,当攻击者可以部分或完全 控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,而受害应用会在 intent 的 extra 字段中启动不受信任的子级 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 כדי לשפר את הקישוריות למכשירים היקפיים.
טיפול משופר באובדן של קשרים
从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。
为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。