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