שינויים בהתנהגות: אפליקציות שמטרגטות לרמת API 28 ומעלה

מערכת Android 9 (רמת API 28) כוללת כמה שינויים במערכת Android. השינויים הבאים בהתנהגות חלים רק על אפליקציות שמטרגטות רמת API 28 ומעלה. באפליקציות שהגדירו את targetSdkVersion לרמת API 28 ואילך, צריך לשנות את האפליקציות כך שישתמשו בהתנהגויות האלה בצורה תקינה, אם הדבר רלוונטי לאפליקציה.

לשינויים שמשפיעים על כל האפליקציות שפועלות ב-Android 9, בלי קשר ל-API ברמה שאליה הם מטרגטים, לראות שינויים בהתנהגות: כל האפליקציות.

שירותים שפועלים בחזית

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

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

שינויים בנושא פרטיות

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

הוצאה משימוש של מספרי סידורי ב-Build

ב-Android 9, הערך של Build.SERIAL מוגדר תמיד ל-"UNKNOWN" כדי להגן על פרטיות המשתמשים.

אם האפליקציה שלך צריכה גישה למספר הסידורי של החומרה של המכשיר, עליך לבקש במקום זאת READ_PHONE_STATE ואז לבצע קריאה getSerial()

פרטיות ב-DNS

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

שינויים באבטחת המסגרת

גרסת Android 9 כוללת כמה שינויים בהתנהגות שמשפרים את האבטחה של האפליקציה, אבל השינויים האלה נכנסים לתוקף רק אם האפליקציה מטרגטת לרמת API 28 ואילך.

Network TLS מופעל כברירת מחדל

אם האפליקציה שלכם מטרגטת ל-Android מגרסה 9 ואילך, השיטה isCleartextTrafficPermitted() מחזירה את הערך false כברירת מחדל. אם האפליקציה צריכה להפעיל טקסט ללא הצפנה דומיינים ספציפיים, צריך להגדיר במפורש את cleartextTrafficPermitted ל-true עבור הדומיינים האלה באבטחת הרשת של האפליקציה שלך הגדרה.

ספריות נתונים מבוססות-אינטרנט שמחולקות לפי תהליך

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

ברוב המקרים, צריך להשתמש באפליקציה בכיתות מחבילת android.webkit, כמו WebView ו-CookieManager, בתהליך אחד בלבד. לדוגמה, צריך להעביר את כל Activity אובייקטים שנעשה בהם שימוש ב-WebView לאותו תהליך. כדי לאכוף בצורה מחמירה יותר את הכלל 'תהליך אחד בלבד', אפשר לבצע קריאה ל-disableWebView() בתהליכים האחרים של האפליקציה. הקריאה הזו מונעת את האיפוס של WebView בטעות בתהליכים האחרים, גם אם היא נקראת מספרייה תלויה.

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

דומיינים של SELinux לכל אפליקציה

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

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

שינויים בקישוריות

ספירת נתוני קישוריות ומסלולים מרובים

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

באופן ספציפי, הערך שמוחזר עכשיו על ידי getMultipathPreference() מבוסס על תעבורת הנתונים ברשת שצוינה למעלה. מתחיל ב- Android 9, השיטה מחזירה את הערך true עבור נתוני התא, אבל כשכמות מסוימת של התנועה שנצברת ביום, מתחילה לחזור false. אפליקציות שפועלות ב-Android 9 חייבות לבצע קריאה ל-method ולפעול בהתאם להנחיה הזו.

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

הוצאה משימוש של לקוח HTTP ב-Apache

עם Android 6.0, הסרנו את התמיכה בלקוח ה-HTTP Apache. החל מ-Android 9, הספרייה הזו מוסרת כברירת מחדל, מזהה האתחול לא זמין לאפליקציות.

כדי להמשיך להשתמש בלקוח ה-HTTP של Apache, אפליקציות שמטרגטות את Android מגרסה 9 ואילך יכולות להוסיף את הפרטים הבאים ל-AndroidManifest.xml:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

כחלופה לשימוש בספריית Apache של סביבת זמן הריצה, אפליקציות יכולות לאגד את גרסה משלו של הספרייה org.apache.http ב-APK שלהם. אם תעשו זאת, צריך לארוז מחדש את הספרייה (עם כלי שירות כמו Jar Jar) כדי למנוע בעיות בתאימות לכיתות. במסגרת המחלקות המסופקות בסביבת זמן הריצה.

שינויים בממשק המשתמש

הצגת המיקוד

כבר אי אפשר להתמקד בתצוגות עם אזור של 0 (רוחב או גובה של 0).

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

טיפול בערכי CSS RGBA בפורמט הקסדצימלי

באפליקציות שמטרגטות את Android מגרסה 9 ואילך צריך להפעיל את התנהגות טיוטת CSS Color Module Level 4 לטיפול בצבעים של CSS ב-4 וב-8 ספרות הקסדצימליות.

Chrome תומך ב-CSS Color Module ברמה 4 מאז הגרסה 52, אבל WebView משבית את התכונה כרגע כי נמצאו אפליקציות קיימות ל-Android שמכילות צבעים הקסדצימליים של 32 ביט בסדר של Android (ARGB), שעלול לגרום לשגיאות עיבוד.

לדוגמה, הצבע #80ff8080 מעובד כרגע WebView אטום אדום בהיר (#ff8080) לאפליקציות שמטרגטות לרמות API 27 ומטה. בשלב זה, המערכת מתעלמת מהרכיב המוביל (שמערכת Android תפרוס כרכיב האלפא). אם האפליקציה מטרגטת רמת API 28 ואילך, הערך #80ff8080 מפורש כירוק בהיר שקוף ב-50% (#80ff80).

זיהוי סוג MIME של קובץ: מזהי URI

בגרסאות Android שקודמות ל-Android 9 יכול להיות שהמערכת תסיק סוגי MIME מהקובץ תוכן. החל מ-Android 9 (רמת API 28), אפליקציות חייבות להשתמש ב סיומת הקובץ הנכונה כשטוענים מזהי URI של file: WebView.

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

אם לקובץ יש סיומת קובץ מוכרת כמו .html,‏.txt,‏ .js או .css, סוג ה-MIME יקבע לפי הסיומת. אם לקובץ אין סיומת או שיש לו סיומת לא מזוהה, סוג ה-MIME יהיה טקסט פשוט.

לדוגמה, URI כמו file:///sdcard/test.html יעובד אבל URI כמו file:///sdcard/test יוצג כטקסט פשוט. גם אם הקובץ מכיל נתוני HTML.

רכיב גלילה במסמך

Android 9 מטפל כראוי בבקשות לרמה הבסיסית (root) של מסמך הוא רכיב הגלילה. בגרסאות קודמות, מיקום הגלילה הוגדר ברכיב הגוף לרכיב השורש היו אפס ערכי גלילה. ב-Android 9 אפשר להשתמש התנהגות שתואמת לתקנים, כשרכיב הגלילה הוא הרמה הבסיסית (root) לרכיב מסוים.

בנוסף, באמצעות גישה ישירה אל document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop או document.documentElement.scrollLeft יפעלו באופן שונה בהתאם ל-SDK המטורגט. כדי לגשת לערכים של גלילה בחלון התצוגה, משתמשים ב-document.scrollingElement, אם הוא זמין.

התראות מאפליקציות מושעות

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