在 Android 6.0 及更高版本中,Android 應用程序權限模型旨在使權限對用戶而言更易於理解、更有用且更安全。該模型將需要危險權限(請參閱受影響的權限)的 Android 應用程序從安裝時權限模型移至運行時權限模型:
- 安裝時權限
( Android 5.1 及更低版本)用戶在安裝或更新應用時向應用授予危險權限。設備製造商和運營商可以在不通知用戶的情況下預安裝具有預先授予權限的應用程序。
- 運行時權限
( Android 6.0 – 9 ) 用戶在應用程序運行時向應用程序授予危險權限。何時請求權限(例如應用程序啟動時或用戶訪問特定功能時)取決於應用程序,但用戶授予/拒絕應用程序訪問特定權限組。 OEM/運營商可以預安裝應用程序,但不能預先授予權限,除非他們通過例外流程。 (請參閱創建例外。)
( Android 10 ) 用戶可以看到更高的透明度,並且可以控制哪些應用具有活動識別 (AR) 運行時權限。運行時權限對話框提示用戶始終允許、在使用時允許或拒絕權限。在操作系統升級到 Android 10 時,授予應用程序的權限會保留,但用戶可以進入設置並更改它們。
運行時權限可防止應用在未經用戶同意的情況下訪問私有數據,並為應用提供額外的上下文和對應用正在尋求或已被授予的權限類型的可見性。運行時模型鼓勵開發人員幫助用戶理解為什麼應用程序需要請求的權限,並提供更高的透明度,以便用戶可以更好地決定授予或拒絕權限。
受影響的權限
Android 6.0 及更高版本需要危險權限才能使用運行時權限模型。危險權限是高風險權限(例如READ_CALENDAR
),它授予請求應用程序訪問私有用戶數據或對設備的控制權,這可能會對用戶產生負面影響。要查看危險權限列表,請運行以下命令:
adb shell pm list permissions -g -d
Android 6.0 及更高版本不會改變正常權限的行為。這些都是非危險權限,包括普通權限、系統權限和簽名權限。正常權限是風險較低的權限(例如SET_WALLPAPER
),它授予請求應用程序訪問隔離應用程序級功能的權限,而對其他應用程序、系統或用戶的風險最小。與 Android 5.1 及更低版本一樣,系統會在安裝時自動授予請求應用程序正常權限,並且不會提示用戶批准。有關權限的詳細信息,請參閱<permission> 元素文檔。
Android 10 中的硬限制和軟限制
除了危險之外,權限可以是硬限製或軟限制。在任何一種情況下,受限權限也必須被列入白名單。非白名單硬限制的行為不同於非白名單軟限制:
- (硬限制)不能授予未列入白名單的應用程序權限。
- (軟限制)沒有白名單的應用程序會根據他們請求的特定權限行事。該行為在請求權限的公共文檔中進行了描述。
安裝應用程序時,安裝程序(例如 Google Play 商店)可能會選擇不將應用程序的受限權限列入白名單。權限受平台限制,並且僅當應用程序滿足每個平台策略的特殊標準時才可授予。硬限制權限類型的示例包括 SMS 和通話記錄權限。
安裝期間發生白名單,以及何時
- 在 Android 9 到 10 升級期間已安裝應用程序。
- 預先授予權限或預安裝應用程序。
- 已定義為將權限列入許可名單的角色需要權限。
- 安裝程序(例如 Google Play 商店)將權限標記為允許列表。
用戶不能手動加入許可名單權限。
要求
運行時權限模型適用於所有應用程序,包括預安裝的應用程序和作為設置過程的一部分交付到設備的應用程序。應用軟件要求包括:
- 運行時權限模型必須在所有運行 Android 6.0 及更高版本的設備上保持一致。這是由 Android 兼容性測試套件 (CTS) 測試強制執行的。
- 應用程序必須在運行時提示用戶授予應用程序權限。有關詳細信息,請參閱更新應用程序。可以向默認應用程序和處理程序授予有限例外,這些應用程序和處理程序提供了對設備的預期操作至關重要的基本設備功能。 (例如,設備默認的處理
ACTION_CALL
的 Dialer 應用可能有 Phone 權限訪問。)詳情請參見創建異常。 - 具有危險權限的預加載應用程序必須針對 API 級別 23 並維護運行時權限模型。即應用安裝過程中的 UI 流程不能偏離 PermissionController 的 AOSP 實現,用戶可以撤銷預裝應用的危險權限等等。
- 無頭應用程序必須使用活動來請求權限或與另一個具有必要權限的應用程序共享 UID。有關詳細信息,請參閱無頭應用程序。
權限遷移
授予 Android 5.x 上的應用程序的權限在更新到 Android 6.0 或更高版本後仍然被授予,但用戶可以隨時撤銷這些權限。
在 Android 9 到 10 的更新中,所有嚴格限制的權限都會被列入許可名單。有關實現前台/後台拆分權限的詳細信息,請參閱Android 10 隱私更改,從請求後台位置開始。
一體化
在為 Android 6.0 及更高版本集成應用程序運行時權限模型時,您必須更新預安裝的應用程序以使用新模型。您還可以為作為核心功能的默認處理程序/提供程序的應用程序定義異常,定義自定義權限,並自定義PermissionController
應用程序中使用的主題。
更新應用程序
系統映像上的應用程序和預安裝的應用程序不會自動預先授予權限。我們鼓勵您與預裝應用開發者(OEM、運營商和第三方)合作,按照開發者指南對應用進行必要的修改。具體來說,您必須確保修改預安裝的應用程序,以避免在用戶撤銷權限時出現崩潰和其他問題。
預加載的應用程序
在 Android 9 及更低版本中,使用危險權限的預加載應用必須以 API 級別 23 或更高版本為目標,並保持 Android 6.0 及更高版本的 AOSP 權限模型。例如,應用安裝期間的 UI 流程不得偏離PermissionController
的 AOSP 實現。用戶甚至可以撤銷預裝應用程序的危險權限。
在 Android 6.0 到 9 中,在安裝流程中會授予一些權限。但是,從 10 開始,安裝流程(由Package Installer
應用程序執行)是與權限授予(在Permission Controller
應用程序中)分開的功能。
無頭應用
只有活動可以請求權限。服務不能直接請求權限。
- 在 Android 5.1 及更早版本中,無頭應用程序可以在安裝時請求權限,或者如果它們是在不使用活動的情況下預安裝的。
- 在 Android 6.0 及更高版本中,無頭應用程序必須使用以下方法之一來請求權限:
- 添加活動以請求權限。 (這是首選方法。)
- 與具有必要權限的另一個應用程序共享 UID。僅當您需要平台將多個 APK 作為單個應用程序處理時才使用此方法。
目的是避免讓用戶與出現斷章取義的權限請求混淆。
自定義 PackageInstaller UI
如果需要,您可以通過更新 PackageInstaller 使用的默認設備主題( Theme.DeviceDefault.Settings
和Theme.DeviceDefault.Light.Dialog.NoActionBar
)來自定義權限 UI主題。但是,由於一致性對應用程序開發人員至關重要,因此您無法自定義 Permissions UI 出現的位置、位置和規則。
要包含其他語言的字符串,請將字符串提供給 AOSP。
創建異常
您可以使用 PackageManager 中的DefaultPermissionGrantPolicy.java
類為作為核心操作系統功能的默認處理程序或提供程序的應用程序預先授予權限。例子:
ACTION_CALL (Dialer) Default Phone, Contacts, SMS, Microphone
SMS_DELIVER_ACTION (SMS/MMS) Default Phone, Contacts, SMS
定義自定義權限
您可以將自定義權限和組定義為正常或危險,並將 OEM/運營商特定權限添加到現有權限組,就像在 Android 5.x 和更早版本中一樣。
在 Android 6.0 及更高版本中,如果您添加新的危險權限,則必須以與其他危險權限相同的方式處理(在應用運行時請求並且用戶可以撤銷)。具體來說:
- 您可以向當前組添加新權限,但不能修改危險權限和危險權限組的 AOSP 映射。 (換句話說,您不能從組中刪除權限並分配給另一個組)。
- 您可以在設備上安裝的應用程序中添加新的權限組,但不能在平台清單中添加新的權限組。
測試權限
Android 包含兼容性測試套件 (CTS) 測試,用於驗證各個權限是否映射到正確的組。通過這些測試是 Android 6.0 和更高版本 CTS 兼容性的要求。