פלטפורמת Android 14 כוללת שינויים בהתנהגות שעשויים להשפיע על האפליקציה שלכם. שינויי ההתנהגות הבאים רלוונטיים לכל האפליקציות כשהן פועלות ב-Android 14, בלי קשר ל-targetSdkVersion. אתם צריכים לבדוק את האפליקציה ולשנות אותה לפי הצורך כדי שהיא תתמוך בהתנהגויות האלה בצורה תקינה, במקרים הרלוונטיים.
חשוב גם לבדוק את רשימת השינויים בהתנהגות שמשפיעים רק על אפליקציות שמטרגטות ל-Android 14.
פונקציונליות עיקרית
כברירת מחדל, נדחות בקשות לתזמון התראות מדויקות
התראות מדויקות מיועדות להתראות שהמשתמשים רוצים לקבל, או לפעולות שצריכות להתרחש בשעה מדויקת. החל מגרסה 14 של Android, ההרשאה SCHEDULE_EXACT_ALARM לא מוענקת מראש לרוב האפליקציות החדשות שמותקנות ומטרגטות את Android מגרסה 13 ואילך – ההרשאה נדחית כברירת מחדל.
מידע נוסף על השינויים בהרשאה לתזמון התראות מדויקות
שידורים שנרשמו בהקשר מסוים מוכנסים לתור בזמן שהאפליקציות נמצאות במטמון
On Android 14, the system can place context-registered broadcasts in a queue while the app is in the cached state. This is similar to the queuing behavior that Android 12 (API level 31) introduced for async binder transactions. Manifest-declared broadcasts aren't queued, and apps are removed from the cached state for broadcast delivery.
When the app leaves the cached state, such as returning to the foreground, the system delivers any queued broadcasts. Multiple instances of certain broadcasts might be merged into one broadcast. Depending on other factors, such as system health, apps might be removed from the cached state, and any previously queued broadcasts are delivered.
אפליקציות יכולות לסגור רק את התהליכים שלהן ברקע
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
החל מ-Android 14, סטאק ה-Bluetooth של Android פועל בהתאם ל-גרסה 5.2 של מפרט הליבה של Bluetooth באופן קפדני יותר, ומבקש את MTU של ATT ב-BLE ל-517 בייטים כשלקוח ה-GATT הראשון מבקש MTU באמצעות ה-API BluetoothGatt#requestMtu(int), ומתעלם מכל בקשות ה-MTU הבאות בחיבור ה-ACL הזה.
כדי להתמודד עם השינוי הזה ולשפר את האפליקציה, כדאי לשקול את האפשרויות הבאות:
- מכשיר ההיקפי צריך להגיב לבקשת ה-MTU של מכשיר Android עם ערך סביר שאפשר להכיל במכשיר ההיקפי. הערך הסופי של ההסכם יהיה הערך המינימלי של הערך המבוקש ב-Android והערך שסופק בשלט הרחוק (לדוגמה,
min(517, remoteMtu))- כדי להטמיע את התיקון הזה, יכול להיות שיהיה צורך בעדכון קושחה של הציוד ההיקפי
- לחלופין, אפשר להגביל את הכתיבה של מאפייני GATT על סמך הערך המינימלי בין הערך הנתמך הידוע של ההתקן ההיקפי לבין השינוי ב-MTU שהתקבל
- תזכורת: צריך להפחית 5 בייטים מהגודל הנתמך של הכותרות
- לדוגמה:
arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5
סיבה חדשה לכך שאפליקציה יכולה להיכלל בקטגוריית ההמתנה המוגבלת
Android 14 introduces a new reason an app can be placed into the restricted standby bucket.
The app's jobs trigger ANR errors multiple times due to onStartJob,
onStopJob, or onBind method timeouts.
(See JobScheduler reinforces callback and network behavior for changes
to onStartJob and onStopJob.)
To track whether or not the app has entered the restricted standby bucket,
we recommend logging with the API UsageStatsManager.getAppStandbyBucket()
on job execution or UsageStatsManager.queryEventsForSelf() on app startup.
mlock מוגבל ל-64 KB
ב-Android 14 (API ברמה 34) ואילך, הפלטפורמה מצמצמת את נפח הזיכרון המקסימלי שניתן לנעול באמצעות mlock() ל-64KB לכל תהליך. בגרסאות קודמות, המגבלה הייתה 64MB לכל תהליך. ההגבלה הזו משפרת את ניהול הזיכרון באפליקציות ובמערכת. כדי לשפר את העקביות במכשירים השונים, ב-Android 14 מתווסף בדיקת CTS חדשה למגבלה החדשה של mlock() במכשירים התואמים.
המערכת אוכפת את השימוש במשאבים של אפליקציות שנשמרו במטמון
By design, an app's process is in a cached state when it's moved to the
background and no other app process components are running. Such an app process
is subject to being killed due to system memory pressure. Any work that
Activity instances perform after the onStop() method has been called and
returned, while in this state, is unreliable and strongly discouraged.
Android 14 introduces consistency and enforcement to this design. Shortly after an app process enters a cached state, background work is disallowed, until a process component re-enters an active state of the lifecycle.
Apps that use typical framework-supported lifecycle APIs – such as
services, JobScheduler, and Jetpack WorkManager – shouldn't be
impacted by these changes.
חוויית משתמש
שינויים בחוויית המשתמש בהתראות שלא ניתן לסגור
אם האפליקציה מציגה למשתמשים התראות בחזית שלא ניתן לסגור, Android 14 שינה את ההתנהגות כדי לאפשר למשתמשים לסגור התראות כאלה.
השינוי הזה חל על אפליקציות שמונעות ממשתמשים לסגור את החזית
התראות על ידי הגדרה של Notification.FLAG_ONGOING_EVENT עד
Notification.Builder#setOngoing(true) או
NotificationCompat.Builder#setOngoing(true). ההתנהגות של FLAG_ONGOING_EVENT השתנתה כדי שהמשתמשים יוכלו לסגור את ההתראות האלה.
עדיין לא ניתן לסגור את סוגי ההתראות האלה: תנאים:
- כשהטלפון נעול
- אם המשתמש בוחר פעולת התראה מסוג ניקוי הכול (פעולה שעוזרת: פירוקים בטעות)
בנוסף, ההתנהגות החדשה הזו לא חלה על התראות בתרחישי השימוש הבאים:
CallStyleהתראות- בקר מדיניות מכשירים (DPC) וחבילות תמיכה לארגונים
- התראות במדיה
- חבילת ברירת המחדל של הבורר בחיפוש
מידע על אבטחת נתונים מוצג בצורה בולטת יותר
To enhance user privacy, Android 14 increases the number of places where the system shows the information you have declared in the Play Console form. Currently, users can view this information in the Data safety section on your app's listing in Google Play.
We encourage you to review your app's location data sharing policies and take a moment to make any applicable updates to your app's Google Play Data safety section.
Learn more in the guide about how data safety information is more visible on Android 14.
נגישות
הגדלה לא לינארית של הגופן עד 200%
החל מ-Android 14, המערכת תומכת בהגדלת הגופן עד 200%, וכך מספקת למשתמשים אפשרויות נגישות נוספות.
אם אתם כבר משתמשים ביחידות של פיקסלים שניתן לשנות (sp) כדי להגדיר את גודל הטקסט, השינוי הזה כנראה לא ישפיע על האפליקציה שלכם. עם זאת, מומלץ לבצע בדיקות של ממשק המשתמש עם גודל הגופן המקסימלי (200%) כדי לוודא שהאפליקציה יכולה להכיל גדלי גופן גדולים יותר בלי לפגוע בשימושיות.
אבטחה
רמת ה-API המינימלית לטירגוט שאפשר להתקין
החל מ-Android 14, אפליקציות עם
targetSdkVersion נמוך מ-23
לא ניתן להתקין את האפליקציה. דרישה שהאפליקציות צריכות לעמוד ברמת ה-API המינימלית לטירגוט
הדרישות משפרת את האבטחה והפרטיות של המשתמשים.
תוכנות זדוניות בדרך כלל מכוונות לרמות API ישנות יותר כדי לעקוף את האבטחה והפרטיות
באמצעי ההגנה שהושקו בגרסאות החדשות יותר של Android. לדוגמה,
אפליקציות זדוניות מסוימות משתמשות ב-targetSdkVersion מתוך 22 כדי להימנע מחשיפה
את מודל ההרשאות בזמן ריצה הושק בשנת 2015 על ידי Android 6.0 Marshmallow (API
רמה 23). השינוי הזה ב-Android 14 מקשה על תוכנות זדוניות להימנע מאבטחה
ושיפורים בפרטיות.
ניסיון להתקין אפליקציה שמטרגטת רמת API נמוכה יותר יגרום
נכשלה ההתקנה, ומופיעה ההודעה הבאה ב-Logcat:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7
במכשירים שמשדרגים ל-Android 14, כל אפליקציה עם ערך נמוך יותר ב-targetSdkVersion
יותר מ-23 מכשירים יישארו מותקנים.
אם אתם צריכים לבדוק אפליקציה שמטרגטת לרמת API ישנה יותר, צריך להשתמש בפקודה הבאה של ADB:
adb install --bypass-low-target-sdk-block FILENAME.apk
יכול להיות ששמות החבילות של בעלי המדיה יוסתרו
The media store supports queries for the OWNER_PACKAGE_NAME column, which
indicates the app that stored a particular media file. Starting in Android
14, this value is redacted unless at least one of the following conditions is
true:
- The app that stored the media file has a package name that is always visible to other apps.
The app that queries the media store requests the
QUERY_ALL_PACKAGESpermission.
Learn more about how Android filters package visibility for privacy purposes.