שינויים בהתנהגות: אפליקציות שמטרגטות לרמת 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 מוצפן לאותו שם מארח כמו או מושבתת לטובת מקודד המערכת.

שינויי אבטחה ב-framework

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

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 class כדי לשלוח שאילתה על התנועה הזו.

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

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).

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

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

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

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

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

לכידת סוג MIME של קובץ: URIs

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

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

אם לקובץ יש סיומת קובץ מזוהה כמו .html, סוג ה-MIME ייקבע על ידי התוסף .txt, .js או .css. אם לקובץ אין סיומת או שהסיומת שלו לא מזוהה, סוג ה-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, התראות מאפליקציות מושעות בוטלו. החל מ-Android 9, התראות מאפליקציות מושעות מוסתרות עד להפעיל מחדש את האפליקציה.