特殊權限許可清單

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