פלטפורמת Android 14 כוללת שינויים בהתנהגות שעשויים להשפיע על האפליקציה שלכם. שינויי ההתנהגות הבאים חלים על כל האפליקציות כשהן פועלות ב-Android 14, ללא קשר ל-targetSdkVersion
. מומלץ לבדוק את האפליקציה ולאחר מכן לשנות אותה לפי הצורך כדי לתמוך בהם כראוי, במקרים הרלוונטיים.
חשוב גם לעיין ברשימת שינויי ההתנהגות שמשפיעים רק על אפליקציות שמטרגטות ל-Android 14.
פונקציונליות עיקרית
כברירת מחדל, אי אפשר לתזמן התראות מדויקות
התראות מדויקות מיועדות להתראות שהמשתמשים רוצים לקבל, או לפעולות שצריכות להתרחש בשעה מדויקת. החל מגרסה 14 של Android, ההרשאה SCHEDULE_EXACT_ALARM
לא מוענקת מראש לרוב האפליקציות החדשות שמותקנות ומטרגטות את Android מגרסה 13 ואילך – ההרשאה נדחית כברירת מחדל.
מידע נוסף על השינויים בהרשאה לתזמון התראות מדויקות
שידורים שנרשמו לפי הקשר נכנסים לתור בזמן שהאפליקציות נשמרות במטמון
ב-Android 14, המערכת יכולה להוסיף לשורה של ההעברות בשידור חי שנרשמו לפי הקשר בזמן שהאפליקציה נמצאת במצב שמאוחסן במטמון. ההתנהגות הזו דומה להתנהגות של תורים שהוצגה ב-Android 12 (רמת API 31) עבור טרנזקציות אסינכררוניות של Binder. שידורים שהוצהרו כמניפסט לא נמצאים בתור, והאפליקציות מוסרות ממצב המטמון בשביל לשדר שידורים.
כשהאפליקציה יוצאת ממצב המטמון, למשל חזרה לחזית, מספקת שידורים בתור. מופעים מרובים של שידורים מסוימים יכול להיות ימוזגו לשידור אחד. בהתאם לגורמים אחרים, כמו למשל המערכת תקינות, ייתכן שאפליקציות יוסרו ממצב המטמון שידורים חיים.
אפליקציות יכולות לסגור רק את תהליכי הרקע שלהן
Starting in Android 14, when your app calls killBackgroundProcesses()
,
the API can kill only the background processes of your own app.
If you pass in the package name of another app, this method has no effect on that app's background processes, and the following message appears in Logcat:
Invalid packageName: com.example.anotherapp
Your app shouldn't use the killBackgroundProcesses()
API or otherwise attempt
to influence the process lifecycle of other apps, even on older OS versions.
Android is designed to keep cached apps in the background and kill them
automatically when the system needs memory. If your app kills other apps
unnecessarily, it can reduce system performance and increase battery consumption
by requiring full restarts of those apps later, which takes significantly more
resources than resuming an existing cached app.
ה-MTU מוגדר ל-517 עבור לקוח ה-GATT הראשון שמבקש MTU
Starting from Android 14, the Android Bluetooth stack more strictly adheres to
Version 5.2 of the Bluetooth Core Specification and requests
the BLE ATT MTU to 517 bytes when the first GATT client requests an MTU using
the BluetoothGatt#requestMtu(int)
API, and disregards all subsequent MTU
requests on that ACL connection.
To address this change and make your app more robust, consider the following options:
- Your peripheral device should respond to the Android device's MTU request
with a reasonable value that can be accommodated by the peripheral. The
final negotiated value will be a minimum of the Android requested value and
the remote provided value (for example,
min(517, remoteMtu)
)- Implementing this fix could require a firmware update for peripheral
- Alternatively, limit your GATT characteristic writes based on the minimum
between the known supported value of your peripheral and the received MTU
change
- A reminder that you should reduce 5 bytes from the supported size for the headers
- For example:
arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5
סיבה חדשה לכך שאפליקציה יכולה להיכלל בקטגוריה 'המתנה מוגבלת'
ב-Android 14 נוספה סיבה חדשה לכך שאפליקציה יכולה להיכלל בקטגוריית המתנה מוגבלת.
המשימות של האפליקציה גורמות לשגיאות ANR מספר פעמים בגלל תפוגת הזמן של השיטות onStartJob
, onStopJob
או onBind
.
(מידע על השינויים ב-onStartJob
וב-onStopJob
זמין במאמר JobScheduler משפר את ההתנהגות של קריאות חזרה (callbacks) ורשתות).
כדי לעקוב אחרי האפליקציה ולבדוק אם היא נכנסה לקטגוריה של סטטוס המתנה המוגבל, מומלץ לתעד את הנתונים באמצעות ה-API UsageStatsManager.getAppStandbyBucket()
בזמן ביצוע המשימה או UsageStatsManager.queryEventsForSelf()
בזמן הפעלת האפליקציה.
mlock מוגבל ל-64KB
ב-Android 14 (API ברמה 34) ואילך, הפלטפורמה מצמצמת את נפח הזיכרון המקסימלי שניתן לנעול באמצעות mlock()
ל-64KB לכל תהליך. בגרסאות קודמות, המגבלה הייתה 64MB לכל תהליך. ההגבלה הזו משפרת את ניהול הזיכרון באפליקציות ובמערכת. כדי לשפר את העקביות במכשירים השונים, ב-Android 14 מתווסף בדיקת CTS חדשה למגבלה החדשה של mlock()
במכשירים התואמים.
המערכת אוכפת את השימוש במשאבים של אפליקציות שנשמרו במטמון
כחלק מהעיצוב, התהליך של האפליקציה נמצא במצב שמאוחסן במטמון כשהיא מועברת לרקע ואין רכיבים אחרים של תהליך האפליקציה שפועלים. תהליך אפליקציה כזה עלול להיפסק בגלל לחץ על זיכרון המערכת. כל עבודה שמבצעות מכונות Activity
אחרי שקריאת השיטה onStop()
הושלמה והיא החזירה תשובה, במצב הזה, לא מהימנה ומומלץ מאוד לא לבצע אותה.
בגרסה 14 של Android נוספו עקביות ואכיפה לתכנון הזה. זמן קצר אחרי שתהליך של אפליקציה נכנס למצב שמאוחסן במטמון, אסור לבצע משימות ברקע עד שרכיב של התהליך חוזר למצב פעיל במחזור החיים.
אפליקציות שמשתמשות בממשקי API רגילים של מחזור חיים שנתמכים במסגרת – כמו services, JobScheduler
ו-Jetpack WorkManager – לא אמורות להיות מושפעות מהשינויים האלה.
חוויית משתמש
שינויים באופן שבו משתמשים רואים התראות שלא ניתן לסגור
If your app shows non-dismissable foreground notifications to users, Android 14 has changed the behavior to allow users to dismiss such notifications.
This change applies to apps that prevent users from dismissing foreground
notifications by setting Notification.FLAG_ONGOING_EVENT
through
Notification.Builder#setOngoing(true)
or
NotificationCompat.Builder#setOngoing(true)
. The behavior of
FLAG_ONGOING_EVENT
has changed to make such notifications actually
dismissable by the user.
These kinds of notifications are still non-dismissable in the following conditions:
- When the phone is locked
- If the user selects a Clear all notification action (which helps with accidental dismissals)
Also, this new behavior doesn't apply to notifications in the following use cases:
CallStyle
notifications- Device policy controller (DPC) and supporting packages for enterprise
- Media notifications
- The default Search Selector package
המידע על אבטחת הנתונים גלוי יותר
כדי לשפר את פרטיות המשתמשים, ב-Android 14 המערכת מציגה את המידע שהצהרתם עליו בטופס ב-Play Console במספר מקומות גדול יותר. בשלב זה, המשתמשים יכולים לראות את המידע הזה בקטע אבטחת נתונים בדף האפליקציה ב-Google Play.
מומלץ לבדוק את המדיניות של האפליקציה בנושא שיתוף נתוני המיקום, ולהקדיש כמה דקות לביצוע עדכונים רלוונטיים בקטע'אבטחת נתונים' ב-Google Play.
במדריך מוסבר איך מידע על אבטחת הנתונים מוצג בצורה בולטת יותר ב-Android 14.
נגישות
הגדלת גופן לא לינארית ל-200%
החל מגרסה 14 של Android, המערכת תומכת בהגדלת גופן עד 200%, ומספקת למשתמשים עם לקות ראייה אפשרויות נוספות של נגישות בהתאם להנחיות הנגישות לתוכן אינטרנט (WCAG).
אם אתם כבר משתמשים ביחידות של פיקסלים שניתן לשנות (sp) כדי להגדיר את גודל הטקסט, סביר להניח שהשינוי הזה לא ישפיע באופן משמעותי על האפליקציה. עם זאת, מומלץ לבצע בדיקת ממשק משתמש כשגודל הגופן המקסימלי מופעל (200%) כדי לוודא שהאפליקציה יכולה להכיל גדלי גופן גדולים יותר בלי להשפיע על נוחות השימוש.
אבטחה
רמת ה-API המינימלית לטירגוט להתקנה
Starting with Android 14, apps with a
targetSdkVersion
lower than 23
can't be installed. Requiring apps to meet these minimum target API level
requirements improves security and privacy for users.
Malware often targets older API levels in order to bypass security and privacy
protections that have been introduced in newer Android versions. For example,
some malware apps use a targetSdkVersion
of 22 to avoid being subjected to the
runtime permission model introduced in 2015 by Android 6.0 Marshmallow (API
level 23). This Android 14 change makes it harder for malware to avoid security
and privacy improvements.
Attempting to install an app targeting a lower API level will result in an
installation failure, with the following message appearing in Logcat:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7
On devices upgrading to Android 14, any apps with a targetSdkVersion
lower
than 23 will remain installed.
If you need to test an app targeting an older API level, use the following ADB command:
adb install --bypass-low-target-sdk-block FILENAME.apk
ייתכן ששמות החבילות של בעלי המדיה יימחקו
מאגר המדיה תומך בשאילתות לגבי העמודה OWNER_PACKAGE_NAME
, שמציינת את האפליקציה ששמרה קובץ מדיה מסוים. החל מגרסה Android 14, הערך הזה מושמט אלא אם מתקיים לפחות אחד מהתנאים הבאים:
- לאפליקציה ששמרה את קובץ המדיה יש שם חבילה שגלוי תמיד לאפליקציות אחרות.
האפליקציה ששולחת שאילתה לחנות המדיה מבקשת את ההרשאה
QUERY_ALL_PACKAGES
.
מידע נוסף על האופן שבו מערכת Android מסננת את החשיפה של חבילות למטרות פרטיות.