執行階段權限

在 Android 6.0 以上版本中,Android 應用程式權限模型的設計目的在於讓 對使用者來說,更加容易理解、實用且安全。模型遷移了 Android 需要危險權限的應用程式 (請參閱 受影響的權限) 執行階段權限模型的 install-time 權限模型:

  • 安裝期間權限

    (Android 5.1 以下版本) 使用者在安裝或更新應用程式時,授予應用程式危險權限。裝置 製造商和電信業者可以預先安裝已取得權限的應用程式,無需通知 內容。

  • 執行階段權限

    (Android 6.0 至 9) 使用者在應用程式執行期間授予危險權限。 要求權限時 (例如應用程式啟動或使用者存取特定應用程式/ 功能),但使用者允許/拒絕應用程式存取特定 權限群組。原始設備製造商 (OEM)/電信業者可以預先安裝應用程式,但無法預先授予權限 請先完成例外狀況程序(請參閱建立 例外狀況)。

    (Android 10) 使用者看到資訊更加公開透明, 控管哪些應用程式具備活動辨識 (AR) 執行階段權限。使用者會收到提示 執行階段權限對話方塊,可設為「一律允許」、「允許在使用時」或「拒絕權限」。 升級至 Android 10 的 OS 會保留應用程式獲派的權限 但使用者可以前往「設定」進行變更。

執行階段權限功能可防止應用程式在未經使用者同意的情況下,存取私人資料。 並為他們提供更多背景資訊和瀏覽權限,方便他們瞭解 應用程式可能需要尋找或已經取得核准執行階段模型鼓勵開發人員 協助使用者瞭解應用程式需要權限的原因,並提供 公開相關資訊,方便使用者做出更明智的決定。

受影響的權限

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 商店) 可能會選取 將應用程式的受限制權限加入許可清單。權限為 受到平台限制,且只有在應用程式符合特殊條件時才能授予 。嚴格限制權限類型範例包括簡訊 和通話記錄權限。

系統會在安裝期間、

  • 某個應用程式在 Android 9 至 10 升級期間已安裝該應用程式。
  • 預先授權或預先安裝應用程式。
  • 先前定義的角色必須具備權限,才能允許 權限。
  • 安裝程式 (例如 Google Play 商店) 會將權限標示為 已加入許可清單。

使用者無法手動將權限加入許可清單。

需求條件

執行階段權限模型適用於所有應用程式,包括預先安裝的應用程式和應用程式 才會在設定程序中傳送到裝置。應用程式軟體要求包括:

  • 所有搭載 Android 6.0 的裝置都必須採用一致的執行階段權限模型 以及更高版本這是 Android Compatibility Test Suite (CTS) 測試強制執行的措施。
  • 應用程式必須在執行階段提示使用者授予應用程式權限。詳情請參閱更新 應用程式。預設應用程式和處理常式可能允許少數例外狀況 提供基本裝置功能,以滿足裝置的預期運作情形。 (舉例來說,裝置用於處理 ACTION_CALL 的預設撥號應用程式可能有 手機存取權限)。詳情請參閱「建立例外狀況」。
  • 預先載入的應用程式具有危險權限 必須指定 API 級別 23 並維護執行階段權限模型。也就是說 安裝應用程式時,不得偏離 Android 開放原始碼計畫的實作內容。 PermissionController,使用者可以撤銷預先安裝的應用程式的危險權限,等 保持開啟。
  • 無頭應用程式必須使用活動來要求權限或分享 為另一個具有必要權限的應用程式使用 UID。詳情請參閱「無頭應用程式」。

權限遷移

在更新至 Android 6.0 之後,授予 Android 5.x 應用程式的權限仍維持不變 或更高版本,但使用者隨時可以撤銷這些權限。

在 Android 9 至 10 的更新中,所有嚴格限制權限都會取得 已加入許可清單。如要進一步瞭解如何實作前景/背景分割權限,請參閱 Android 10 隱私權變更,從「要求背景」開始。 位置

整合

整合 Android 6.0 以上版本的應用程式執行階段權限模型時,您必須 更新預先安裝的應用程式,以與新模型搭配使用。您也可以定義應用程式的例外狀況 做為核心功能的預設處理常式/供應器、定義自訂權限,以及 自訂 PermissionController 應用程式中使用的主題。

更新應用程式

