特權應用程式是位於系統映像分割區上的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 節權限。