運行時權限

在 Android 6.0 及更高版本中,Android 應用程序權限模型旨在使權限對用戶更易於理解、更有用和更安全。該模型搬到需要危險的權限(見Android應用程序受影響的權限),從安裝時間權限模型的運行權限模型:

  • 安裝時權限

    機器人5.1和更低的)用戶授予危險權限到應用時它們安裝或更新的應用程序。設備製造商和運營商可以使用預先授予的權限預安裝應用程序,而無需通知用戶。

  • 運行時權限

    機器人6.0 - 9)用戶授予權限危險到一個應用程序的應用程序正在運行時。何時請求權限(例如應用程序啟動時或用戶訪問特定功能時)取決於應用程序,但用戶授予/拒絕應用程序訪問特定權限組。 OEM/運營商可以預安裝應用程序,但不能預授予權限,除非他們通過例外流程。 (請參閱創建例外。)

    機器人10)的用戶看到提高透明度和具有控制哪些應用程序具有活動識別(AR)運行時權限。通過提示用戶運行權限對話框要么總是允許,允許在使用時,或拒絕的權限。在操作系統升級到Android 10,提供給應用程序的權限被保留,但用戶可以進入設置和更改。

運行時權限可防止應用程序在未經用戶同意的情況下訪問私人數據,並為應用程序提供額外的上下文和可見性,了解應用程序正在尋求或已授予的權限類型。運行時模型鼓勵開發人員幫助用戶理解為什麼應用程序需要請求的權限,並提供更大的透明度,以便用戶可以更好地決定授予或拒絕權限。

受影響的權限

Android 6.0 及更高版本需要危險權限才能使用運行時權限模型。危險的權限是較高風險的權限(例如READ_CALENDAR其准許在裝置中,其可以在用戶造成負面影響請求的應用程序訪問私人用戶數據,或控制。要查看危險權限列表,請運行以下命令:

adb shell pm list permissions -g -d

在Android 6.0及更高版本不改變的行為, 正常的權限。這些都是非危險權限,包括正常、系統和簽名權限。正常的權限是低風險的權限(例如SET_WALLPAPER ),該授予請求的應用程序訪問分離的應用程序級以最小的風險至其他應用程序,系統,或用戶的特徵。與 Android 5.1 及更低版本一樣,系統會在安裝時自動向發出請求的應用程序授予正常權限,並且不會提示用戶進行批准。有關權限的詳細信息,請參閱<許可>元素的文檔。

Android 10 中的硬性和軟性限制

除了危險之外,權限還可以是硬限製或軟限制。在任一情況下,受限權限也必須列入白名單。非白名單硬限制與非白名單軟限制的行為不同:

  • 硬限制)的應用不能被理所當然地認為是未列入白名單的權限。
  • 軟限制)應用程序,而不白名單根據他們請求特定權限的行為。該行為在所請求權限的公共文檔中進行了描述。

安裝應用程序時,安裝程序(例如 Google Play 商店)可能會選擇不將應用程序的受限權限列入白名單。權限受平台限制,僅當應用程序滿足每個平台策略的特殊標準時才可授予。硬限制權限類型的示例包括短信和通話記錄權限。

白名單發生在安裝過程中,以及何時

  • 在 Android 9 到 10 升級期間已經安裝了一個應用程序。
  • 預先授予權限或預先安裝應用程序。
  • 已定義的角色需要權限才能將權限列入白名單。
  • 安裝程序(例如 Google Play 商店)將權限標記為白名單。

用戶無法手動將權限列入白名單。

要求

運行時權限模型適用於所有應用程序,包括預安裝的應用程序和作為設置過程的一部分交付給設備的應用程序。應用軟件要求包括:

  • 運行時權限模型必須在所有運行 Android 6.0 及更高版本的設備上保持一致。這是由 Android 兼容性測試套件 (CTS) 測試強制執行的。
  • 應用程序必須在運行時提示用戶授予應用程序權限。有關詳細信息,請參閱更新應用程序。可以向默認應用程序和處理程序授予有限的例外,這些應用程序和處理程序提供對設備預期操作至關重要的基本設備功能。 (例如,設備的默認撥號器應用處理ACTION_CALL可能有電話接入許可。)有關詳細信息,請參閱創建例外
  • 具有危險權限的預加載應用程序必須以 API 級別 23 為目標並維護運行時權限模型。即應用安裝時的UI流程不能偏離PermissionController的AOSP實現,用戶可以撤銷預裝應用的危險權限等。
  • Headless 應用程序必須使用 Activity 來請求權限或與具有必要權限的另一個應用程序共享 UID。有關詳細信息,請參閱無頭應用程序

權限遷移

更新到 Android 6.0 或更高版本後,授予 Android 5.x 應用程序的權限仍然授予,但用戶可以隨時撤消這些權限。

在 Android 9 到 10 更新中,所有嚴格限制的權限都被列入白名單。有關實現前景/背景拆分權限的詳細信息,請參閱Android的10隱私變化,與開始請求背景位置

一體化

為 Android 6.0 及更高版本集成應用程序運行時權限模型時,您必須更新預安裝的應用程序以使用新模型。您還可以定義為是核心功能的默認處理程序/應用提供商例外,定義自定義權限,並自定義使用的主題PermissionController應用。

更新應用程序

系統映像上的應用程序和預安裝的應用程序不會自動預授予權限。我們鼓勵您使用預裝的應用程序開發商(OEM,運營商和第三方)工作,使使用所需的應用程序修改開發者指南。具體來說,您必須確保修改預安裝的應用程序,以避免在用戶撤銷權限時出現崩潰和其他問題。

預加載的應用程序

在 Android 9 及更低版本中,使用危險權限的預加載應用必須以 API 級別 23 或更高為目標,並維護 Android 6.0 及更高版本的 AOSP 權限模型。例如,一個應用程序安裝過程中,UI流量必須不從AOSP實施偏離PermissionController 。用戶甚至可以撤銷預裝應用程序的危險權限。

在 Android 6.0 到 9 中,在安裝流程中授予了一些權限。然而,在開始10,安裝流量(由執行Package Installer應用程序)是從權限一個單獨的函數給予(在Permission Controller應用程序)。

無頭應用

只有活動可以請求權限。服務不能直接請求權限。

  • 在 Android 5.1 及更早版本中,無頭應用程序可以在安裝時請求權限,或者如果它們是在未使用 Activity 的情況下預安裝的。
  • 在 Android 6.0 及更高版本中,無頭應用程序必須使用以下方法之一來請求權限:
    • 添加活動以請求權限。 (這是首選方法。)
    • 與具有必要權限的另一個應用程序共享 UID。僅當您需要平台將多個 APK 作為單個應用程序處理時才使用此方法。

目標是避免用戶與出現上下文之外的權限請求混淆。

自定義 PackageInstaller UI

如果需要,您可以通過更新默認設備主題(定制許可UI主題Theme.DeviceDefault.SettingsTheme.DeviceDefault.Light.Dialog.NoActionBar通過PackageInstaller使用)。但是,由於一致性對應用程序開發人員至關重要,因此您無法自定義權限 UI 出現的位置、位置和規則。

要包含其他語言的字符串,有助於琴弦AOSP。

創建例外

您可以預先將權限授予那些使用默認的處理程序或核心操作系統功能提供應用DefaultPermissionGrantPolicy.java在PackageManager類。例子:

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 兼容性的要求。