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

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

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

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

ב-Android 15 יש שינויים או הרחבות של יכולות ליבה שונות במערכת Android.

שינויים במצב 'החבילה הופסקה'

The intention of the package FLAG_STOPPED state (which users can engage in AOSP builds by long-pressing an app icon and selecting "Force Stop") has always been to keep apps in this state until the user explicitly removes the app from this state by directly launching the app or indirectly interacting with the app (through the sharesheet or a widget, selecting the app as live wallpaper, etc.). In Android 15, we've updated the behavior of the system to be aligned with this intended behavior. Apps should only be removed from the stopped state through direct or indirect user action.

To support the intended behavior, in addition to the existing restrictions, the system also cancels all pending intents when the app enters the stopped state on a device running Android 15. When the user's actions remove the app from the stopped state, the ACTION_BOOT_COMPLETED broadcast is delivered to the app providing an opportunity to re-register any pending intents.

You can call the new ApplicationStartInfo.wasForceStopped() method to confirm whether the app was put into the stopped state.

תמיכה בגודל דף של 16KB

בעבר הייתה ב-Android תמיכה רק בגודלי דפי זיכרון בגודל של 4KB, ביצוע אופטימיזציה של ביצועי זיכרון המערכת עבור הכמות הממוצעת של הזיכרון הכוללת בדרך כלל יש במכשירי Android. החל מ-Android 15, מערכת AOSP תומכת מכשירים שמוגדרים להשתמש בגודל דף של 16KB (16KB) מכשירים). אם באפליקציה נעשה שימוש בספריות NDK, ישירות או בעקיפין דרך SDK, תצטרכו לבנות את האפליקציה מחדש כדי פועלים במכשירים האלה בגודל 16KB.

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

כדי לעזור לך להוסיף תמיכה עבור האפליקציה, הכנו הנחיות בנושא בדיקה אם האפליקציה שלכם הושפעה, איך ליצור מחדש את האפליקציה (אם רלוונטי), ואיך לבדוק את האפליקציה סביבה של 16KB באמצעות אמולטורים (כולל Android 15) תמונות מערכת עבור אמולטור Android).

יתרונות ושיפור בביצועים

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

  • זמני השקה קצרים יותר של אפליקציות בזמן שהמערכת נמצאת בלחץ על הזיכרון: נמוך ב-3.16% בממוצע, עם שיפורים משמעותיים יותר (עד 30%) בחלק מהאפליקציות שבדקנו
  • צריכת חשמל מופחתת במהלך השקת האפליקציה: הפחתה של 4.56% בממוצע
  • הפעלה מהירה יותר של המצלמה: הפעלה מתוך הזיכרון (hot start) מהירה יותר ב-4.48% בממוצע, והפעלה מחדש (cold start) מהירה יותר ב-6.60% בממוצע
  • זמן הפעלה משופר של המערכת: שיפור של 8% (כ-950 אלפיות השנייה) בממוצע

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

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

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

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

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

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

כל האפליקציות

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

אפליקציות רפואיות

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

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

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

אפליקציות מרכז האפליקציות

אם אתם מפתחים אפליקציית מרכז אפליקציות, עליכם לבצע את הפעולות הבאות כדי שהאפליקציות במרחב הפרטי יהיו גלויות:

  1. האפליקציה שלכם צריכה להיות מוקצית כאפליקציית ברירת המחדל של מרכז האפליקציות במכשיר, כלומר, היא צריכה להיות מוקצית לתפקיד ROLE_HOME.
  2. באפליקציה צריך להצהיר על ההרשאה הרגילה ACCESS_HIDDEN_PROFILES בקובץ המניפסט של האפליקציה.

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

  1. לאפליקציה צריך להיות מאגר נפרד במרכז האפליקציות לאפליקציות שמותקנות במרחב הפרטי. משתמשים ב-method‏ getLauncherUserInfo() כדי לקבוע איזה סוג של פרופיל משתמש מנוהל.
  2. המשתמש צריך להיות מסוגל להסתיר ולהציג את הקונטיינר של המרחב הפרטי.
  3. המשתמש צריך להיות מסוגל לנעול ולפתוח את המרחב הפרטי. משתמשים ב-method‏ requestQuietModeEnabled() כדי לנעול (על ידי העברת true) או לבטל את הנעילה (על ידי העברת false) של המרחב הפרטי.
  4. כשהמרחב הפרטי נעול, אף אפליקציה במאגר שלו לא אמורה להיות גלויה או ניתנת לגילוי באמצעות מנגנונים כמו חיפוש. האפליקציה צריכה לרשום מקלט לשידורים של ACTION_PROFILE_AVAILABLE ושל ACTION_PROFILE_UNAVAILABLE, ולעדכן את ממשק המשתמש באפליקציה כשהסטטוס של המרחב הפרטי (נעול או לא נעול) משתנה. שתי השידורים האלה כוללים את הערך EXTRA_USER, שבעזרתו האפליקציה יכולה להפנות למשתמש בפרופיל הפרטי.

    אפשר גם להשתמש ב-method isQuietModeEnabled() כדי לבדוק אם פרופיל המרחב הפרטי נעול או לא.

