Danh sách các quyền được ưu tiên cho phép

Ứng dụng đặc quyền là các ứng dụng hệ thống nằm trong thư mục priv-app trên một phân vùng hình ảnh hệ thống. Các phân vùng dùng cho bản phát hành Android là:

  • Android 9 trở lên: /system, /product, /vendor
  • Android 8.1 trở xuống: /system

Trước đây, các nhà sản xuất thiết bị có rất ít quyền kiểm soát đối với chữ ký | đặc quyền nào có thể được cấp cho ứng dụng đặc quyền. Kể từ Android 8.0, nhà sản xuất có thể cấp quyền rõ ràng trong các tệp XML cấu hình hệ thống trong Thư mục /etc/permissions. Kể từ Android 9, trình triển khai có thể cấp hoặc từ chối một cách rõ ràng mọi quyền đặc quyền. Nếu không được cấp quyền đặc quyền, thiết bị không khởi động được.

Tệp privapp-permissions.xml chỉ có thể cho phép hoặc từ chối các quyền dành cho các ứng dụng đặc quyền trên cùng một phân vùng. Ví dụ: nếu một ứng dụng trên phân vùng /product yêu cầu quyền đặc quyền, chỉ privapp-permissions.xml mới có thể chấp nhận hoặc từ chối yêu cầu tệp trên /product.

Thêm danh sách cho phép

Bạn có thể liệt kê danh sách các quyền cho ứng dụng trong một tệp XML duy nhất hoặc trong nhiều Các tệp XML nằm trong thư mục frameworks/base/etc/permissions:

  • /etc/permissions/privapp-permissions-OEM_NAME.xml
  • /etc/permissions/privapp-permissions-DEVICE_NAME.xml

Không có quy tắc nghiêm ngặt nào áp dụng cho cách sắp xếp nội dung. Trình triển khai thiết bị có thể xác định cấu trúc nội dung, miễn là tất cả các ứng dụng từ /system/priv-app có tên trong danh sách cho phép. Ví dụ: Google đã phát triển một danh sách cho phép duy nhất cho tất cả các ứng dụng có đặc quyền. Bạn nên dùng tổ chức sau:

  • Quyền cho các ứng dụng đã bao gồm trong Dự án nguồn mở Android (AOSP) được liệt kê trong /etc/permissions/privapp-permissions-platform.xml.
  • Đối với các ứng dụng khác, hãy dùng các tệp có trong biểu mẫu, /etc/permissions/privapp-permissions-DEVICE_NAME.xml.

Tuỳ chỉnh danh sách cho phép

AOSP bao gồm việc triển khai danh sách cho phép có thể được tuỳ chỉnh khi cần.

Nếu một quyền phải bị từ chối, hãy chỉnh sửa XML để dùng thẻ deny-permission thay vì thẻ permission. Ví dụ:

<!-- 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>
    ...

Tìm quyền còn thiếu

Để tìm các quyền bị thiếu khi khởi động thiết bị mới, hãy bật chế độ nhật ký chuyển đổi:

ro.control_privapp_permissions=log

Các lỗi vi phạm được báo cáo trong tệp nhật ký. Các quyền không có đặc quyền đã được cấp. Việc này giúp đảm bảo thiết bị vẫn ở trạng thái hoạt động trong khi vẫn cung cấp danh sách vi phạm. Thông báo lỗi có định dạng như sau:

PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist

Bạn phải giải quyết tất cả các lỗi vi phạm bằng cách thêm các quyền còn thiếu vào danh sách cho phép thích hợp. Lưu ý trong:

  • Trên Android 9 trở lên, việc vi phạm quyền đặc quyền khiến thiết bị không thể bắt đầu. Thay vào đó, bạn phải cho phép hoặc từ chối tất cả các quyền đặc quyền một cách rõ ràng.
  • Android 8.0 trở xuống, các quyền còn thiếu sẽ không được cấp cho các ứng dụng bị ảnh hưởng mặc dù nằm trong đường dẫn priv-app.

Thực thi danh sách cho phép

Sau khi bạn tạo danh sách cho phép, hãy bật tính năng thực thi trong thời gian chạy bằng cách đặt bản dựng thuộc tính ro.control_privapp_permissions=enforce.

Chỉ những quyền do ứng dụng có khai báo liên quan mới bắt buộc phải được đưa vào danh sách cho phép package="android". ro.control_privapp_permissions Trạng thái thuộc tính phải tuân thủ Mục 9.1 Quyền trong Tài liệu định nghĩa về khả năng tương thích (CDD).