ב-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 ומספר סידורי.
השיטות שמושפעות מהשינוי כוללות:
Build
TelephonyManager
אם לאפליקציה שלכם אין את ההרשאה הזו ואתם מנסים לבקש מידע על מזהים שלא ניתן לאפס בכל זאת, התגובה של הפלטפורמה משתנה בהתאם לגרסת ה-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. השיטה
WifiManager.setWifiEnabled()
תמיד מחזירה false
.
אם אתם רוצים להציג למשתמשים בקשה להפעיל או להשבית את ה-Wi-Fi, אתם יכולים להשתמש בחלונית הגדרות.
הגבלות על גישה ישירה לרשתות Wi-Fi מוגדרות
כדי להגן על פרטיות המשתמשים, הגדרה ידנית של רשימת רשתות ה-Wi-Fi מוגבלת לאפליקציות מערכת ולבקרי מדיניות מכשירים (DPC). אפליקציית DPC יכולה להיות הבעלים של המכשיר או הבעלים של הפרופיל.
אם האפליקציה שלכם מטרגטת ל-Android 10 ומעלה, והיא לא אפליקציית מערכת או DPC, השיטות הבאות לא יחזירו נתונים שימושיים:
השיטה
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. בקטעים הבאים מפורטים השיעורים והשיטות שהושפעו.
טלפוניה
TelephonyManager
getCellLocation()
getAllCellInfo()
requestNetworkScan()
requestCellInfoUpdate()
getAvailableNetworks()
getServiceState()
TelephonyScanManager
requestNetworkScan()
TelephonyScanManager.NetworkScanCallback
onResults()
PhoneStateListener
onCellLocationChanged()
onCellInfoChanged()
onServiceStateChanged()
Wi-Fi
WifiManager
startScan()
getScanResults()
getConnectionInfo()
getConfiguredNetworks()
WifiAwareManager
WifiP2pManager
WifiRttManager
Bluetooth
BluetoothAdapter
startDiscovery()
startLeScan()
BluetoothAdapter.LeScanCallback
BluetoothLeScanner
startScan()
הרשאות
בקטע הזה מתוארים עדכונים במודל ההרשאות של Android.
גישה מוגבלת לתוכן המסך
כדי להגן על תוכן המסך של המשתמשים, ב-Android 10 אין יותר גישה שקטה לתוכן המסך של המכשיר. זאת בעקבות שינוי בהיקף של ההרשאות READ_FRAME_BUFFER
, CAPTURE_VIDEO_OUTPUT
ו-CAPTURE_SECURE_VIDEO_OUTPUT
. החל מ-Android 10, ההרשאות האלה הן הרשאות גישה עם חתימה בלבד.
אפליקציות שזקוקות לגישה לתוכן המסך של המכשיר צריכות להשתמש ב-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, אפליקציות לא יכולות לחפש בממשק המשתמש איך ההרשאות מקובצות.