אפליקציות מחנות האפליקציות

המרחב הפרטי כולל לחצן 'התקנת אפליקציות' שמפעיל כוונה משתמעת להתקין אפליקציות במרחב הפרטי של המשתמש. כדי שהאפליקציה תקבל את הכוונה המשתמעת הזו, צריך להצהיר על <intent-filter> בקובץ המניפסט של האפליקציה עם <category> של CATEGORY_APP_MARKET.

גופן אמוג'י מבוסס-PNG הוסר

קובץ הגופן הקודם של אמוג'י (NotoColorEmojiLegacy.ttf) שמבוסס על קובץ PNG הוסר, ונותר רק הקובץ המבוסס על וקטור. החל מ-Android 13 (רמת API 33), קובץ הגופן של האמוג'י שמשמש את המערכת להצגת אמוג'י השתנה מקובץ מבוסס-PNG לקובץ מבוסס-וקטור. המערכת שמרה את קובץ הגופן הקודם ב-Android 13 וב-Android 14 מסיבות תאימות, כדי שאפליקציות עם מנועי גופן משלהם יוכלו להמשיך להשתמש בקובץ הגופן הקודם עד שהן יוכלו לשדרג.

כדי לבדוק אם האפליקציה שלכם מושפעת, מחפשים בקוד של האפליקציה הפניות לקובץ NotoColorEmojiLegacy.ttf.

יש כמה דרכים להתאים את האפליקציה:

  • שימוש ב-API של פלטפורמות לעיבוד טקסט. אפשר להעביר טקסט ל-Canvas שמבוסס על bitmap ולהשתמש בו כדי לקבל תמונה גולמית, אם צריך.
  • מוסיפים לאפליקציה תמיכה בגופנים מסוג COLRv1. ספריית FreeType בקוד פתוח תומכת ב-COLRv1 בגרסה 2.13.0 ואילך.
  • כחלופה אחרונה, אפשר לצרף את קובץ הגופן הקודם של אמוג'י (NotoColorEmoji.ttf) לקובץ ה-APK, אבל במקרה כזה באפליקציה לא יוצגו עדכוני האמוג'י האחרונים. למידע נוסף, אפשר לעיין בדף הפרויקט של Noto Emoji ב-GitHub.

הגרסה המינימלית של SDK היעד הועלתה מ-23 ל-24

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

תוכנות זדוניות מכוונות לעיתים קרובות לרמות נמוכות יותר של API כדי לעקוף את האבטחה והפרטיות באמצעי ההגנה שהוכנסו לשימוש בגרסאות מתקדמות יותר של Android. לדוגמה, אפליקציות זדוניות מסוימות משתמשות ב-targetSdkVersion של 22 כדי להימנע מהתחייבות למודל ההרשאות בסביבת זמן הריצה שהוצג ב-2015 ב-Android 6.0 Marshmallow (רמת API 23). השינוי הזה ב-Android 15 מקשה על תוכנות זדוניות להימנע מאבטחה ושיפורים בפרטיות. ניסיון להתקין אפליקציה שמטרגטת ממשק API נמוך יותר יוביל לכשל בהתקנה, ותופיע הודעה כמו ההודעה הבאה מופיע ב-Logcat:

INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 24, but found 7

