ใน Android 6.0 ขึ้นไป โมเดลสิทธิ์ของแอป Android ได้รับการออกแบบมาเพื่อ ที่เข้าใจได้ มีประโยชน์ และปลอดภัยมากยิ่งขึ้นสำหรับผู้ใช้ โมเดลย้ายตำแหน่ง Android แอปที่ต้องใช้สิทธิ์ที่เป็นอันตราย (โปรดดู สิทธิ์ที่ได้รับผลกระทบ) จาก โมเดลสิทธิ์เวลาติดตั้งเป็นโมเดลสิทธิ์รันไทม์:
- สิทธิ์เมื่อติดตั้ง
(Android 5.1 และต่ำกว่า) ผู้ใช้ให้สิทธิ์ที่อันตรายแก่แอปเมื่อติดตั้งหรืออัปเดตแอป อุปกรณ์ ผู้ผลิตและผู้ให้บริการสามารถติดตั้งแอปที่มีสิทธิ์ล่วงหน้าโดยไม่ต้องแจ้ง ผู้ใช้
- สิทธิ์รันไทม์
(Android 6.0 ถึง 9) ผู้ใช้ให้สิทธิ์ที่เป็นอันตรายแก่แอปเมื่อแอปทำงานอยู่ เมื่อมีการขอสิทธิ์ (เช่น เมื่อแอปเปิดตัวหรือเมื่อผู้ใช้เข้าถึง ) ขึ้นอยู่กับแอป แต่ผู้ใช้ให้สิทธิ์/ปฏิเสธการเข้าถึงแอป กลุ่มสิทธิ์ OEM/ผู้ให้บริการสามารถติดตั้งแอปล่วงหน้าได้ แต่ไม่สามารถให้สิทธิ์ล่วงหน้าเว้นแต่จะเป็น ขั้นตอนข้อยกเว้น (ดูการสร้าง )
(Android 10) ผู้ใช้เห็นความโปร่งใสมากขึ้นและ ควบคุมแอปที่มีสิทธิ์รันไทม์การจดจำกิจกรรม (AR) ผู้ใช้จะได้รับข้อความแจ้งจาก กล่องโต้ตอบสิทธิ์รันไทม์เพื่ออนุญาต อนุญาตขณะใช้งานเสมอ หรือปฏิเสธสิทธิ์ ในการอัปเกรดระบบปฏิบัติการเป็น Android 10 สิทธิ์ที่แอปได้รับจะยังคงอยู่ แต่ผู้ใช้ไปที่การตั้งค่าแล้วเปลี่ยนได้
สิทธิ์รันไทม์ป้องกันไม่ให้แอปเข้าถึงข้อมูลส่วนตัวโดยไม่ได้รับความยินยอมจากผู้ใช้ รวมถึงให้บริบทเพิ่มเติม รวมถึงเข้าถึงประเภทสิทธิ์ที่ แอปกำลังค้นหาหรือได้รับสิทธิ์แล้ว โมเดลรันไทม์สนับสนุนให้นักพัฒนาซอฟต์แวร์ ช่วยให้ผู้ใช้เข้าใจว่าทำไมแอปจึงต้องขอสิทธิ์ที่ขอ และให้ ความโปร่งใส เพื่อให้ผู้ใช้ตัดสินใจได้ดีขึ้นว่าจะอนุญาตหรือไม่อนุญาต
สิทธิ์ที่ได้รับผลกระทบ
Android 6.0 ขึ้นไปต้องการสิทธิ์ที่เป็นอันตรายเพื่อใช้โมเดลสิทธิ์รันไทม์
สิทธิ์ที่อันตรายคือสิทธิ์ที่มีความเสี่ยงสูง (เช่น READ_CALENDAR
) ที่มอบให้
ขอสิทธิ์ในการเข้าถึงข้อมูลส่วนตัวของผู้ใช้ หรือควบคุมอุปกรณ์ ซึ่งอาจส่งผลเสีย
ผลกระทบต่อผู้ใช้ หากต้องการดูรายการสิทธิ์ที่เป็นอันตราย ให้เรียกใช้คำสั่งต่อไปนี้
adb shell pm list permissions -g -d
Android 6.0 ขึ้นไปไม่ได้เปลี่ยนลักษณะการทำงานของ ปกติ
สิทธิ์ สิทธิ์เหล่านี้ทั้งหมดที่ไม่เป็นอันตราย รวมถึงสิทธิ์แบบปกติ
ระบบและลายเซ็น สิทธิ์ปกติคือสิทธิ์ที่มีความเสี่ยงต่ำกว่า (เช่น
SET_WALLPAPER
) ที่ให้สิทธิ์แอปในการขอสิทธิ์เข้าถึงระดับแอปแบบแยกระดับ
ฟีเจอร์ที่มีความเสี่ยงน้อยที่สุดต่อแอปอื่นๆ ระบบ หรือผู้ใช้ เช่นเดียวกับใน Android 5.1 และ
ในรุ่นที่ต่ำกว่า ระบบจะให้สิทธิ์ปกติแก่แอปที่ส่งคำขอที่
ติดตั้งและไม่แจ้งให้ผู้ใช้อนุมัติ ดูรายละเอียดเกี่ยวกับสิทธิ์ได้ที่ <permission>
เอลิเมนต์
ข้อจำกัดแบบเข้มงวดและเบาใน Android 10
นอกจากจะทำให้เกิดอันตรายแล้ว สิทธิ์ยังอาจจำกัดอย่างเข้มงวด หรือซอฟต์จำกัด ไม่ว่าจะเป็นกรณีใดก็ตาม สิทธิ์ที่จำกัดต้องอยู่ในรายการที่อนุญาตด้วย ไม่อยู่ในรายการ ข้อจำกัดแบบเข้มงวดจะมีลักษณะการทำงานต่างจากเวอร์ชันพื้นฐานที่ไม่อยู่ในรายการที่อนุญาต ข้อจำกัด:
- (ข้อจำกัดขั้นสูง) แอปไม่สามารถให้สิทธิ์ที่ไม่ได้ ในรายการที่อนุญาต
- (ข้อจำกัดชั่วคราว) แอปที่ไม่ได้อยู่ในรายการที่อนุญาตจะทำงานตาม สิทธิ์ที่เจาะจงที่ผู้ใช้ขอ พฤติกรรมมีการอธิบายไว้ต่อสาธารณะ สำหรับสิทธิ์ที่ขอ
เมื่อติดตั้งแอป โปรแกรมติดตั้ง (เช่น Google Play Store) อาจเลือก เพื่อไม่อนุญาตสิทธิ์ที่จำกัดสำหรับแอปนั้น สิทธิ์คือ ถูกจำกัดโดยแพลตฟอร์มและให้สิทธิ์ได้ต่อเมื่อแอปเป็นไปตามเกณฑ์พิเศษ ตามนโยบายแพลตฟอร์ม ตัวอย่างประเภทสิทธิ์ที่จำกัดแบบเข้มงวด ได้แก่ SMS และประวัติการโทร
การอนุญาตจะเกิดขึ้นระหว่างการติดตั้ง และ
- มีการติดตั้งแอปอยู่แล้วระหว่างการอัปเกรด Android 9-10
- ได้รับสิทธิ์ล่วงหน้าหรือมีการติดตั้งแอปไว้ล่วงหน้า
- ต้องมีสิทธิ์สำหรับบทบาทที่กำหนดไว้แล้วในรายการที่อนุญาต สิทธิ์
- โปรแกรมติดตั้ง (เช่น Google Play Store) จะทำเครื่องหมายสิทธิ์ว่า ในรายการที่อนุญาต
ซึ่งผู้ใช้ไม่สามารถเพิ่มในรายการที่อนุญาตด้วยตนเองได้
ข้อกำหนด
โมเดลสิทธิ์รันไทม์จะใช้กับแอปทั้งหมด รวมถึงแอปที่ติดตั้งล่วงหน้าและแอปที่ติดตั้งล่วงหน้าด้วย ไปยังอุปกรณ์โดยเป็นส่วนหนึ่งของขั้นตอนการตั้งค่า ข้อกำหนดของซอฟต์แวร์ของแอปมีดังนี้
- โมเดลสิทธิ์รันไทม์ต้องสอดคล้องกันในอุปกรณ์ทั้งหมดที่ใช้ Android 6.0 และสูงกว่า ซึ่งบังคับใช้โดยการทดสอบชุดทดสอบความเข้ากันได้ของ Android (CTS)
- แอปต้องแจ้งให้ผู้ใช้ให้สิทธิ์แอปในระหว่างรันไทม์ โปรดดูรายละเอียดที่หัวข้ออัปเดต
แอป อาจมีการให้ข้อยกเว้นแบบจำกัดแก่แอปและตัวแฮนเดิลเริ่มต้น
ที่มีฟังก์ชันการทำงานพื้นฐานของอุปกรณ์ตามการทำงานที่คาดไว้ของอุปกรณ์
(ตัวอย่างเช่น แอปโทรศัพท์เริ่มต้นของอุปกรณ์สำหรับการจัดการ
ACTION_CALL
อาจมี สิทธิ์เข้าถึงโทรศัพท์) โปรดดูรายละเอียดที่การสร้างข้อยกเว้น - แอปที่โหลดไว้ล่วงหน้าซึ่งมีสิทธิ์ที่เป็นอันตราย ต้องกำหนดเป้าหมายเป็น API ระดับ 23 และคงโมเดลสิทธิ์รันไทม์ไว้ กล่าวคือ ขั้นตอนการทำงานของ UI ในระหว่างการติดตั้งแอปต้องไม่เบี่ยงเบนไปจากการติดตั้งใช้งาน AOSP PermissionController ช่วยให้ผู้ใช้เพิกถอนสิทธิ์ที่เป็นอันตรายของแอปที่ติดตั้งล่วงหน้าได้ เป็นต้น เปิดอยู่
- แอปแบบไม่มีส่วนหัวต้องใช้กิจกรรมเพื่อขอสิทธิ์หรือแชร์ UID กับแอปอื่นที่มีสิทธิ์ที่จำเป็น โปรดดูรายละเอียดที่หัวข้อแอปแบบไม่มีส่วนหัว
การย้ายข้อมูลสิทธิ์
สิทธิ์ที่ให้กับแอปใน Android 5.x จะยังคงได้รับสิทธิ์หลังจากอัปเดตเป็น Android 6.0 หรือสูงกว่า แต่ผู้ใช้สามารถเพิกถอนสิทธิ์เหล่านั้นได้ทุกเมื่อ
ในการอัปเดต Android 9 ถึง 10 สิทธิ์ที่จำกัดแบบเข้มงวดทั้งหมดจะได้รับ ในรายการที่อนุญาต โปรดดูรายละเอียดเกี่ยวกับการใช้สิทธิ์การแยกเบื้องหน้า/พื้นหลังได้ที่การเปลี่ยนแปลงความเป็นส่วนตัวของ Android 10 ซึ่งขึ้นต้นด้วยขอพื้นหลัง สถานที่ตั้ง
การรวมระบบ
เมื่อผสานรวมโมเดลสิทธิ์รันไทม์ของแอปสำหรับ Android 6.0 ขึ้นไป คุณต้อง
โปรดอัปเดตแอปที่ติดตั้งล่วงหน้าให้ใช้งานกับโมเดลใหม่ได้ คุณยังกำหนดข้อยกเว้นสำหรับแอปต่างๆ ได้ด้วย
ที่เป็นตัวแฮนเดิล/ผู้ให้บริการเริ่มต้นสำหรับฟังก์ชันหลัก กำหนดสิทธิ์ที่กำหนดเอง
ปรับแต่งธีมที่ใช้ในแอป PermissionController
อัปเดตแอป
แอปในอิมเมจของระบบและแอปที่ติดตั้งล่วงหน้าไม่ได้ได้รับอนุญาตล่วงหน้าโดยอัตโนมัติ สิทธิ์ เราขอแนะนำให้คุณทำงานร่วมกับนักพัฒนาแอปที่ติดตั้งไว้ล่วงหน้า (OEM, ผู้ให้บริการ และบุคคลที่สาม ฝ่าย) เพื่อทำการแก้ไขแอปที่จำเป็นโดยใช้นักพัฒนาซอฟต์แวร์ หลักเกณฑ์ โดยเฉพาะอย่างยิ่ง คุณต้องตรวจสอบว่ามีการแก้ไขแอปที่ติดตั้งล่วงหน้าเพื่อหลีกเลี่ยง การขัดข้องและปัญหาอื่นๆ เมื่อผู้ใช้เพิกถอนสิทธิ์
แอปที่โหลดไว้ล่วงหน้า
ใน Android 9 และต่ำกว่า แอปที่โหลดไว้ล่วงหน้าซึ่งใช้สิทธิ์ที่เป็นอันตรายจะต้องกำหนดเป้าหมายเป็น API ระดับ 23
หรือสูงกว่า และคงใช้งานโมเดลสิทธิ์ AOSP เวอร์ชัน Android 6.0 ขึ้นไป ตัวอย่างเช่น ขั้นตอนการทำงานของ UI
ในระหว่างการติดตั้งแอป ต้องไม่เบี่ยงเบนไปจากการติดตั้งใช้งาน AOSP
PermissionController
ผู้ใช้ยังสามารถเพิกถอนสิทธิ์ที่เป็นอันตรายของ
แอปที่ติดตั้งไว้ล่วงหน้า
ใน Android 6.0 ถึง 9 ระบบจะให้สิทธิ์บางรายการในระหว่างขั้นตอนการติดตั้ง อย่างไรก็ตาม การเริ่มต้น
ใน 10 ขั้นตอนการติดตั้ง (ดำเนินการโดยแอป Package
Installer
) เป็นฟังก์ชันแยกต่างหากจากการให้สิทธิ์ (ใน
Permission Controller
)
แอปแบบไม่มีส่วนหัว
เฉพาะกิจกรรมเท่านั้นที่ขอสิทธิ์ได้ บริการต่างๆ จะขอสิทธิ์โดยตรงไม่ได้
- ใน Android 5.1 และเวอร์ชันก่อนหน้า แอปแบบไม่มีส่วนหัวจะขอสิทธิ์ได้ในกรณีต่อไปนี้ หรือมีการติดตั้งล่วงหน้าโดยไม่ต้องใช้กิจกรรมใดๆ
- ใน Android 6.0 ขึ้นไป แอปแบบไม่มีส่วนหัวต้องใช้วิธีการใดวิธีการหนึ่งต่อไปนี้เพื่อ ขอสิทธิ์:
- เพิ่มกิจกรรมเพื่อขอสิทธิ์ (นี่เป็นวิธีที่แนะนำ)
- แชร์ UID กับแอปอื่นที่มีสิทธิ์ที่จำเป็น ใช้ร่างคำตอบนี้ เมื่อต้องการให้แพลตฟอร์มจัดการ APK หลายรายการในครั้งเดียว แอป
ทั้งนี้เพื่อหลีกเลี่ยงความสับสนของผู้ใช้กับคำขอสิทธิ์ที่ปรากฏโดยไม่มีบริบท
ปรับแต่ง UI ของ PackageInstaller
หากต้องการ คุณสามารถปรับแต่งธีม UI ของสิทธิ์ได้โดย
กำลังอัปเดตธีมเริ่มต้นของอุปกรณ์ (Theme.DeviceDefault.Settings
และ Theme.DeviceDefault.Light.Dialog.NoActionBar
) ใช้โดย
PackageInstaller แต่เนื่องจากความสม่ำเสมอเป็นสิ่งสำคัญสำหรับนักพัฒนาแอป
คุณไม่สามารถปรับแต่งตำแหน่ง ตำแหน่ง และกฎในการกำหนดสิทธิ์
UI ปรากฏขึ้น
หากต้องการใส่สตริงสำหรับภาษาอื่นๆ ร่วมให้คำบรรยาย กับ AOSP
สร้างข้อยกเว้น
คุณสามารถให้สิทธิ์ล่วงหน้ากับแอปที่เป็นเครื่องจัดการเริ่มต้น หรือ
ผู้ให้บริการฟังก์ชันหลักของระบบปฏิบัติการที่ใช้
DefaultPermissionGrantPolicy.java
ใน PackageManager ตัวอย่าง
ACTION_CALL (Dialer) Default Phone, Contacts, SMS, Microphone
SMS_DELIVER_ACTION (SMS/MMS) Default Phone, Contacts, SMS
กำหนดสิทธิ์ที่กำหนดเอง
คุณสามารถกำหนดสิทธิ์ที่กำหนดเองและกลุ่มให้เป็นแบบปกติ หรือ อันตรายและเพิ่มสิทธิ์เฉพาะ OEM/ผู้ให้บริการลงใน เช่นเดียวกับใน Android 5.x และรุ่นก่อนหน้า
ใน Android 6.0 ขึ้นไป หากคุณเพิ่มสิทธิ์ใหม่ที่เป็นอันตราย จะต้องจัดการใน ในลักษณะเดียวกับสิทธิ์ที่เป็นอันตรายอื่นๆ (ขอระหว่างรันไทม์ของแอปและ ผู้ใช้สามารถเพิกถอนได้) ดังนี้
- คุณสามารถเพิ่มสิทธิ์ใหม่ให้กับกลุ่มปัจจุบันได้ แต่ไม่สามารถแก้ไข การแมป AOSP ของสิทธิ์ที่เป็นอันตรายและกลุ่มสิทธิ์ที่เป็นอันตราย (กล่าวคือ คุณ นำสิทธิ์ออกจากกลุ่มแล้วมอบหมายให้กับกลุ่มอื่นไม่ได้)
- คุณจะเพิ่มกลุ่มสิทธิ์ใหม่ในแอปที่ติดตั้งในอุปกรณ์ได้ แต่จะเพิ่มกลุ่มสิทธิ์ใหม่ในไฟล์ Manifest ของแพลตฟอร์มไม่ได้
ทดสอบสิทธิ์
Android มีการทดสอบ ความเข้ากันได้ Test Suite (CTS) ที่ยืนยันว่า ระบบจะจับคู่สิทธิ์แต่ละรายการกับกลุ่มที่ถูกต้อง การผ่านการทดสอบเหล่านี้คือ ข้อกำหนดสำหรับความเข้ากันได้กับ CTS บน Android 6.0 ขึ้นไป
เพิกถอนสิทธิ์
ใน Android 13 ขึ้นไป คุณสามารถเพิกถอนสิทธิ์
สิทธิ์รันไทม์โดยใช้
Context.revokeSelfPermissionsOnKill()
การเพิกถอนจะเกิดขึ้นแบบไม่พร้อมกันและทริกเกอร์เมื่อดำเนินการได้อย่างปลอดภัยโดยไม่รบกวนการทำงาน
ผู้ใช้รายนั้น เมื่อมีการทริกเกอร์การเพิกถอน กระบวนการทั้งหมดที่ทำงานอยู่ใน UID การเรียกใช้จะหยุดทำงาน
โปรดทราบว่าการเพิกถอนสิทธิ์เดียวอาจไม่ปรากฏใน
UI การตั้งค่า ซึ่งจัดการสิทธิ์ตามกลุ่ม โดยทั่วไป กลุ่มสิทธิ์จะแสดงเป็น
จะได้รับตราบเท่าที่มีสิทธิ์อย่างน้อย 1 รายการในกลุ่มนั้น หากดูแลให้ผู้ใช้
คุณสามารถยืนยันการเพิกถอนได้ในการตั้งค่า
ซึ่งสำคัญกับคุณ ตรวจสอบให้แน่ใจว่าได้เพิกถอนทุก
ในกลุ่มสิทธิ์ หากต้องการเรียนรู้เกี่ยวกับสิทธิ์ที่อยู่ในกลุ่ม คุณอาจ
ใช้ PackageManager.getGroupOfPlatformPermission
และ PackageManager.getPlatformPermissionsForGroup
เมื่อระบบเพิกถอนสิทธิ์ที่ขอ ระบบจะเพิกถอนสิทธิ์ในเบื้องหลังที่เกี่ยวข้องด้วย หากยังคงไม่มีสิทธิ์ในเบื้องหน้าที่เกี่ยวข้อง
การเพิกถอนจะไม่เกิดขึ้นตราบใดที่กระบวนการยังคงอยู่ในเบื้องหน้า แต่สามารถ
จะทริกเกอร์ทันทีด้วยการยกเลิกกระบวนการทั้งหมดที่ทำงานอยู่ใน UID ปัจจุบันด้วยตัวเอง
โดยใช้ System.exit()
แต่เราขอแนะนำให้ปล่อยให้ระบบเลือกเวลาที่จะทริกเกอร์
หลังจากการเพิกถอนสิทธิ์มีผลแล้ว คุณจะส่งคำขอได้อีกครั้ง และผู้ใช้ ที่มีข้อความแจ้งให้อนุญาตหรือปฏิเสธคำขอ ไม่สามารถขอการอนุญาต เคยถูกปฏิเสธโดยผู้ใช้ ในขณะที่คุณจะได้รับการสนับสนุนให้เพิกถอนการอนุญาตที่คุณ ถูกระงับอยู่ แต่ไม่จำเป็นอีกต่อไป คุณควรระมัดระวังไม่แจ้งให้ผู้ใช้ทราบเกี่ยวกับ การเพิกถอนจนกว่าจะมีผลบังคับใช้