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