สิทธิ์ขณะรันไทม์

ใน 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() แต่เราขอแนะนำให้ปล่อยให้ระบบเลือกเวลาที่จะทริกเกอร์

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