שינויים ב-Android 6.0

לצד תכונות ויכולות חדשות, מערכת 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

בחירת טקסט

מסך שבו מוצגות תכונות חדשות לבחירת טקסט בתוך סרגל כלים צף

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

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

  1. באובייקט View או Activity, משנים את ActionMode שיחות מאת startActionMode(Callback) אל startActionMode(Callback, ActionMode.TYPE_FLOATING).
  2. שימוש בהטמעה הקיימת של ActionMode.Callback והרחבתה ActionMode.Callback2 במקום זאת.
  3. לשנות את onGetContentRect() שיטה שמספקת את הקואורדינטות של אובייקט התוכן Rect (כמו מלבן לבחירת טקסט) בתצוגה.
  4. אם המיקום של המלבן כבר לא תקף, וזהו הרכיב היחיד שצריך לבטל, קוראים ל-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() השיטה זמינה עכשיו לבעלי פרופיל וגם לבעלי מכשירים.
    • בעלי הפרופיל יכולים להגדיר את ההגבלות הבאות של מגן המקשים:
    • השיטות 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 או Intent ACTION_PROVISION_MANAGED_DEVICE, המערכת מחזירה קוד תוצאה RESULT_CANCELED.
  • שינויים בממשקי API אחרים:
    • שימוש בנתונים: השם של המחלקה android.app.usage.NetworkUsageStats השתנה NetworkStats.
  • שינויים בהגדרות הגלובליות: