具有特殊權限的應用程式是位於系統映像檔分割區 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 檔案中,或列於 frameworks/base/etc/permissions
目錄中的多個 XML 檔案中:
/etc/permissions/privapp-permissions-OEM_NAME.xml
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
內容的排版方式沒有嚴格規則。只要 /system/priv-app
中的所有應用程式都列入許可清單,裝置導入人員就能決定內容結構。舉例來說,Google 已為所有特權應用程式開發單一許可清單。建議您採用下列組織架構:
/etc/permissions/privapp-permissions-platform.xml
列出了 Android 開放原始碼計畫 (AOSP) 樹狀結構中已納入的應用程式權限。- 其他應用程式則應使用
/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 節權限。