สิทธิ์รันไทม์

ใน 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() อย่างไรก็ตาม แนะนำให้ระบบตัดสินใจว่าจะทริกเกอร์เมื่อใด

หลังจากการเพิกถอนการอนุญาตมีผล คุณสามารถขอได้อีกครั้ง และผู้ใช้จะได้รับแจ้งให้อนุญาตหรือปฏิเสธคำขอ ไม่สามารถขอการอนุญาตที่ผู้ใช้เคยปฏิเสธก่อนหน้านี้ได้ แม้ว่าคุณจะได้รับการสนับสนุนให้เพิกถอนสิทธิ์ที่คุณมีอยู่ในปัจจุบันแต่ไม่จำเป็นอีกต่อไปแล้ว คุณควรระมัดระวังที่จะไม่แจ้งให้ผู้ใช้ทราบเกี่ยวกับการเพิกถอนจนกว่าจะมีผลบังคับ