รายการที่อนุญาตสำหรับสิทธิ์ที่ได้รับสิทธิ์

แอปที่ได้รับสิทธิ์คือแอประบบที่อยู่ในไดเรกทอรี priv-app บน พาร์ติชันอิมเมจของระบบ พาร์ติชันที่ใช้สำหรับรุ่น Android มีดังนี้

  • Android 9 ขึ้นไป: /system, /product, /vendor
  • Android 8.1 และต่ำกว่า: /system

ในอดีตนั้นผู้ผลิตอุปกรณ์แทบไม่มีการควบคุม ลายเซ็น | เป็นสิทธิ์เฉพาะบุคคลให้กับ แอปที่ได้รับสิทธิ์ เริ่มตั้งแต่ Android 8.0 เป็นต้นไป ผู้ผลิตจะให้สิทธิ์ ในไฟล์ XML ของการกำหนดค่าระบบใน ไดเรกทอรี /etc/permissions ใน Android 9 ผู้ติดตั้งใช้งานสามารถ ให้หรือปฏิเสธการให้สิทธิ์ที่เป็นอภิสิทธิ์ทั้งหมดอย่างชัดเจน หากไม่มีการให้สิทธิ์ที่เป็นสิทธิพิเศษ อุปกรณ์ไม่ยอมเปิดเครื่อง

ไฟล์ privapp-permissions.xml ให้สิทธิ์หรือปฏิเสธได้เท่านั้น สิทธิ์สำหรับแอปที่ได้รับสิทธิ์ในพาร์ติชันเดียวกัน ตัวอย่างเช่น หาก แอปในพาร์ติชัน /product ขอสิทธิ์ที่เป็นสิทธิ์เฉพาะบุคคล เฉพาะ privapp-permissions.xml เท่านั้นที่สามารถอนุญาตหรือปฏิเสธคำขอได้ ไฟล์ใน /product

เพิ่มรายการที่อนุญาต

รายการสิทธิ์ที่อนุญาตสำหรับแอปสามารถอยู่ในไฟล์ XML เดียวหรือหลายไฟล์ ไฟล์ XML ที่อยู่ในไดเรกทอรี frameworks/base/etc/permissions:

  • /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 สถานะของพร็อพเพอร์ตี้ต้องเป็นไปตาม ส่วนที่ 9.1 สิทธิ์ ในเอกสารคำจำกัดความความเข้ากันได้ (CDD)