隨著信息化技術的普及,移動應用在迅速改變著人們的生活方式。作為數(shù)字生活的載體,智能設備的演進帶動了數(shù)據(jù)處理技術的不斷成熟,這使得應用對用戶信息的掌控日趨深入。與此同時,人們的隱私保護意識也越來越強,希望在享受移動應用帶來的無限便利之余,也能保護自己的隱私不受侵犯。因此,人們會更青睞那些能從操作系統(tǒng)層面對用戶和數(shù)據(jù)提供保護的平臺。 本文將向您介紹關于 Android 在隱私方面的變化和最佳實踐,幫助您主動為用戶提供優(yōu)秀的隱私保護。同時我們還有幾個關于未來 Android 版本的概念構想與您分享。
隱私保護三原則
我們在設計 Android 之初就充分考慮了對用戶隱私權的保護,并且在最近的版本中將這一理念進一步強化,進而在保護用戶信息安全方面取得了更加顯著的進步。我們一如既往地關心用戶的隱私權,這份執(zhí)著背后是以下三個核心原則:
- 提升數(shù)據(jù)訪問透明度: 讓用戶知道應用在什么時間訪問了哪些數(shù)據(jù);
- 簡化用戶控制隱私訪問的方式: 讓用戶方便地控制應用能訪問更多或更少的用戶數(shù)據(jù);
- 專注最小化數(shù)據(jù)訪問: 去除不必要的數(shù)據(jù)訪問,減少應用的權限范圍,避免應用泄露用戶的數(shù)據(jù)。
隱私保護最佳實踐
基于隱私保護三個核心原則,我們會持續(xù)為您提供各種各樣的工具和指導,幫助您在應用中高效地集成隱私保護功能。這里要向您分享的是在移動應用開發(fā)中可以考慮的三個最佳實踐,您會了解如何提升隱私訪問的透明度,了解如何在尊重用戶選擇權的前提下提供隱私訪問的選項,以及了解如何通過最小化隱私訪問盡可能減少不必要用戶數(shù)據(jù)的獲取。
關注數(shù)據(jù)訪問
您需要考慮的第一個最佳實踐是要仔細斟酌應用對用戶數(shù)據(jù)的訪問。一方面是由于 Android 12 讓用戶更直觀地看到自己的隱私如何被訪問,另一方面則是出于您尊重用戶意愿的考量。應用訪問傳感器時的系統(tǒng)提示
應用的隱私數(shù)據(jù)訪問記錄
我們常常收到用戶的反饋,他們希望了解應用究竟使用了哪些數(shù)據(jù)。對此我們做出了一些努力,全新的隱私信息中心讓用戶可以通過一個簡單清晰的時間線視圖來了解到過去 24 小時中,哪些應用訪問了設備的麥克風、攝像頭和地理位置數(shù)據(jù)。另外,用戶還可以查看到應用是否在過去 24 小時里使用其他運行時權限訪問過相關數(shù)據(jù)。
應用的數(shù)據(jù)使用說明
應用讀取剪貼板時的通知
每當有應用從剪貼板讀取數(shù)據(jù)時,Android 都會通知用戶。每當應用調(diào)用 ClipboardManager#getPrimaryClip() 方法時,Android 會判斷寫入和讀取剪貼板數(shù)據(jù)的是不是同一個應用,當兩者來源不同時,系統(tǒng)會通過一個消息框來提示用戶;當兩者來自同一個應用時,則不會產(chǎn)生這樣的提示。所以我們建議您的應用首先調(diào)用 ClipboardManager#getPrimaryClipDescription() 方法來獲取剪貼板中數(shù)據(jù)的基本信息,并根據(jù)其類型判斷是否需要進一步讀取,從而最大限度減少對剪貼板數(shù)據(jù)的訪問。另外,我們還建議您不要隨意訪問剪貼板,如果有必要,也應該在用戶知情和許可的前提下進行。
為更加透明的隱私訪問做好準備
為了更好支持 Android 12 帶來的隱私透明特性,我們建議您仔細審查應用的代碼是否還存在意外的隱私訪問操作。您可以借助審計 (auditing) API 來更好地發(fā)現(xiàn)潛在的隱私數(shù)據(jù)讀取操作以及第三方 SDK 對隱私數(shù)據(jù)的訪問。這個 API 可以在您的應用訪問敏感數(shù)據(jù)時調(diào)用一個應用內(nèi)的回調(diào)函數(shù),并向其提供所訪問的數(shù)據(jù)類型,這樣您就可以輕松地發(fā)現(xiàn)應用在何時、何種情況下讀取了隱私數(shù)據(jù)。
<activity android:name="DataAccessRationaleActivity"
android:permission="android.permission.START_VIEW_PERMISSION_USAGE"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/>
<action android:name="android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD"/>
intent-filter>
activity>
上面的代碼展示了您添加權限 intent 時需要進行的配置。這段代碼在您的應用中添加了一個 activity,它可以在啟動時告知用戶為什么要訪問數(shù)據(jù)。您需要把 android:permission 屬性設置為 START_VIEW_PERMISSION_USAGE。如果您的應用是針對 Android 12 進行構建的,那么還需要添加 android:exported="true" 屬性。接著添加一個 intent-filter 標簽,隨后根據(jù)您的需要,分別將 android.intent.action.VIEW_PERMISSION_USAGE (在應用的權限管理界面顯示) 和 android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD (在隱私訪問面板顯示) 添加到這個標簽里。這樣一來,用戶就可以在您的應用名稱旁看到一個與應用的 intent-filter 對應的圖標。
綜上所述,在開發(fā)應用時,對于數(shù)據(jù)訪問需要注意以下幾點:
- 只有在必要時才訪問隱私數(shù)據(jù)。不必要的數(shù)據(jù)訪問不僅會讓用戶感到困惑,還會增加隱私泄露的風險;
- 注意引入第三方庫時添加的權限聲明。您可以通過合并 manifest 來查看引入的第三方庫聲明了哪些權限。
- 切勿過度訪問用戶數(shù)據(jù)。對用戶隱私數(shù)據(jù)的讀取如果超過了用戶使用的需要,就是對用戶知情權和控制權的侵犯。
尊重用戶選擇
我們要分享的第二個最佳實踐關乎著用戶的選擇。Android 用戶可以自行掌控哪些應用可以訪問他們的敏感數(shù)據(jù),以及這些數(shù)據(jù)被應用訪問的程度。對于開發(fā)者來說,掌握好這個度非常重要。
研究表明,用戶對應用需要訪問數(shù)據(jù)的原因了解得越充分,那么他們認可這些訪問的可能性就越大。您需要通過提供安全的默認參數(shù)來平衡用戶的掌控權和應用的訪問權限,所以您應該向用戶提供一些易于理解的選項,并尊重他們的意志。
更細致的位置權限選項
我們在 Android 12 中引入了粒度更細的位置權限選項,使得用戶可以自行決定是否只向應用提供粗略的位置信息。我們建議您仔細檢查應用中所有需要訪問位置信息的用例,如果精確的定位不是必須的,請改為申請 ACCESS_COARSE_LOCATION 權限。
無論何種情況下,您都應該具體地向用戶說明為什么需要訪問位置信息,并且按照具體的精度需求逐漸向用戶申請更精確定位信息的訪問權限。同時,您需要考慮到用戶僅允許應用獲取粗略位置的情況,不能因為位置信息不精確就拒絕讓用戶繼續(xù)使用。
如下示例代碼包含了兩個功能,其中一個是只需要訪問大概位置,而另一個則是需要獲取精確定位。當用戶給予應用獲取大致位置的權限時,您需要通過 shouldShowRequestPermissionRationale API 來檢查是否需要向用戶顯示必要的權限申請說明。如果返回了 true,則需要展示您的說明,同時顯示申請大致位置的彈框 (請求 ACCESS_COARSE_LOCATION 權限)。
// 請求 ACCESS_COARSE_LOCATION 權限
requestPermissions(
Context,
arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
REQUEST_CODE
)
if (grantResults[1] == PackageManager.PERMISSION_GRANTED) {
// ACCESS_COARSE_LOCATION 權限已獲授權。
}
當用戶以后用到需要獲取精確定位的功能時,您就可以通過向用戶顯示申請更精確位置信息的彈框來獲得 ACCESS_FINE_LOCATION 權限了。您同樣需要確保用戶了解您的位置用例后再發(fā)起請求。
// 請求 ACCESS_FINE_LOCATION 權限
requestPermissions(
Context,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
REQUEST_CODE
)
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// ACCESS_FINE_LOCATION 權限已獲授權。
}
全局權限開關
Android 12 中引入了這樣兩個開關,分別對應攝像頭和麥克風的全局訪問:
此外值得一提的是,我們在這次更新中還增加了對運動傳感器采樣率的限制 (200Hz 以內(nèi))。
通知顯示權限
我們常常聽到用戶關于設備上通知過多的抱怨,所以我們在新版本中,要求應用需要向用戶申請通知顯示權限,只有當用戶希望或允許收到通知時,應用才可以向用戶發(fā)送通知。
您可以通過 Notification.areNotificationsEnabled API 或者PermissionChecker 來檢查應用是否已經(jīng)獲得了通知權限。申請通知權限的方法與申請其他權限相同,您不需要做額外的調(diào)整。 這里給您補充了一些需要注意的事項:// 請求權限后向用戶發(fā)送通知
requestPermissions(
Context,
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
REQUEST_CODE
)
-
在訪問數(shù)據(jù)前,讓用戶充分了解您讀取數(shù)據(jù)的原因;
-
做好用戶和系統(tǒng)拒絕權限時的操作,當用戶二次拒絕時,您應該尊重用戶的意愿;
-
按需逐級獲取隱私數(shù)據(jù),不要一次性申請所有權限;
-
當用戶拒絕或是撤銷某項權限時,您需要讓應用能無縫回退到無需權限即可運行的狀態(tài)。
?最大程度減少權限使用
第三個最佳實踐是最大程度減少權限的使用。一方面您應當對用戶的意愿和選擇保持尊重,另一方面您還可以使用 Android 的替代 API,在簡化敏感數(shù)據(jù)訪問的同時提供更好的隱私控制。以下幾個方案可以幫助您最大限度減少數(shù)據(jù)訪問。
使用新的附近設備訪問權限
可穿戴設備在最近幾年發(fā)展迅猛,大量的應用需要與這些設備進行交互。在以前,應用必須先申請位置訪問權限才能與配套設備進行藍牙連接。開發(fā)者們向我們反饋了這種不恰當?shù)脑O計,尤其是當應用只需要獲取藍牙訪問權限而不需要獲得設備位置的時候。過度的權限申請也使得用戶對應用的行為正當性產(chǎn)生懷疑,這些反饋敦促著我們改進權限的對應關系。
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
當您切換到構建 API 31 的應用時,可以在上述權限聲明的基礎上添加一個 maxSDKVersion 屬性:
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADVERTISE"/>
隨后,您需要添加 BLUETOOTH_SCAN 權限聲明,并且使用 neverForLocation 標記來向系統(tǒng)說明您不會使用這個權限來推算設備的位置信息。同時您需要聲明 BLUETOOTH_CONNECT 權限來與藍牙設備交互、通過 BLUETOOTH_ADVERTISE 來將當前設備信息廣播給附近的藍牙設備。
為應用設置智能應用休眠功能
在 2020 年發(fā)布 Android 11時,我們同時推出了自動重置權限的功能,并且通過 Google Play 服務的更新將這項功能帶到了運行 Android 6 及以后版本系統(tǒng)的設備上。當某個應用有數(shù)月沒有被使用時,Android 會自動撤銷該應用的某些授權。從這項更新發(fā)布以后的情況分析,僅 14 天內(nèi)已經(jīng)有 850 萬應用的權限因長久未使用被撤銷了。所以建議您總是要先檢查權限是否還存在,避免因為系統(tǒng)撤銷權限而產(chǎn)生錯誤。
2021 年,在權限自動重置功能的基礎上,我們推出了智能應用休眠功能。Android 會自動將長期沒有使用的應用進行休眠,從而優(yōu)化設備存儲、改善性能和提高安全性。系統(tǒng)不僅會撤銷用戶此前的授權,還會強制停止應用,收回內(nèi)存、存儲空間及其他臨時資源。
當應用進入休眠后,系統(tǒng)會阻止應用在后臺運行任務,或者接收推送通知。而結(jié)束應用休眠的方式也非常簡單,用戶只需要啟動應用即可。與權限自動重置類似,應用進入休眠時,用戶會收到相應的通知,同時用戶也可以在設置中選擇關閉休眠。
用好分區(qū)存儲策略
Android 10 的發(fā)布首次引入了分區(qū)存儲機制,它為隱私保護提供了一種新的存儲方案。隨著后續(xù)幾個版本的迭代更新,其他應用不再能訪問某個應用的外部目錄了。您也可以在不請求任何權限的基礎上添加和編輯本應用的文件,或是在用戶知情同意的前提下編輯第三方應用產(chǎn)生的文件。而如果您將文件添加到共享存儲目錄中,則無需任何權限申請操作。
- 使用照片選擇器
未來我們會發(fā)布一個照片選擇器 (Photo Picker),它可以無需任何請求即可讀取用戶選擇的照片或視頻。您可以在其中選擇設備本地存儲的照片或視頻,也可以訪問到來自 Google Photos 等云提供商的照片或視頻。這個新的選擇器會替換以前申請權限的訪問方式,簡化應用的權限聲明。
通過 Google Play 系統(tǒng)更新,Android 11 及以后的設備都可以使用這個新的照片選擇器。下面是一個使用這款新照片選擇器的例子:
如果您需要在應用中喚起這個選擇器,需要啟動 ACTION_PICK_IMAGES Intent,然后指定可選取媒體的最大數(shù)量和支持的文件類型。當用戶選中文件后,可以通過 clipData 屬性讀取各個文件的 URI,然后使用ContentResolver 來讀取文件內(nèi)容。為了能夠兼容更早前的設備,我們還計劃發(fā)布一個支持庫,讓應用在支持時使用新的照片選擇器,不支持時使用存儲訪問框架簡化對文件元數(shù)據(jù)、內(nèi)容的讀取。// 要發(fā)送的 intent
val intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply {
putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, 15)
putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*"))
}
// 處理返回的 intent
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
// 遍歷所有的 URI 結(jié)果
for (i in 0 until data.clipData.itemCount) {
val uri = data.clipData.getItemAt(i).uri
val inputStream = contentResolver.openInputStream(uri)
}
}
- 新的存儲權限劃分策略
此外,我們還在努力通過新的存儲空間功能為用戶帶來更清晰、為開發(fā)者帶來更精準的存儲權限劃分粒度。比如在下個版本中引入的 READ_IMAGES 權限允許您讀取共享存儲空間上的所有圖片和視頻文件,而 READ_AUDIO 可用于讀取所有的音頻文件 (包括 .m3u 播放列表)。 借助分區(qū)存儲,您應用訪問自己分區(qū)內(nèi)的文件時不需要申請訪問權限;位于共享存儲空間的非媒體文件仍然可以通過存儲訪問框架獲得。如果要在您的 manifest 中包括這些變化,您可以參照這個例子:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="31"/>
<uses-permission android:name="android.permission.READ_IMAGES"/>
<uses-permission android:name="android.permission.READ_AUDIO"/>
<uses-permissionandroid:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
請注意,MANAGE_EXTERNAL_STORAGE 權限可以用于那些核心功能就是要與大量的文件進行交互的應用。但此權限受限于 Google Play 關于使用 "所有文件訪問權限" 的政策。
以上這些建議概括如下幾點:
- 盡可能減少位置數(shù)據(jù)訪問,并且盡量只在應用處于前臺時訪問粗略的位置信息;
- 使用新的藍牙權限來更好地提供隱私保護;
- 盡可能通過新的照片選擇器來避免請求共享存儲空間。
開發(fā)者可降級權限
一些應用可能不再需要某些之前由用戶授予過的權限,這些權限曾用于開啟某項特定功能或保留舊的 Android 版本中的敏感權限。在 Android 13 中,我們提供了新的 API,讓您的應用通過降級以前被授予的運行時權限來保護用戶隱私。
感謝您的閱讀,希望我們可以共同構建一個能夠讓用戶安心使用的操作系統(tǒng)和應用生態(tài)。
原文標題:保護 Android 用戶隱私,從這些事做起
文章出處:【微信公眾號:谷歌開發(fā)者】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
審核編輯:湯梓紅
-
Android
+關注
關注
12文章
3941瀏覽量
127728 -
隱私保護
+關注
關注
0文章
300瀏覽量
16463 -
隱私數(shù)據(jù)
+關注
關注
0文章
7瀏覽量
2127
原文標題:保護 Android 用戶隱私,從這些事做起
文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論