ใน 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 กับแอปพลิเคชันอื่นที่มีสิทธิ์ที่จำเป็น สำหรับรายละเอียด โปรดดูที่ แอปพลิเคชัน Headless
การโยกย้ายสิทธิ์
สิทธิ์ที่มอบให้กับแอปพลิเคชันบน 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 และสูงกว่า แอปพลิเคชัน headless ต้องใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อขอสิทธิ์:
- เพิ่มกิจกรรมเพื่อขอสิทธิ์ (นี่คือวิธีที่แนะนำ)
- แชร์ UID กับแอปพลิเคชันอื่นที่มีสิทธิ์ที่จำเป็น ใช้วิธีนี้เฉพาะเมื่อคุณต้องการแพลตฟอร์มเพื่อจัดการ APK หลายรายการเป็นแอปพลิเคชันเดียว
เป้าหมายคือเพื่อหลีกเลี่ยงไม่ให้ผู้ใช้สับสนกับคำขอสิทธิ์ที่ปรากฏนอกบริบท
การปรับแต่ง PackageInstaller UI
หากต้องการ คุณสามารถปรับแต่ง ธีม Permissions 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 ของสิทธิ์ที่เป็นอันตรายและกลุ่มสิทธิ์ที่เป็นอันตรายได้ (หรืออีกนัยหนึ่ง คุณไม่สามารถลบสิทธิ์ออกจากกลุ่มและมอบหมายให้กับกลุ่มอื่นได้)
- คุณสามารถเพิ่มกลุ่มสิทธิ์ใหม่ในแอปพลิเคชันที่ติดตั้งบนอุปกรณ์ได้ แต่คุณไม่สามารถเพิ่มกลุ่มสิทธิ์ใหม่ในรายการแพลตฟอร์มได้
การทดสอบสิทธิ์
Android มีการทดสอบชุดทดสอบความเข้ากันได้ (CTS) ที่ตรวจสอบว่าสิทธิ์แต่ละรายการถูกแมปกับกลุ่มที่ถูกต้อง การผ่านการทดสอบเหล่านี้เป็นข้อกำหนดสำหรับความเข้ากันได้ของ Android 6.0 และ CTS ที่ใหม่กว่า
การเพิกถอนสิทธิ์
ใน Android 13 ขึ้นไป คุณจะเพิกถอนสิทธิ์รันไทม์ที่ได้รับของคุณเองได้โดยใช้ Context.revokeSelfPermissionsOnKill()
การเพิกถอนเกิดขึ้นแบบอะซิงโครนัสและจะถูกทริกเกอร์เมื่อทำได้อย่างปลอดภัยโดยไม่กระทบต่อผู้ใช้ เมื่อการเพิกถอนถูกทริกเกอร์ กระบวนการทั้งหมดที่ทำงานใน UID ที่เรียกจะถูกหยุดทำงาน
สิ่งสำคัญคือต้องเข้าใจว่าการเพิกถอนการอนุญาตเดียวอาจไม่สะท้อนให้เห็นใน UI การตั้งค่า ซึ่งจะจัดการการอนุญาตตามกลุ่ม โดยทั่วไป กลุ่มสิทธิ์จะแสดงตามที่ได้รับสิทธิ์ตราบใดที่ได้รับสิทธิ์อย่างน้อยหนึ่งรายการในกลุ่มนั้น หากการตรวจสอบให้แน่ใจว่าผู้ใช้สามารถยืนยันการเพิกถอนในการตั้งค่าเป็นสิ่งสำคัญสำหรับคุณ ตรวจสอบให้แน่ใจว่าได้เพิกถอนการอนุญาตทั้งหมดในกลุ่มการอนุญาต หากต้องการทราบว่าสิทธิ์ใดเป็นของกลุ่มใดกลุ่มหนึ่ง คุณอาจใช้ PackageManager.getGroupOfPlatformPermission
และ PackageManager.getPlatformPermissionsForGroup
เมื่อระบบเพิกถอนสิทธิ์ที่ร้องขอ ระบบจะเพิกถอนสิทธิ์ในพื้นหลังที่เกี่ยวข้องด้วย หากยังคงไม่ได้รับสิทธิ์ในเบื้องหน้าที่เกี่ยวข้อง
การเพิกถอนจะไม่ถูกทริกเกอร์ตราบใดที่กระบวนการยังคงอยู่ในเบื้องหน้า แต่ยังสามารถถูกทริกเกอร์ได้ทันทีด้วยการฆ่ากระบวนการทั้งหมดที่ทำงานอยู่ใน uid ปัจจุบันด้วยตนเอง เช่น การใช้ System.exit()
อย่างไรก็ตาม แนะนำให้ระบบตัดสินใจว่าจะทริกเกอร์เมื่อใด
หลังจากการเพิกถอนการอนุญาตมีผล คุณสามารถขอได้อีกครั้ง และผู้ใช้จะได้รับแจ้งให้อนุญาตหรือปฏิเสธคำขอ ไม่สามารถขอการอนุญาตที่ผู้ใช้เคยปฏิเสธก่อนหน้านี้ได้ แม้ว่าคุณจะได้รับการสนับสนุนให้เพิกถอนสิทธิ์ที่คุณมีอยู่ในปัจจุบันแต่ไม่จำเป็นอีกต่อไปแล้ว คุณควรระมัดระวังที่จะไม่แจ้งให้ผู้ใช้ทราบเกี่ยวกับการเพิกถอนจนกว่าจะมีผลบังคับ