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

פלטפורמת 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 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

虚拟设备所有者是创建和管理虚拟设备的受信任应用或特权应用。虚拟设备所有者在虚拟设备上运行应用,然后将应用投影到远程设备的显示屏上,例如个人电脑、虚拟现实设备或车载信息娱乐系统。虚拟设备所有者位于本地设备上,例如手机。

手机上的虚拟设备所有者创建将应用投影到远程显示屏的虚拟设备。

按应用替换项

在搭载 Android 16(API 级别 36)的设备上,虚拟设备所有者可以替换其管理的特定虚拟设备上的应用设置。例如,为了改进应用布局,虚拟设备所有者在将应用投影到外部显示屏上时,可以忽略屏幕方向、宽高比和可调整大小性限制。

常见的重大更改

Android 16 行为可能会影响应用在汽车显示屏或 Chromebook 等大屏幕设备上的界面,尤其是那些专为竖屏小显示屏设计的布局。如需了解如何让应用适应所有设备类型,请参阅关于自适应布局

参考编号

配套应用串流

אבטחה

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

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

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

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

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

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

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

לאפליקציות שעוברות הידור (compilation) עם SDK של Android 16 ‏(API level 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) }

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

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

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

קישוריות

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

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

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

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