แอปที่ได้รับสิทธิ์คือแอประบบที่อยู่ในไดเรกทอรี 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)