ב-Android 10 (רמת API 29) יש כמה תכונות ושינויים באופן הפעולה שנועדו להגן טוב יותר על פרטיות המשתמשים. השינויים האלה מרחיבים את השקיפות והשליטה שיש למשתמשים על הנתונים שלהם ועל היכולות שהם נותנים לאפליקציות. התכונות האלה עשויות לגרום לכך שהתנהגויות או נתונים ספציפיים שהאפליקציה שלכם מסתמכת עליהם יפעלו בצורה שונה בהשוואה לגרסאות ישנות יותר של הפלטפורמה. אם אתם פועלים לפי השיטות המומלצות הנוכחיות לטיפול בנתוני משתמשים, ההשפעה על האפליקציה שלכם אמורה להיות מינימלית.
בדף הזה מופיע סיכום של כל שינוי.
השינויים העיקריים
בקטע הזה מפורטים השינויים העיקריים ב-Android 10 שקשורים לפרטיות.
גישה לאחסון חיצוני שמוגבלת לקבצים ולמדיה של האפליקציה
כברירת מחדל, אפליקציות שמטרגטות ל-Android 10 ומעלה מקבלות גישה מוגבלת לאחסון חיצוני, או נפח אחסון ייעודי לאפליקציות. אפליקציות כאלה יכולות לראות את סוגי הקבצים הבאים בהתקן אחסון חיצוני בלי לבקש הרשאות משתמש שקשורות לאחסון:
- קבצים בספרייה הספציפית לאפליקציה, שאפשר לגשת אליהם באמצעות
getExternalFilesDir(). - תמונות, סרטונים וקטעי אודיו שהאפליקציה יצרה ממאגר המדיה.
כדי לקבל מידע נוסף על נפח אחסון ייעודי לאפליקציות, וגם על שיתוף, גישה ושינוי של קבצים שנשמרו בהתקני אחסון חיצוניים, כדאי לעיין במדריכים בנושא ניהול קבצים באחסון חיצוני וגישה לקובצי מדיה ושינוי שלהם.
כדי לגשת למיקום המכשיר ברקע, נדרשת הרשאה
כדי לתמוך בשליטה הנוספת שיש למשתמשים על הגישה של אפליקציה לנתוני מיקום, ב-Android 10 נוספה ההרשאה ACCESS_BACKGROUND_LOCATION.
בניגוד להרשאות ACCESS_FINE_LOCATION ו-ACCESS_COARSE_LOCATION, ההרשאה ACCESS_BACKGROUND_LOCATION משפיעה רק על הגישה של האפליקציה למיקום כשהיא פועלת ברקע. אפליקציה נחשבת ככזו שניגשת למיקום ברקע, אלא אם מתקיים אחד מהתנאים הבאים:
- פעילות ששייכת לאפליקציה גלויה.
האפליקציה מפעילה שירות שפועל בחזית שהוצהר עליו סוג שירות בחזית של
location.כדי להצהיר על סוג השירות שפועל בחזית באפליקציה, צריך להגדיר את
targetSdkVersionאו אתcompileSdkVersionשל האפליקציה ל-29ואילך. מידע נוסף על האופן שבו שירותים שפועלים בחזית יכולים להמשיך פעולות שהמשתמשים התחילו, שדורשות גישה למיקום
אם האפליקציה שלכם יוצרת גבולות וירטואליים ומנטרת אותם ומטרגטת את Android מגרסה 10 (רמת API 29) ומעלה, אתם צריכים להצהיר על ההרשאה ACCESS_BACKGROUND_LOCATION.
הגישה ניתנת באופן אוטומטי כשמטרגטים ל-Android 9 או לגרסאות קודמות
אם האפליקציה פועלת ב-Android 10 ואילך אבל מטרגטת ל-Android 9 (רמת API 28) ומטה, הפלטפורמה פועלת באופן הבא:
- אם במניפסט של האפליקציה מוצהר על רכיב
<uses-permission>עבורACCESS_FINE_LOCATIONאוACCESS_COARSE_LOCATION, המערכת מוסיפה באופן אוטומטי רכיב<uses-permission>עבורACCESS_BACKGROUND_LOCATIONבמהלך ההתקנה. - אם האפליקציה מבקשת את ההרשאה
ACCESS_FINE_LOCATIONאוACCESS_COARSE_LOCATION, המערכת מוסיפה באופן אוטומטי את ההרשאהACCESS_BACKGROUND_LOCATIONלבקשה.
גישה כשמשדרגים את המכשיר ל-Android 10
אם משתמש מעניק לאפליקציה גישה למיקום המכשיר –
ACCESS_COARSE_LOCATION
או
ACCESS_FINE_LOCATION
– ואז משדרג את המכשיר מ-Android 9 ל-Android 10,
המערכת מעדכנת באופן אוטומטי את קבוצת ההרשאות מבוססות-המיקום שניתנו
לאפליקציה. קבוצת ההרשאות שהאפליקציה מקבלת אחרי השדרוג
תלויה בגרסת ה-SDK לטירגוט ובהרשאות שהוגדרו לה, כפי שמוצג
בטבלה הבאה:
טבלה 1. שינויים במצב של הרשאת המיקום אחרי שדרוג המכשיר ל-Android 10
| גרסת פלטפורמת היעד | האם ניתנה הרשאה למיקום משוער או מדויק? |
האם הרשאת הרקע מוגדרת במניפסט? |
מצב ההרשאה שמוגדר כברירת מחדל עודכן |
|---|---|---|---|
| Android 10 | כן | כן | גישה בחזית וברקע |
| Android 10 | כן | לא | גישה במצב פעיל בלבד |
| Android 10 | לא | (המערכת מתעלמת מהמדיניות) | אין גישה |
| Android מגרסה 9 ומטה | כן | נוסף באופן אוטומטי על ידי המערכת בזמן שדרוג המכשיר | גישה בחזית וברקע |
| Android מגרסה 9 ומטה | לא | (המערכת מתעלמת מהמדיניות) | אין גישה |
חשוב לזכור שהמשתמש יכול לשנות את רמת הגישה הזו גם אחרי שהמערכת מעדכנת באופן אוטומטי את הגישה של האפליקציה למיקום המכשיר. לדוגמה, המשתמש יכול להגביל את הגישה של האפליקציה לחזית בלבד או לבטל את הגישה לגמרי. לפני שהאפליקציה מנסה לגשת למיקום של המכשיר, במיוחד בתוך שירות שפועל בחזית, היא צריכה לבדוק אם המשתמש עדיין מאפשר לה לקבל את נתוני המיקום האלה.
הגישה בוטלה כשמעדכנים את רמת ה-API המיועדת במכשירי Android 10
נניח שהאפליקציה שלכם כבר מותקנת במכשיר עם Android 10. אם תעדכנו את האפליקציה כך שתטרגט את Android 10 במצב הזה, המכשיר יבטל את ההרשאה ACCESS_BACKGROUND_LOCATION.
כדי לקבל מידע נוסף על אחזור מיקום המכשיר כשהאפליקציה פועלת ברקע, עיינו במדריך בנושא קבלת עדכוני מיקום תקופתיים.
הגבלות על התחלת פעילויות מהרקע
החל מ-Android 10, המערכת מציבה הגבלות על התחלת פעילויות מהרקע. השינוי הזה עוזר לצמצם את ההפרעות למשתמשים ולתת להם שליטה טובה יותר על מה שמוצג במסך. כל עוד האפליקציה מתחילה פעילויות כתוצאה ישירה מאינטראקציה של המשתמש, סביר להניח שהיא לא תושפע מההגבלות האלה.
כדי לקבל מידע נוסף על החלופה המומלצת להפעלת פעילויות ברקע, עיינו במדריך בנושא התראות למשתמשים על אירועים תלויי זמן באפליקציה.
מזהים ונתונים
בקטע הזה מפורטים שינויים שקשורים ספציפית לעבודה עם מזהי מכשירים ונתונים.
הסרת הזיקה לאנשי הקשר
החל מ-Android 10, הפלטפורמה לא עוקבת אחרי מידע על מידת הקרבה לאנשי הקשר. כתוצאה מכך, אם האפליקציה מבצעת חיפוש באנשי הקשר של המשתמש, התוצאות לא מסודרות לפי תדירות האינטראקציה.
המדריך בנושא ContactsProvider מכיל הודעה שמתארת את השדות והשיטות הספציפיים שהתיישנו בכל המכשירים החל מ-Android 10.
רנדומיזציה של כתובות MAC
במכשירים עם Android מגרסה 10 ומעלה, המערכת משדרת כתובות MAC אקראיות כברירת מחדל.
אם האפליקציה שלכם מטפלת בתרחיש לדוגמה של ארגון, הפלטפורמה מספקת ממשקי API לכמה פעולות שקשורות לכתובות MAC:
- קבלת כתובת MAC אקראית: אפליקציות של בעלי מכשירים ואפליקציות של בעלי פרופילים יכולות לאחזר את כתובת ה-MAC האקראית שהוקצתה לרשת ספציפית על ידי קריאה ל-
getRandomizedMacAddress(). - קבלת כתובת MAC בפועל של היצרן: אפליקציות של בעלי מכשירים יכולות לאחזר את כתובת ה-MAC של החומרה בפועל של המכשיר על ידי קריאה ל-
getWifiMacAddress(). השיטה הזו שימושית למעקב אחרי קבוצות של מכשירים.
הגבלת הגישה למערכת הקבצים /proc/net
במכשירים עם Android מגרסה 10 ואילך, אפליקציות לא יכולות לגשת אל /proc/net, שכולל מידע על מצב הרשת של המכשיר. אפליקציות שצריכות גישה למידע הזה, כמו רשתות VPN, צריכות להשתמש במחלקה NetworkStatsManager או ConnectivityManager.
הגבלה על מזהי מכשירים שלא ניתנים לאיפוס
החל מגרסת Android 10, לאפליקציות צריכה להיות ההרשאה המיוחדת READ_PRIVILEGED_PHONE_STATE כדי לגשת למזהים של המכשיר שלא ניתנים לאיפוס, כולל מספר ה-IMEI והמספר הסידורי.
השיטות המושפעות כוללות:
BuildTelephonyManager
אם האפליקציה לא קיבלה את ההרשאה, ועדיין מנסה לבקש מידע על מזהים שלא ניתנים לאיפוס, התגובה של הפלטפורמה משתנה בהתאם לגרסת ה-SDK המטורגטת:
- אם האפליקציה מטרגטת את Android מגרסה 10 ואילך, מתרחשת שגיאה מסוג
SecurityException. - אם האפליקציה מטרגטת את Android 9 (רמת API 28) או גרסה ישנה יותר, השיטה מחזירה את הערך
nullאו נתוני placeholder אם לאפליקציה יש את ההרשאהREAD_PHONE_STATE. אחרת, תתרחשSecurityException.
במקרים רבים אין צורך במזהי מכשירים שלא ניתנים לאיפוס. לדוגמה, אם האפליקציה משתמשת במזהי מכשירים שלא ניתנים לאיפוס למטרות מעקב אחרי מודעות או ניתוח נתוני משתמשים, השתמשו במזהה פרסום ב-Android במקרים הספציפיים האלה. מידע נוסף זמין במאמר שיטות מומלצות למזהים ייחודיים.
גישה מוגבלת לנתונים בלוח
אם האפליקציה שלכם היא לא עורך שיטת הקלט (IME) שמוגדר כברירת מחדל, או אם היא לא האפליקציה שכרגע נמצאת במוקד, היא לא יכולה לגשת לנתונים בלוח ב-Android מגרסה 10 ואילך.
הגנה על המספר הסידורי של התקן ה-USB
אם האפליקציה מטרגטת את Android 10 ואילך, היא לא יכולה לקרוא את המספר הסידורי עד שהמשתמש נותן לה הרשאה לגשת למכשיר או לאביזר ה-USB.
במדריך הגדרת מארחי USB מוסבר איך עובדים עם התקני USB.
מצלמה וקישוריות
בקטע הזה מפורטים שינויים ספציפיים למטא-נתונים של המצלמה ולממשקי API של קישוריות.
הגבלת הגישה לפרטים ולמטא-נתונים של המצלמה
ב-Android 10, היקף המידע שמוחזר כברירת מחדל על ידי השיטה getCameraCharacteristics() השתנה. באופן ספציפי, לאפליקציה צריכה להיות ההרשאה CAMERA כדי לגשת למטא-נתונים שעשויים להיות ספציפיים למכשיר, שנכללים בערך המוחזר של השיטה הזו.
מידע נוסף על השינויים האלה זמין בקטע שעוסק בשדות של מצלמה שדורשים הרשאה.
הגבלה על הפעלה והשבתה של Wi-Fi
אפליקציות שמטרגטות ל-Android 10 ומעלה לא יכולות להפעיל או להשבית את ה-Wi-Fi. ה-method WifiManager.setWifiEnabled() תמיד מחזירה את הערך false.
אם אתם צריכים לבקש מהמשתמשים להפעיל ולהשבית את ה-Wi-Fi, השתמשו בחלונית ההגדרות.
הגבלות על גישה ישירה לרשתות Wi-Fi שהוגדרו
כדי להגן על פרטיות המשתמשים, רק אפליקציות מערכת ובקרים של מדיניות מכשירים (DPC) יכולים להגדיר ידנית את רשימת רשתות ה-Wi-Fi. בקר מדיניות מכשירים (DPC) יכול להיות הבעלים של המכשיר או הבעלים של הפרופיל.
אם האפליקציה מטרגטת את Android 10 ואילך, והיא לא אפליקציית מערכת או DPC, השיטות הבאות לא מחזירות נתונים שימושיים:
ה-method
getConfiguredNetworks()תמיד מחזירה רשימה ריקה.כל שיטה של פעולת רשת שמחזירה ערך של מספר שלם –
addNetwork()ו-updateNetwork()– תמיד מחזירה את הערך -1.כל פעולת רשת שמחזירה ערך בוליאני –
removeNetwork(),reassociate(),enableNetwork(),disableNetwork(),reconnect()ו-disconnect()– תמיד מחזירה את הערךfalse.
אם האפליקציה צריכה להתחבר לרשתות Wi-Fi, אפשר להשתמש בשיטות החלופיות הבאות:
- כדי להפעיל חיבור מקומי מיידי לרשת Wi-Fi, משתמשים ב-
WifiNetworkSpecifierבאובייקטNetworkRequestרגיל. - כדי להוסיף רשתות Wi-Fi שיספקו גישה לאינטרנט למשתמש, צריך לעבוד עם אובייקטים מסוג
WifiNetworkSuggestion. כדי להוסיף ולהסיר רשתות שמופיעות בתיבת הדו-שיח לבחירת רשתות להתחברות אוטומטית, אפשר להפעיל את הפונקציותaddNetworkSuggestions()ו-removeNetworkSuggestions(), בהתאמה. השיטות האלה לא דורשות הרשאות מיקום.
חלק מממשקי ה-API של הטלפוניה, ה-Bluetooth וה-Wi-Fi דורשים הרשאת מיקום מדויק
אם האפליקציה מטרגטת את Android 10 ואילך, צריכה להיות לה ההרשאה ACCESS_FINE_LOCATION כדי להשתמש בכמה שיטות בממשקי ה-API של Wi-Fi, Wi-Fi Aware או Bluetooth. בקטעים הבאים מפורטות המחלקות וה-methods שמושפעות מהשינוי.
טלפוניה
TelephonyManagergetCellLocation()getAllCellInfo()requestNetworkScan()requestCellInfoUpdate()getAvailableNetworks()getServiceState()
TelephonyScanManagerrequestNetworkScan()
TelephonyScanManager.NetworkScanCallbackonResults()
PhoneStateListeneronCellLocationChanged()onCellInfoChanged()onServiceStateChanged()
Wi-Fi
WifiManagerstartScan()getScanResults()getConnectionInfo()getConfiguredNetworks()
WifiAwareManagerWifiP2pManagerWifiRttManager
Bluetooth
BluetoothAdapterstartDiscovery()startLeScan()
BluetoothAdapter.LeScanCallbackBluetoothLeScannerstartScan()
הרשאות
בקטע הזה מתוארים העדכונים במודל ההרשאות של Android.
גישה מוגבלת לתוכן המסך
כדי להגן על תוכן המסך של המשתמשים, ב-Android 10 יש מניעה של גישה שקטה לתוכן המסך של המכשיר על ידי שינוי ההיקף של ההרשאות READ_FRAME_BUFFER, CAPTURE_VIDEO_OUTPUT ו-CAPTURE_SECURE_VIDEO_OUTPUT. החל מ-Android 10, ההרשאות האלה הן רק signature-access.
אפליקציות שצריכות לגשת לתוכן המסך של המכשיר צריכות להשתמש ב-API MediaProjection, שמציג בקשה למשתמש לתת הסכמה.
בדיקת הרשאות שגלויה למשתמשים באפליקציות מדור קודם
אם האפליקציה מטרגטת ל-Android 5.1 (רמת API 22) או לגרסה ישנה יותר, המשתמשים רואים מסך הרשאות כשהם משתמשים באפליקציה במכשיר עם Android 10 או גרסה חדשה יותר בפעם הראשונה, כמו שמוצג באיור 1. במסך הזה המשתמשים יכולים לבטל את הגישה להרשאות שהמערכת העניקה לאפליקציה בזמן ההתקנה.
זיהוי פעילות גופנית
ב-Android 10 נוספה ההרשאה בתחילת ההפעלה android.permission.ACTIVITY_RECOGNITION לאפליקציות שצריכות לזהות את ספירת הצעדים של המשתמש או לסווג את הפעילות הגופנית של המשתמש, כמו הליכה, רכיבה על אופניים או נסיעה ברכב. התכונה הזו נועדה לאפשר למשתמשים לראות בהגדרות איך נעשה שימוש בנתוני החיישנים של המכשיר.
חלק מהספריות ב-Google Play Services, כמו Activity Recognition API ו-Google Fit API, לא מספקות תוצאות אלא אם המשתמש העניק לאפליקציה את ההרשאה הזו.
החיישנים המובנים היחידים במכשיר שדורשים הצהרה על ההרשאה הזו הם מונה הצעדים וגלאי הצעדים.
אם האפליקציה מטרגטת את Android 9 (רמת API 28) או גרסה ישנה יותר, המערכת מעניקה לאפליקציה באופן אוטומטי את ההרשאה android.permission.ACTIVITY_RECOGNITION, לפי הצורך, אם האפליקציה עומדת בכל התנאים הבאים:
- קובץ המניפסט כולל את ההרשאה
com.google.android.gms.permission.ACTIVITY_RECOGNITION. - קובץ המניפסט לא כולל את ההרשאה
android.permission.ACTIVITY_RECOGNITION.
אם המערכת מעניקה באופן אוטומטי את ההרשאה android.permission.ACTIVITY_RECOGNITION, האפליקציה שומרת על ההרשאה אחרי שמעדכנים אותה כך שתטרגט ל-Android 10. עם זאת, המשתמש יכול לבטל את ההרשאה הזו בכל שלב בהגדרות המערכת.
קבוצות ההרשאות הוסרו מממשק המשתמש
החל מ-Android 10, אפליקציות לא יכולות לחפש איך ההרשאות מקובצות בממשק המשתמש.