แอปที่ได้รับสิทธิ์คือแอประบบที่อยู่ในไดเรกทอรี 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 หลายไฟล์ที่อยู่ในไดเรกทอรี /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
ก็ตาม
บังคับใช้รายการที่อนุญาต
หลังจากสร้างรายการที่อนุญาตแล้ว ให้เปิดใช้การบังคับใช้ขณะรันไทม์โดยตั้งค่าพร็อพเพอร์ตี้ build
ro.control_privapp_permissions=enforce
คุณต้องสร้างรายการที่อนุญาตสำหรับสิทธิ์ที่แอปประกาศด้วย
package="android"
เท่านั้น สถานะพร็อพเพอร์ตี้ ro.control_privapp_permissions
ต้องเป็นไปตาม
ส่วนที่ 9.1 สิทธิ์
ในเอกสารคำจำกัดความความเข้ากันได้ (CDD)