לצד תכונות ויכולות חדשות, מערכת Android 6.0 (רמת API 23) כוללת מגוון שינויים במערכת ושינויים בהתנהגות ה-API. במסמך הזה מודגש חלק מהשינויים העיקריים שאתם צריכים להבין ולהביא בחשבון בשימוש באפליקציות שלכם.
אם פרסמתם בעבר אפליקציה ל-Android, שימו לב שהשינויים האלה משפיעה על האפליקציה.
הרשאות בזמן ריצה
הגרסה הזו כוללת מודל הרשאות חדש, שמאפשר למשתמשים לנהל עכשיו באופן ישיר הרשאות הניתנות לאפליקציה בזמן הריצה. המודל הזה נותן למשתמשים יותר חשיפה ושליטה ובמקביל לייעל את תהליכי ההתקנה והעדכון האוטומטי של מפתחי אפליקציות. המשתמשים יכולים להעניק או לבטל הרשאות בנפרד לאפליקציות מותקנות.
באפליקציות שמטרגטות ל-Android 6.0 (רמת API 23) ואילך, צריך לבדוק ולבקש
בזמן הריצה. כדי לבדוק אם לאפליקציה שלך הוענקה הרשאה, אפשר לקרוא אל
checkSelfPermission()
חדש
. כדי לבקש הרשאה, צריך להפעיל את
requestPermissions()
. גם אם האפליקציה שלך לא מטרגטת ל-Android 6.0 (רמת API 23), כדאי לבדוק את האפליקציה לפי
מודל ההרשאות החדש.
לפרטים על התמיכה במודל ההרשאות החדש באפליקציה: עבודה עם הרשאות מערכת כדי לקבל טיפים להערכת ההשפעה על האפליקציה שלכם: אפשר לקרוא מידע נוסף בקטע הערות על שימוש בהרשאות.
מצב 'נמנום' ו'אפליקציה במצב המתנה'
הגרסה הזו כוללת אופטימיזציות חדשות לחיסכון בחשמל של אפליקציות ומכשירים במצב לא פעיל. האלה התכונות משפיעות על כל האפליקציות, לכן חשוב לבדוק את האפליקציות במצבים החדשים האלה.
- נמנום: אם משתמש מנתק את המכשיר ומשאירים אותו נייח, כשהמסך כבוי, למשך זמן מה, המכשיר עובר למצב נמנום, שם הוא מנסה לשמור את המערכת במצב שינה. במצב הזה, המכשירים ממשיכים לפעול כרגיל מדי פעם למשך פרקי זמן קצרים כדי שסנכרון האפליקציות יתבצע והמערכת תוכל לבצע פעולות בהמתנה.
- מצב המתנה של אפליקציה: מצב המתנה של אפליקציה מאפשר למערכת לקבוע שאפליקציה לא פעילה. כשהמשתמש לא משתמש בו באופן פעיל. המערכת קובעת כך כשהמשתמש לא נוגעים באפליקציה למשך פרק זמן מסוים. אם המכשיר מנותק, המערכת משביתה את הרשת גישה לסנכרונים ועבודות ולהשעיה של אפליקציות שנחשבות ללא פעילות.
למידע נוסף על השינויים חסכוניים באנרגיה, אפשר לבקר בכתובת אופטימיזציה ל'נמנום' ול'מצב המתנה'.
הסרת לקוח Apache HTTP
גרסת Android 6.0 מסירה את התמיכה בלקוח ה-HTTP Apache. אם האפליקציה משתמשת בלקוח הזה וגם
מטרגטת את Android 2.3 (רמת API 9) ומעלה, צריך להשתמש במחלקה HttpURLConnection
במקום זאת. ה-API הזה יעיל יותר כי הוא מצמצם את השימוש ברשת באמצעות דחיסה שקופה
ושמירת תגובות במטמון, ומפחיתה את צריכת החשמל. כדי להמשיך להשתמש בממשקי ה-API של Apache HTTP, עליך
קודם צריך להצהיר על התלות הבאה בזמן הידור בקובץ build.gradle
:
android { useLibrary 'org.apache.http.legacy' }
BoringSSL
Android עובר מ-OpenSSL אל
BoringSSL
לספרייה. אם באפליקציה שלך משתמשים ב-Android NDK, אסור לקשר לספריות קריפטוגרפיות
שהן לא חלק מ-NDK API, כמו libcrypto.so
ו-libssl.so
. האלה
ספריות הן לא ממשקי API ציבוריים, והן עשויות להשתנות או להפסיק לפעול ללא הודעה מוקדמת בגרסאות ובמכשירים השונים.
בנוסף, אתם עלולים לחשוף את עצמכם לפרצות אבטחה. במקום זאת, שנו את
כדי לקרוא לממשקי ה-API לקריפטוגרפיה של Java דרך JNI או ליצור קישור סטטי
ספריית קריפטוגרפיה לבחירתכם.
גישה למזהה החומרה
כדי לספק למשתמשים הגנה טובה יותר על הנתונים, החל מגרסה זו, Android
מסירה את הגישה הפרוגרמטית למזהה החומרה המקומי של המכשיר בשביל
אפליקציות שמשתמשות בממשקי ה-API של Wi-Fi ו-Bluetooth.
WifiInfo.getMacAddress()
וגם
BluetoothAdapter.getAddress()
אמצעי תשלום
מחזירה ערך קבוע של 02:00:00:00:00:00
.
כדי לגשת למזהי החומרה של מכשירים חיצוניים בקרבת מקום באמצעות Bluetooth וסריקות Wi-Fi:
האפליקציה צריכה עכשיו לכלול את ACCESS_FINE_LOCATION
או את
הרשאות של ACCESS_COARSE_LOCATION
:
הערה: כשמכשיר שמותקנת בו מערכת ההפעלה Android 6.0 (רמת API 23) מפעיל סריקת Wi-Fi או Bluetooth ברקע, הפעולה גלויה למכשירים חיצוניים כמו שמקורה בכתובת MAC אקראית.
התראות
הגרסה הזו מסירה את השיטה Notification.setLatestEventInfo()
. משתמשים ב
במקום זאת, יש Notification.Builder
כיתה כדי ליצור התראות. כדי לעדכן
שוב ושוב, שימוש חוזר במכונה Notification.Builder
. קוראים לפונקציה
שיטה אחת (build()
) כדי לקבל
עודכנו Notification
מופעים.
הפקודה adb shell dumpsys notification
לא מדפיסה יותר את טקסט ההתראה.
אפשר להשתמש בפקודה adb shell dumpsys notification --noredact
כדי להדפיס את הטקסט
באובייקט התראה.
שינויים במנהל האודיו
הגדרת עוצמת הקול באופן ישיר או השתקה של שידורים ספציפיים דרך AudioManager
class כבר לא נתמך. השיטה setStreamSolo()
הוצאה משימוש, ועליך לקרוא ל-
requestAudioFocus()
במקום זאת. באופן דומה,
השיטה setStreamMute()
היא
הוצא משימוש; במקום זאת, קוראים לשיטה adjustStreamVolume()
ומעבירים את ערך המסלול.
ADJUST_MUTE
או
ADJUST_UNMUTE
בחירת טקסט
![מסך שבו מוצגות תכונות חדשות לבחירת טקסט בתוך סרגל כלים צף](https://developer.android.com/static/images/android-6.0/text-selection.gif?authuser=0000&hl=he)
כשמשתמשים בוחרים טקסט באפליקציה, עכשיו אפשר להציג פעולות של בחירת טקסט כמו גזירה, העתקה והדבקה ב- סרגל הכלים הצף. תהליך ההטמעה של אינטראקציות של משתמשים דומה עבור סרגל הפעולות ההקשרי, כפי שמתואר הפעלת מצב פעולה לפי הקשר בתצוגות ספציפיות.
כדי להטמיע סרגל כלים צף לבחירת טקסט, צריך לבצע את השינויים הבאים בקובץ הקיים אפליקציות:
- באובייקט
View
אוActivity
, משנים אתActionMode
שיחות מאתstartActionMode(Callback)
אלstartActionMode(Callback, ActionMode.TYPE_FLOATING)
. - שימוש בהטמעה הקיימת של
ActionMode.Callback
והרחבתהActionMode.Callback2
במקום זאת. - לשנות את
onGetContentRect()
שיטה שמספקת את הקואורדינטות של אובייקט התוכןRect
(כמו מלבן לבחירת טקסט) בתצוגה. - אם המיקום של המלבן כבר לא תקף, וזהו הרכיב היחיד שצריך לבטל,
קוראים ל-method
invalidateContentRect()
.
אם משתמשים ב-
ספריית התמיכה של Android בגרסה 22.2. חשוב לשים לב שסרגלי כלים צפים אינם
תואם לאחור ותאימות ל-Appcom שולטת על ActionMode
אובייקטים באמצעות
כברירת מחדל. ההגדרה הזו מונעת את ההצגה של סרגלי כלים צפים. כדי להפעיל
תמיכה של ActionMode
במסגרת
AppCompatActivity
, שיחה
getDelegate()
, ואז התקשרות
setHandleNativeActionModesEnabled()
על ההחזרה
AppCompatDelegate
האובייקט והגדרת הקלט
ל-false
. הקריאה מחזירה את הבקרה על ActionMode
אובייקטים אל
את המסגרת. במכשירים עם Android 6.0 (רמת API 23), שמאפשרת ל-framework לתמוך
ActionBar
או מצבים צפים של סרגל הכלים, בזמן שהמכשירים פועלים
Android 5.1 (רמת API 22) ומטה, רק המצבים ActionBar
הם
נתמך.
שינויים בסימנייה בדפדפן
הגרסה הזו מסירה את התמיכה בסימניות גלובליות.
android.provider.Browser.getAllBookmarks()
ו-android.provider.Browser.saveBookmark()
השיטות הוסרו עכשיו. באופן דומה, READ_HISTORY_BOOKMARKS
, WRITE_HISTORY_BOOKMARKS
ההרשאות יוסרו. אם האפליקציה מטרגטת את Android 6.0 (רמת API 23) ואילך, אין גישה
או להשתמש בהרשאות של הספק הגלובלי. במקום זאת, האפליקציה צריכה לאחסן
של הסימניות באופן פנימי.
שינויים במאגר המפתחות של Android
במהדורה הזו, ספק Android Keystore כבר לא תומך חוק ה-DSA. עדיין יש תמיכה ב-ECDSA.
מפתחות שלא צריך הצפנה במנוחה לא יימחקו יותר במסך נעילה מאובטח מושבת או מאופס (לדוגמה, על ידי המשתמש או על ידי מנהל המכשיר). מפתחות שנדרשים ההצפנה במנוחה תימחק במהלך האירועים האלה.
שינויים ב-Wi-Fi וברשת
הגרסה הזו כוללת את שינויי ההתנהגות הבאים בממשקי ה-API של רשתות Wi-Fi ורשתות.
- עכשיו האפליקציות שלך יכולות לשנות את המצב של
WifiConfiguration
אובייקטים בלבד אם יצרתם את האובייקטים האלה. אין לך הרשאה לשנות או למחוקWifiConfiguration
אובייקטים שנוצרו על ידי המשתמש או אפליקציות אחרות. -
בעבר, אם אפליקציה אילצה את המכשיר להתחבר לרשת Wi-Fi ספציפית באמצעות
enableNetwork()
עםdisableAllOthers=true
, המכשיר התנתק מרשתות אחרות כמו חבילת גלישה. בגרסה הזו, המכשיר כבר לא מתנתק מרשתות אחרות כאלה. אם המיקום הערך שלtargetSdkVersion
של האפליקציה הוא“20”
ומטה. הוא מוצמד רשת Wi-Fi. אם הערך שלtargetSdkVersion
באפליקציה הוא“21”
ומעלה, צריך להשתמש ממשקי API מרובי רשתות (כמוopenConnection()
,bindSocket()
, והקבוצה החדשהbindProcessToNetwork()
) כדי לוודא שהתנועה ברשת שלו נשלחת ברשת שנבחרה.
שינויים בשירות המצלמה
בגרסה הזו, מודל הגישה למשאבים משותפים בשירות המצלמה השתנה ממודל הגישה הקודם 'כל הקודם זוכה' למודל גישה שבו העדיפות היא גבוהה היא עדיפה. שינויים בהתנהגות השירות כוללים:
- הגישה למשאבים של המערכת המשנית של המצלמה, כולל פתיחה והגדרה של מכשיר המצלמה, בהתבסס על "העדיפות" של תהליך הגשת הבקשה של הלקוח. תהליכי אפליקציות עם בדרך כלל, פעילויות הגלויות למשתמשים או פעילויות בחזית מקבלות עדיפות גבוהה יותר, ולכן הן הופכות למשאבי המצלמה ואת האופן שבו הם משתמשים באופן מהימן יותר.
- לקוחות מצלמות פעילות עבור אפליקציות בעדיפות נמוכה יותר עשויים להיות 'מורשים' כאשר עדיפות גבוהה יותר.
מנסה להשתמש במצלמה. ב-API
Camera
שהוצא משימוש, התוצאה של הפעולה הזוonError()
שווה ל- שנקראה הלקוח שסולק. ב-API שלCamera2
, התוצאהonDisconnected()
קוראים ללקוח שסולק. - במכשירים עם חומרת מצלמה מתאימה, תהליכי אפליקציה נפרדים יכולים: לפתוח אותם בנפרד ולהשתמש בהתקני מצלמה נפרדים בו-זמנית. לעומת זאת, כשמשתמשים בתהליכים מרובים, במקרים שבהם גישה סימולטנית גורמת לירידה משמעותית בביצועים או ביכולות של כל אחד ממכשירי המצלמה הפתוחים מזוהים ואסורים על ידי שירות המצלמה. השינוי הזה התוצאה עלולה להיות "פינוי" של לקוחות בעדיפות נמוכה יותר, גם אם אין אף אפליקציה אחרת באופן ישיר מנסה לגשת לאותו מכשיר מצלמה.
- שינוי המשתמש הנוכחי גורם ללקוחות פעילים למצלמה באפליקציות שבבעלות חשבון המשתמש הקודם. להיות מסוכנת. הגישה למצלמה מוגבלת לפרופילים של משתמשים שבבעלות המשתמש הנוכחי. בפועל, המשמעות היא שחשבון 'אורח', למשל, לא יוכל לצאת ממצב פעיל תהליכי עבודה שמשתמשים במערכת המשנה של המצלמה כשמשתמשים עוברים לחשבון אחר.
זמן ריצה
זמן הריצה של ART מיישם כעת כללי גישה עבור
אמצעי תשלום אחד (newInstance()
). הזה
שינוי פותר בעיה שבה Dalvik בדק בצורה שגויה כללי גישה בגרסאות קודמות.
אם האפליקציה משתמשת
אמצעי תשלום אחד (newInstance()
) ואת/ה
שרוצים לבטל את בדיקות הגישה, מפעילים את הפונקציה
השיטה setAccessible()
עם הקלט
שהוגדר ל-true
. אם האפליקציה משתמשת
v7 appcompat Library או
ספריית recyclerview v7,
עליכם לעדכן את האפליקציה כך שתשתמש בגרסאות האחרונות של הספריות האלה. אחרת, עליך לוודא
כל המחלקות המותאמות אישית שאליהן מתבצעת הפניה מ-XML מתעדכנות כדי שניתן יהיה לגשת לבניית המחלקות שלהן.
בגרסה הזו מתעדכנים ההתנהגות של הקישור הדינמי. המקשר הדינמי מבין עכשיו
את ההבדל בין soname
של ספרייה לנתיב שלה
(
באג ציבורי 6670), והחיפוש של soname
. אפליקציות שפעלו בעבר ויש בהן רשומות DT_NEEDED
שגויות
(בדרך כלל נתיבים מוחלטים במערכת הקבצים של מחשב ה-build) עלולים להיכשל בזמן הטעינה.
הדגל dlopen(3) RTLD_LOCAL
הוטמע כראוי. שימו לב
ברירת המחדל היא RTLD_LOCAL
, לכן קריאות אל dlopen(3)
שלא נעשה בהן שימוש מפורש
RTLD_LOCAL
יושפעו (אלא אם האפליקציה שלך השתמשה באופן מפורש ב-RTLD_GLOBAL
). ב-
RTLD_LOCAL
, הסמלים לא יהיו זמינים לספריות שנטענות על ידי קריאות מאוחרות יותר אל
dlopen(3)
(בניגוד להפניות של DT_NEEDED
).
בגרסאות קודמות של Android, אם האפליקציה ביקשה מהמערכת לטעון ספרייה משותפת עם
של העברת טקסט, המערכת הציגה אזהרה אבל עדיין אפשרה לטעון את הספרייה.
החל מהגרסה הזו, המערכת תדחה את הספרייה הזו אם גרסת היעד של ה-SDK של האפליקציה היא 23
ומעלה. כדי לעזור לך לזהות אם טעינת הספרייה נכשלה, האפליקציה צריכה לתעד את
כשל dlopen(3)
, וכוללים את טקסט תיאור הבעיה שdlerror(3)
להתקשרות חזרה. למידע נוסף על טיפול בהעברת טקסט, אפשר לעיין במאמר הבא
.
אימות APK
הפלטפורמה מבצעת עכשיו אימות מחמיר יותר של חבילות APK. APK נחשב פגום אם קובץ הוצהרה במניפסט אבל היא לא קיימת ב-APK עצמו. חובה לחתום מחדש על APK אם אחד או יותר תכנים מוסרים.
חיבור USB
חיבורי המכשיר דרך יציאת ה-USB מוגדרים עכשיו למצב טעינה בלבד כברירת מחדל. כדי לגשת אל של המכשיר והתוכן שלו באמצעות חיבור USB, המשתמשים חייבים להעניק הרשאה מפורשת האינטראקציות. אם האפליקציה תומכת באינטראקציות של משתמש עם המכשיר באמצעות יציאת USB, צריך לבדוק את הפרטים שימו לב לכך שהאינטראקציה צריכה להיות מופעלת באופן מפורש.
שינויים ב-Android for Work
הגרסה הזו כוללת את השינויים הבאים בהתנהגות של Android for Work:
- אנשי קשר בעבודה בהקשרים אישיים. החייגן של Google
מעכשיו, ביומן השיחות מוצגים אנשי קשר מהעבודה כשהמשתמש צופה בשיחות קודמות.
ההגדרה
setCrossProfileCallerIdDisabled()
השירותtrue
מסתיר את אנשי הקשר מפרופיל העבודה ביומן השיחות של החייגן של Google. אנשי הקשר של העבודה יכולים להיות תוצג יחד עם אנשי קשר אישיים במכשירים באמצעות Bluetooth רק אם הגדרת אתsetBluetoothContactSharingDisabled()
ל-false
. כברירת מחדל, היא מוגדרת ל-true
. - הסרה של הגדרת Wi-Fi: הגדרות Wi-Fi שנוספו על ידי בעלי הפרופיל
(לדוגמה, באמצעות קריאות למספר
שיטה
addNetwork()
) יוסרו עכשיו אם פרופיל העבודה הזה יימחק. - נעילה של הגדרות Wi-Fi: כל הגדרת Wi-Fi שנוצרה על ידי
בעלי מכשיר פעיל לא יכולים יותר לשנות או למחוק אותם, אם
הערך של
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
הוא לא אפס. המשתמש עדיין יוכל ליצור ולשנות הגדרות Wi-Fi משלו. מכשיר פעיל לבעלים יש הרשאה לערוך או להסיר הגדרות Wi-Fi, כולל כאלה שלא הם יצרו. - הורדת נאמן המידע של מדיניות המכשיר דרך נוסף בחשבון Google: כאשר Google חשבון שנדרש בו ניהול באמצעות אפליקציה של בקר מדיניות מכשירים (DPC) נוסף למכשיר מחוץ להקשר מנוהל, תהליך הוספת החשבון ינחה את המשתמש להתקין WPC המתאים. ההתנהגות הזו חלה גם על חשבונות שנוספו דרך הגדרות > חשבונות ובאשף ההגדרה הראשונית של המכשיר.
- שינויים בהתנהגויות ספציפיות של API של
DevicePolicyManager
:- קריאה ל
setCameraDisabled()
משפיעה על המצלמה של המשתמש המתקשר בלבד. התקשרות אליו מהפרופיל המנוהל לא ישפיעו על אפליקציות המצלמה שפועלות אצל המשתמש הראשי. - בנוסף,
setKeyguardDisabledFeatures()
השיטה זמינה עכשיו לבעלי פרופיל וגם לבעלי מכשירים. - בעלי הפרופיל יכולים להגדיר את ההגבלות הבאות של מגן המקשים:
KEYGUARD_DISABLE_TRUST_AGENTS
והקבוצהKEYGUARD_DISABLE_FINGERPRINT
, שמשפיעים על הגדרות נעילת מקשים למשתמש ההורה של הפרופיל.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
, משפיעה רק על התראות שנוצרות על ידי אפליקציות בפרופיל המנוהל.
- השיטות
DevicePolicyManager.createAndInitializeUser()
ו-DevicePolicyManager.createUser()
הוצאו משימוש. setScreenCaptureDisabled()
ה-method חוסמת עכשיו גם את מבנה הסיוע, כשאפליקציה של המשתמש הנתון נמצאת בחזית.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
ברירת המחדל היא SHA-256. האלגוריתם SHA-1 עדיין נתמך לצורך תאימות לאחור, אבל הוא יוסר בעתיד.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
מקבל רק SHA-256.- ממשקי ה-API של מאתחל המכשירים שהיו קיימים ב-Android 6.0 (רמת API 23) הוסרו עכשיו.
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
הוסר כך שאין הצמדה של NFC הקצאת הרשאות ידנית לא יכולה לבטל באופן פרוגרמטי ביטול נעילה של מכשיר מוגן שאופס להגדרות המקוריות.- עכשיו אפשר להשתמש ב-
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
תוספת תשלום לצורך העברת נתונים לאפליקציה של בעלי המכשיר במהלך הקצאת NFC של המכשיר המנוהל. - ממשקי ה-API של Android for Work מותאמים ל-M הרשאות בזמן ריצה, כולל פרופילים של עבודה,
לשכבת תשומת הלב ועוד. אין ממשקי API חדשים להרשאות
DevicePolicyManager
להשפיע על אפליקציות לפני מיליון. - כשהמשתמשים יוצאים מהחלק הסינכרוני בתהליך ההגדרה, שמתחיל באמצעות
ACTION_PROVISION_MANAGED_PROFILE
או IntentACTION_PROVISION_MANAGED_DEVICE
, המערכת מחזירה קוד תוצאהRESULT_CANCELED
.
- קריאה ל
- שינויים בממשקי API אחרים:
- שימוש בנתונים: השם של המחלקה
android.app.usage.NetworkUsageStats
השתנהNetworkStats
.
- שימוש בנתונים: השם של המחלקה
- שינויים בהגדרות הגלובליות:
- כבר אי אפשר לקבוע את ההגדרות האלה דרך
setGlobalSettings()
:BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- עכשיו אפשר לקבוע את ההגדרות הגלובליות האלה דרך
setGlobalSettings()
:
- כבר אי אפשר לקבוע את ההגדרות האלה דרך