具有特殊權限的應用程式是位於系統映像檔磁碟分割區 priv-app
目錄中的系統應用程式。Android 版本使用的分區如下:
- Android 9 以上版本:
/system, /product, /vendor
- Android 8.1 以下版本:
/system
過去,裝置製造商對可授予特殊權限應用程式的簽章 | 特殊權限權限,幾乎沒有控管權。從 Android 8.0 開始,製造商可以在 /etc/permissions
目錄的系統設定 XML 檔案中,明確授予具備特殊權限的權限。從 Android 9 開始,實作者可以明確授予或拒絕所有特殊權限。如果未授予特殊權限,裝置將無法啟動。
privapp-permissions.xml
檔案只能授予或拒絕同一分割區中具備特殊權限的應用程式權限。舉例來說,如果 /product
分割區上的應用程式要求具備特殊權限,只有 /product
上的 privapp-permissions.xml
檔案可以授予或拒絕要求。
新增許可清單
應用程式的權限允許清單可以列在單一 XML 檔案中,也可以列在 /etc/permissions
目錄中的多個 XML 檔案中:
/etc/permissions/privapp-permissions-OEM_NAME.xml
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
內容的整理方式沒有嚴格規定。只要允許所有 /system/priv-app
中的應用程式,裝置實作人員就能決定內容結構。舉例來說,Google 為所有具有特殊權限的應用程式開發了單一許可清單。
建議您採用下列機構:
- Android 開放原始碼計畫 (AOSP)樹狀結構中已包含的應用程式權限會列於
/etc/permissions/privapp-permissions-platform.xml
。 - 如果是其他應用程式,請使用以下形式的檔案:
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
。
自訂許可清單
AOSP 包含許可清單實作項目,可視需要自訂。
如果必須拒絕授權,請編輯 XML,改用 deny-permission
標記,而非 permission
標記。例如:
<!-- This XML file declares which signature|privileged permissions to grant to privileged apps that come with the platform --> <permissions> <privapp-permissions package="com.android.backupconfirm"> <permission name="android.permission.BACKUP"/> <permission name="android.permission.CRYPT_KEEPER"/> </privapp-permissions> <privapp-permissions package="com.android.cellbroadcastreceiver"> <!-- Don't allow the application to interact across users --> <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/> <permission name="android.permission.MANAGE_USERS"/> <permission name="android.permission.MODIFY_PHONE_STATE"/> <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/> </privapp-permissions> ...
尋找缺少的權限
如要在啟動新裝置時找出缺少的權限,請啟用過渡記錄模式:
ro.control_privapp_permissions=log
違規事項會記錄在記錄檔中。授予非具備特殊權限的權限。 這麼做可確保裝置維持運作狀態,同時提供違規事項清單。錯誤訊息格式如下:
PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist
如要解決所有違規問題,請將缺少的權限新增至適當的許可清單。 請注意:
- 在 Android 9 以上版本中,如果違反進階權限規定,裝置將無法啟動。您必須明確允許或拒絕所有具備特殊權限的權限。
- 在 Android 8.0 以下版本,即使受影響的應用程式位於
priv-app
路徑中,系統也不會授予缺少的權限。
強制執行許可清單
建立允許清單後,請設定建構屬性 ro.control_privapp_permissions=enforce
,啟用執行階段強制執行功能。
只有在應用程式宣告 package="android"
權限時,才需要加入許可清單。ro.control_privapp_permissions
屬性狀態必須符合相容性定義說明文件 (CDD) 中的第 9.1 節「權限」。