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

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

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

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

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

שינויים במצב העצירה של החבילה

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

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

אפשר להפעיל את השיטה החדשה ApplicationStartInfo.wasForceStopped() כדי לוודא שהאפליקציה הועברה למצב מושהה.

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

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

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

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

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

配置为使用 16 KB 页面大小的设备平均会使用略多一些的内存,但系统和应用的性能也会得到各种提升:

  • 缩短了系统内存压力时的应用启动时间:平均降低了 3.16%;对于我们测试的某些应用而言,改进幅度更大(最高可达 30%)
  • 应用启动期间的功耗降低:平均降低了 4.56%
  • 相机启动更快:热启动速度平均提高了 4.48%,冷启动速度平均提高了 6.60%
  • 缩短了系统启动时间:平均缩短了 8%(约 950 毫秒)

这些改进基于我们的初始测试,实际设备上的结果可能会有所不同。随着测试的继续进行,我们将进一步分析应用的潜在收益。

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

如果您的应用使用了任何原生代码,则应重新构建应用,使其支持 16 KB 设备。如果您不确定自己的应用是否使用了原生代码,可以使用 APK 分析器来确定是否存在任何原生代码,然后检查您找到的任何共享库的 ELF 段对齐情况。Android Studio 还提供了一些功能,可帮助您自动检测对齐问题

如果您的应用仅使用以 Java 或 Kotlin 编程语言编写的代码(包括所有库或 SDK),则该应用已支持 16 KB 设备。不过,我们建议您在 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 引入了强大的措施来防范动态密码 (OTP) 欺诈并保护用户的敏感内容,重点是增强通知监听器服务和屏幕共享保护措施。主要增强功能包括从可供不可信应用访问的通知中隐去 OTP、在屏幕共享期间隐藏通知,以及在发布 OTP 时保护应用 activity。这些变更旨在保护用户的敏感内容,使其免受未经授权的操作者的侵害。

开发者需要注意以下事项,以确保其应用与 Android 15 中的变更兼容:

动态密码隐去

Android 会阻止实现 NotificationListenerService 的不受信任应用读取已检测到 OTP 的通知中的未隐去的内容。配套设备管理器关联等受信任应用不受这些限制。

屏幕共享保护

  • 在屏幕共享会话期间,系统会隐藏通知内容,以保护用户的隐私。如果应用实现了 setPublicVersion(),Android 会显示通知的公开版本,该版本在不安全情境中用作替换通知。否则,系统会隐去通知内容,不提供任何其他背景信息。
  • 系统会向远程观看者隐藏密码输入等敏感内容,以防止泄露用户的敏感信息。
  • 如果在屏幕共享期间检测到动态密码,系统会隐藏在该时间段内发布通知的应用的活动。应用内容在启动时会向远程查看器隐藏。
  • 除了 Android 自动识别敏感字段之外,开发者还可以使用 setContentSensitivity 手动将应用的部分标记为敏感,在屏幕共享期间,这些敏感字段会对远程观看者隐藏。
  • 开发者可以选择切换开发者选项下的停用屏幕共享防护选项,以便出于演示或测试目的豁免屏幕共享防护。默认的系统屏幕录制工具不受这些更改的影响,因为录制内容会保留在设备上。

מצלמה ומדיה

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

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

在 Android 15 之前,如果某个应用在另一个应用播放音频且达到资源限制时请求直接或分流音频播放,该应用将无法打开新的 AudioTrack

从 Android 15 开始,当应用请求直接播放或分流播放且达到资源限制时,系统会使任何当前打开的 AudioTrack 对象失效,以防止执行新轨道请求。

(直接音轨和分流音轨通常会打开,以播放压缩音频格式。播放直接音频的常见用例包括通过 HDMI 将编码的音频流式传输到电视。分流轨道通常用于在具有硬件 DSP 加速的移动设备上播放压缩音频。)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

הפסקת תמיכה

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

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