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 ומעלה.
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, הסרנו את התמיכה בלקוח Apache HTTP. החל מ-Android 9, הספרייה הזו מוסרת מ-bootclasspath ולא זמינה לאפליקציות כברירת מחדל.
כדי להמשיך להשתמש בלקוח Apache HTTP, אפליקציות שמטרגטות ל-Android 9 ומעלה יכולות להוסיף את הקוד הבא ל-AndroidManifest.xml:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
כחלופה לשימוש בספריית זמן הריצה של Apache, אפליקציות יכולות לארוז את הגרסה שלהן של ספריית org.apache.http ב-APK שלהן. אם עושים את זה, צריך לארוז מחדש את הספרייה (באמצעות כלי כמו Jar Jar) כדי למנוע בעיות תאימות של מחלקות עם המחלקות שמופיעות בסביבת זמן הריצה.
שינויים בממשק המשתמש
הצגת המיקוד
אי אפשר יותר להתמקד בתצוגות עם שטח של 0 (הרוחב או הגובה הם 0).
בנוסף, הפעילויות לא מקצות יותר באופן מרומז מיקוד ראשוני במצב מגע. במקום זאת, אם רוצים, צריך לבקש במפורש את המיקוד הראשוני.
טיפול בערך הקסדצימלי של RGBA ב-CSS
באפליקציות שמטרגטות ל-Android מגרסה 9 ואילך, צריך להפעיל את ההתנהגות של CSS Color Module Level 4 (טיוטה) כדי לטפל בצבעי CSS עם 4 ו-8 ספרות הקסדצימליות.
מודול הצבע CSS ברמה 4 נתמך על ידי Chrome מאז גרסה 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 יהיה plain
text.
לדוגמה, URI כמו file:///sdcard/test.html יעבור עיבוד כ-HTML, אבל URI כמו file:///sdcard/test יעבור עיבוד כטקסט פשוט, גם אם הקובץ מכיל נתוני HTML.
רכיב גלילה במסמך
ב-Android 9, המערכת מטפלת בצורה נכונה במקרים שבהם רכיב הבסיס של מסמך הוא רכיב הגלילה. בגרסאות קודמות, מיקום הגלילה הוגדר ברכיב body, ולרכיב הבסיס היו ערכי גלילה אפסיים. ב-Android 9, ההתנהגות תואמת לתקנים, כך שרכיב הגלילה הוא רכיב הבסיס.
בנוסף, הגישה הישירה אל document.body.scrollTop, document.body.scrollLeft,
document.documentElement.scrollTop או document.documentElement.scrollLeft
תתנהג באופן שונה בהתאם לגרסת היעד של ה-SDK. כדי לגשת לערכי הגלילה של אזור התצוגה, משתמשים ב-document.scrollingElement, אם האפשרות זמינה.
התראות מאפליקציות מושעות
לפני Android 9, התראות מאפליקציות מושהות בוטלו. החל מ-Android 9, ההתראות מאפליקציות מושהות מוסתרות עד שהאפליקציה מופעלת מחדש.