פלטפורמת 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 כעדיפות השידור.
יכול להיות שהאפליקציה שלכם תושפע אם היא מבצעת אחת מהפעולות הבאות:
- ב-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 deprecates accessibility announcements, characterized by the use of
announceForAccessibility or the dispatch of
TYPE_ANNOUNCEMENT accessibility events. These can create
inconsistent user experiences for users of TalkBack and Android's screen reader,
and alternatives better serve a broader range of user needs across a variety of
Android's assistive technologies.
Examples of alternatives:
- For significant UI changes like window changes, use
Activity.setTitle(CharSequence)andsetAccessibilityPaneTitle(java.lang.CharSequence). In Compose, useModifier.semantics { paneTitle = "paneTitle" } - To inform the user of changes to critical UI, use
setAccessibilityLiveRegion(int). In Compose, useModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}. These should be used sparingly as they may generate announcements every time a View is updated. - To notify users about errors, send an
AccessibilityEventof typeAccessibilityEvent#CONTENT_CHANGE_TYPE_ERRORand setAccessibilityNodeInfo#setError(CharSequence), or useTextView#setError(CharSequence).
The reference documentation for the deprecated
announceForAccessibility API includes more details about
suggested alternatives.
תמיכה בניווט ב-3 כפתורים
Android 16 brings predictive back support to the 3-button navigation for apps that have properly migrated to predictive back. Long-pressing the back button initiates a predictive back animation, giving you a preview of where the back swipe takes you.
This behavior applies across all areas of the system that support predictive back animations, including the system animations (back-to-home, cross-task, and cross-activity).
סמלי אפליקציות בעיצוב עקבי באופן אוטומטי
החל מ-Android 16 QPR 2, מערכת Android מחילה אוטומטית ערכות נושא על סמלי אפליקציות כדי ליצור חוויית מסך בית מגובשת. הבעיה הזו מתרחשת אם אפליקציה לא מספקת סמל אפליקציה מעוצב משלה. אפליקציות יכולות לשלוט בעיצוב של סמל האפליקציה לפי ערכת הנושא על ידי הוספת שכבה מונוכרומטית לסמל האפליקציה הדינמי ותצוגה מקדימה של סמל האפליקציה ב-Android Studio.
גורמי צורה של מכשירים
Android 16 (רמת API 36) כוללת את השינויים הבאים באפליקציות כשהן מוקרנות על מסכים על ידי בעלים של מכשירים וירטואליים.
שינוי הגדרות של בעלי מכשיר וירטואלי
A virtual device owner is a trusted or privileged app that creates and manages a virtual device. Virtual device owners run apps on a virtual device and then project the apps to the display of a remote device, such as a personal computer, virtual reality device, or car infotainment system. The virtual device owner is on a local device, such as a mobile phone.
Per-app overrides
On devices running Android 16 (API level 36), virtual device owners can override app settings on select virtual devices that the virtual device owners manage. For example, to improve app layout, a virtual device owner can ignore orientation, aspect ratio, and resizability restrictions when projecting apps onto an external display.
Common breaking changes
The Android 16 behavior might impact your app's UI on large screen form factors such as car displays or Chromebooks, especially layouts that were designed for small displays in portrait orientation. To learn how to make your app adaptive for all device form factors, see About adaptive layouts.
References
אבטחה
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) }
האפליקציות הנלוות לא מקבלות יותר הודעות על פסק זמן לגילוי
בגרסה 16 של Android נוספה התנהגות חדשה במהלך תהליך ההתאמה של מכשיר נלווה, כדי להגן על פרטיות המיקום של המשתמש מפני אפליקציות זדוניות. כל האפליקציות הנלוות שפועלות ב-Android 16 לא מקבלות יותר התראה ישירה על זמן הקצוב לגילוי באמצעות RESULT_DISCOVERY_TIMEOUT. במקום זאת, המשתמש יקבל הודעה על אירועי זמן קצוב באמצעות תיבת דו-שיח חזותית. כשהמשתמש סוגר את תיבת הדו-שיח, האפליקציה מקבלת התראה על כישלון השיוך עם RESULT_USER_REJECTED.
משך החיפוש הוא עכשיו ארוך יותר מ-20 השניות המקוריות, והמשתמשים יכולים להפסיק את זיהוי המכשיר בכל שלב במהלך החיפוש. אם נמצא מכשיר אחד לפחות ב-20 השניות הראשונות של החיפוש, ה-CDM מפסיק לחפש מכשירים נוספים.
קישוריות
Android 16 (רמת API 36) כוללת את השינויים הבאים במערך Bluetooth כדי לשפר את הקישוריות למכשירים היקפיים.
טיפול משופר באובדן של קשרים
Starting in Android 16, the Bluetooth stack has been updated to improve security and user experience when a remote bond loss is detected. Previously, the system would automatically remove the bond and initiate a new pairing process, which could lead to unintentional re-pairing. We have seen in many instances apps not taking care of the bond loss event in a consistent way.
To unify the experience, Android 16 improved the bond loss handling to the system. If a previously bonded Bluetooth device could not be authenticated upon reconnection, the system will disconnect the link, retain local bond information, and display a system dialog informing users of the bond loss and directing them to re-pair.