在 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.Settings
和 Theme.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()
存取這個執行個體。
不過,還是建議您讓系統決定觸發時機,
權限撤銷生效後,您可以再次要求授權,而使用者 。您無法要求 先前遭到使用者拒絕雖然我們建議您撤銷 目前保留狀態,但不再需要,請務必小心不要告知使用者 立即終止。