במכשירים ששודרגו ל-Android 15, אפליקציות עם targetSdkVersion נמוך מ-24 יישארו מותקנות.

אם צריך לבדוק אפליקציה שמטרגטת רמת API ישנה יותר, אפשר להשתמש ב-ADB הבא הפקודה:

adb install --bypass-low-target-sdk-block FILENAME.apk

אבטחה ופרטיות

Android 15 introduces robust measures to combat one-time passcode (OTP) fraud and to protect the user's sensitive content, focusing on hardening the Notification Listener Service and screenshare protections. Key enhancements include redacting OTPs from notifications accessible to untrusted apps, hiding notifications during screenshare, and securing app activities when OTPs are posted. These changes aim to keep the user's sensitive content safe from unauthorized actors.

Developers need to be aware of the following to ensure their apps are compatible with the changes in Android 15:

OTP Redaction

Android will stop untrusted apps that implement a NotificationListenerService from reading unredacted content from notifications where an OTP has been detected. Trusted apps such as companion device manager associations are exempt from these restrictions.

Screenshare Protection

  • Notification content is hidden during screen sharing sessions to preserve the user's privacy. If the app implements setPublicVersion(), Android shows the public version of the notification which serves as a replacement notification in insecure contexts. Otherwise, the notification content is redacted without any further context.
  • Sensitive content like password input is hidden from remote viewers to prevent revealing the user's sensitive information.
  • Activities from apps that post notifications during screenshare where an OTP has been detected will be hidden. App content is hidden from the remote viewer when launched.
  • Beyond Android's automatic identification of sensitive fields, developers can manually mark parts of their app as sensitive using setContentSensitivity, which is hidden from remote viewers during screenshare.
  • Developers can choose to toggle the Disable screen share protections option under Developer Options to be exempted from the screenshare protections for demo or testing purposes. The default system screen recorder is exempted from these changes, since the recordings remain on-device.

מצלמה ומדיה

ב-Android 15 מתבצעים השינויים הבאים בהתנהגות של המצלמה והמדיה בכל האפליקציות.

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

Before Android 15, if an app requested direct or offload audio playback while another app was playing audio and the resource limits were reached, the app would fail to open a new AudioTrack.

Beginning with Android 15, when an app requests direct or offload playback and the resource limits are reached, the system invalidates any currently open AudioTrack objects which prevent fulfilling the new track request.

(Direct and offload audio tracks are typically opened for playback of compressed audio formats. Common use-cases for playing direct audio include streaming encoded audio over HDMI to a TV. Offload tracks are typically used to play compressed audio on a mobile device with hardware DSP acceleration.)

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

Android 15 כולל כמה שינויים שנועדו ליצור חוויית משתמש עקבית ואינטואיטיבית יותר.

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

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

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

ווידג'טים מושבתים כשהמשתמש משבית אפליקציה בכוח

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

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

מידע נוסף זמין במאמר שינויים במצב 'החבילה הופסקה'.

צ'יפ בשורת הסטטוס של הקרנת מדיה מתריע למשתמשים על שיתוף מסך, הפעלת Cast והקלטה

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

באפליקציות שפועלות במכשירים עם Android 15 QPR1 ואילך, צ'יפ גדול ובולט בסרגל המצב מתריע למשתמשים על הקרנת מסך מתמשכת. המשתמשים יכולים להקיש על הצ'יפ כדי להפסיק את השיתוף, ההעברה או הצילום של המסך שלהם. בנוסף, הקרנת המסך תיפסק באופן אוטומטי כשמסך המכשיר יינעל.

צ'יפ בשורת הסטטוס לשיתוף מסך, להעברה (cast) ולהקלטה.

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

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

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

הגבלות גישה לרשת ברקע

In Android 15, apps that start a network request outside of a valid process lifecycle receive an exception. Typically, an UnknownHostException or other socket-related IOException. Network requests that happen outside of a valid lifecycle are usually due to apps unknowingly continuing a network request even after the app is no longer active.

To mitigate this exception, ensure your network requests are lifecycle aware and cancelled upon leaving a valid process lifecycle by using lifecycle aware components. If it is important that the network request should happen even when the user leaves the application, consider scheduling the network request using WorkManager or continue a user visible task using Foreground Service.

תכונות שיצאו משימוש

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

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