特殊權限許可清單

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