系統不會自動預先取得系統映像檔和預先安裝的應用程式 授予其要求的權限。建議您與預先安裝的應用程式開發人員 (原始設備製造商、電信業者和第三版) 合作 一方),請開發人員 指南。具體來說,您必須確保預先安裝的應用程式經過修改,以免發生 使用者撤銷權限時發生的當機和其他問題。

預先載入的應用程式

在 Android 9 以下版本中,如果預先載入的應用程式會使用危險權限,則必須指定 API 級別 23 為目標 以及維護 Android 6.0 以上版本的 Android 開放原始碼計畫權限模型。例如 UI 流程 安裝應用程式時,請勿偏離 Android 開放原始碼計畫的實作方式。 PermissionController。使用者甚至可以撤銷 預先安裝的應用程式。

在 Android 6.0 至 9 版本中,系統會在安裝流程中授予一些權限。不過,如果是 在第 10 版中,安裝流程 (由 Package Installer 應用程式執行) 與授予權限 (在 Permission Controller 應用程式)。

無頭應用程式

只有活動可以要求權限。服務無法直接要求權限。

  • 在 Android 5.1 以下版本中,無頭應用程式可在以下情況要求權限: 安裝的應用程式,或是應用程式在沒有活動的情況下預先安裝。
  • 於 Android 6.0 以上版本中的無頭應用程式必須採用下列其中一種方法, 要求權限:
    • 新增活動以要求權限。(建議採用這個方法)。
    • 與其他具有必要權限的應用程式共用 UID。使用這份草稿 方法,除非需要平台將多個 APK 視為單一值處理 應用程式。

這麼做的目標是避免在與背景無關的權限要求中,造成使用者混淆。

自訂 PackageInstaller 使用者介面

如有需要,您可以自訂權限 UI 主題,方法是: 正在更新預設裝置主題 (Theme.DeviceDefault.SettingsTheme.DeviceDefault.Light.Dialog.NoActionBar) PackageInstaller。不過,由於一致性對應用程式開發人員而言至關重要 您無法自訂 使用者介面出現。

如要加入其他語言的字串,請提供 字串傳送給 Android 開放原始碼計畫。

建立例外狀況

您可以針對預設處理常式的應用程式預先授予權限,或是 以便提供核心 OS 功能 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 以上版本中,如果您新增危險權限,則必須在 與其他危險權限相同 (在應用程式執行階段期間要求 可由使用者撤銷)。具體違規事項如下:

  • 您可以新增權限給目前的群組,但無法修改 危險權限和危險權限群組的 Android 開放原始碼計畫對照表。(也就是說,您 無法移除群組中的權限,並將其指派給其他群組)。
  • 您可以在裝置上安裝的應用程式中新增權限群組, 但您無法在平台資訊清單中新增權限群組

測試權限

Android 提供的 Compatibility Test Suite (CTS) 測試, 個別權限都會對應至正確的群組。通過這些測試 以及 Android 6.0 以上版本的 CTS 相容性需求。

撤銷權限

在 Android 13 以上版本中,您可以撤銷自己授予的權限 執行階段權限 Context.revokeSelfPermissionsOnKill()。 撤銷作業會以非同步方式進行,並在安全的情況下觸發,不會中斷 使用者。觸發撤銷作業時,所有在呼叫 UID 中執行的程序都會終止。

請特別注意,撤銷單一權限不一定會反映在 設定使用者介面,可依群組處理權限。權限群組通常會顯示為 前提是該群組中至少具有一項權限。如果能確保 這個管理選項可確認您重視設定中,請務必撤銷所有 授予的權限。如要瞭解屬於特定群組的權限,您可以 使用「PackageManager.getGroupOfPlatformPermission」 和 PackageManager.getPlatformPermissionsForGroup

系統撤銷要求的權限時,也會一併撤銷對應的背景 權限。

只要程序仍在前景運作,系統就不會觸發撤銷程序,但程序可以 也會立即終止目前 uid 中執行的所有程序,以立即觸發 使用 System.exit() 存取這個執行個體。 不過,還是建議您讓系統決定觸發時機,

權限撤銷生效後,您可以再次要求授權,而使用者 。您無法要求 先前遭到使用者拒絕雖然我們建議您撤銷 目前保留狀態,但不再需要,請務必小心不要告知使用者 立即終止。