พื้นที่เก็บข้อมูลที่กำหนดขอบเขต

พื้นที่เก็บข้อมูลที่กำหนดขอบเขตจะจำกัดการเข้าถึงที่เก็บข้อมูลภายนอกของแอป ใน Android 11 ขึ้นไป แอปที่กำหนดเป้าหมายเป็น API 30 ขึ้นไปต้องใช้ พื้นที่เก็บข้อมูลที่จำกัดขอบเขต ก่อนหน้านี้ใน Android 10 แอปสามารถเลือกไม่ใช้พื้นที่เก็บข้อมูลที่จำกัดขอบเขตได้

การจำกัดการเข้าถึงแอป

เป้าหมายของพื้นที่เก็บข้อมูลที่จำกัดขอบเขตคือการปกป้องความเป็นส่วนตัวของข้อมูลแอปและผู้ใช้ ซึ่งรวมถึงการปกป้องข้อมูลผู้ใช้ (เช่น ข้อมูลเมตาของรูปภาพ) การป้องกันไม่ให้แอป แก้ไขหรือลบไฟล์ของผู้ใช้โดยไม่ได้รับสิทธิ์อย่างชัดแจ้ง และ การปกป้องเอกสารที่ละเอียดอ่อนของผู้ใช้ที่ดาวน์โหลดไปยังโฟลเดอร์ดาวน์โหลดหรือโฟลเดอร์อื่นๆ

แอปที่ใช้พื้นที่เก็บข้อมูลที่จำกัดขอบเขตจะมีสิทธิ์เข้าถึงในระดับต่อไปนี้ (สิทธิ์เข้าถึงจริง ขึ้นอยู่กับการใช้งาน)

  • สิทธิ์ในการอ่านและเขียนไฟล์ของตนเองโดยไม่ต้องมีสิทธิ์
  • สิทธิ์เข้าถึงอ่านไฟล์สื่อของแอปอื่นๆ ด้วยREAD_EXTERNAL_STORAGE สิทธิ์
  • อนุญาตสิทธิ์เขียนไฟล์สื่อของแอปอื่นเฉพาะในกรณีที่ได้รับความยินยอมโดยตรงจากผู้ใช้ (ยกเว้นสำหรับแกลเลอรีระบบและแอปที่มีสิทธิ์เข้าถึงไฟล์ทั้งหมด )
  • ไม่มีสิทธิ์เข้าถึงแบบอ่านหรือเขียนไปยังไดเรกทอรีข้อมูลแอปภายนอกของแอปอื่นๆ

ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตกับ FUSE

Android 11 ขึ้นไปรองรับระบบไฟล์ใน Userspace (FUSE) ซึ่งช่วยให้โมดูล MediaProvider ตรวจสอบการดำเนินการกับไฟล์ใน พื้นที่ผู้ใช้ และควบคุมการเข้าถึงไฟล์ตามนโยบายเพื่ออนุญาต ปฏิเสธ หรือปกปิดการเข้าถึง แอปในพื้นที่เก็บข้อมูลที่จำกัดขอบเขตซึ่งใช้ FUSE จะได้รับฟีเจอร์ด้านความเป็นส่วนตัวของพื้นที่เก็บข้อมูลที่จำกัดขอบเขตและความสามารถในการเข้าถึงไฟล์โดยใช้เส้นทางไฟล์โดยตรง (ทำให้ File API ทำงานในแอปได้)

Android 10 บังคับใช้กฎพื้นที่เก็บข้อมูลที่จำกัดขอบเขตในการเข้าถึงไฟล์โดย MediaProvider แต่ ไม่ได้บังคับใช้กับการเข้าถึงเส้นทางไฟล์โดยตรง (เช่น การใช้ File API และ NDK API) เนื่องจาก ต้องใช้ความพยายามในการสกัดกั้นการเรียกเคอร์เนล ด้วยเหตุนี้ แอปในที่เก็บข้อมูลที่จำกัดขอบเขตจึงเข้าถึงไฟล์โดยใช้เส้นทางไฟล์โดยตรงไม่ได้ ข้อจำกัดนี้ ส่งผลต่อความสามารถของนักพัฒนาแอปในการปรับตัว เนื่องจากต้องมีการเปลี่ยนแปลงโค้ด จำนวนมากเพื่อเขียนสิทธิ์เข้าถึง File API ใหม่เป็น MediaProvider API

FUSE และ SDCardFS

การรองรับ FUSE ใน Android 11 ไม่เกี่ยวข้องกับการเลิกใช้งาน SDCardFS แต่มีไว้เป็นทางเลือกแทน Media Store สําหรับอุปกรณ์ที่เคยใช้ SDCardFS อุปกรณ์:

  • การเปิดตัวด้วย Android 11 ขึ้นไปที่ใช้เคอร์เนล 5.4 ขึ้นไปจะใช้ SDCardFS ไม่ได้
  • การอัปเกรดเป็น Android 11 ขึ้นไปจะโฮสต์ FUSE บน SDCardFS เพื่อสกัดกั้นการดำเนินการกับไฟล์และบรรลุเป้าหมายด้านความเป็นส่วนตัวได้

การปรับแต่งประสิทธิภาพ FUSE

ก่อนหน้านี้ Android รองรับ FUSE ใน Android 7 หรือต่ำกว่า ซึ่งมีการติดตั้ง พื้นที่เก็บข้อมูลภายนอกเป็น FUSE Android 8 จึงเปิดตัว SDCardFS เนื่องจากปัญหาด้านประสิทธิภาพและปัญหาการหยุดชะงักของ การติดตั้งใช้งาน FUSE ดังกล่าว Android 11 กลับมาให้การรองรับ FUSE อีกครั้งโดยใช้การติดตั้งใช้งาน libfuse ที่ได้รับการปรับปรุงและ ทดสอบมาอย่างดี ซึ่งสามารถปรับแต่งเพื่อแก้ไขปัญหา ด้านประสิทธิภาพใน Android 7 หรือต่ำกว่าได้

การปรับแต่ง FUSE มีการปรับแต่งต่อไปนี้

  • ข้าม FUSE สำหรับไดเรกทอรี Android/data และ Android/obb เพื่อปรับปรุง ประสิทธิภาพสำหรับแอปเกมที่ใช้ไดเรกทอรีเหล่านี้
  • การเพิ่มประสิทธิภาพ (เช่น การปรับอัตราส่วนการอ่านล่วงหน้าและอัตราส่วนของข้อมูลที่ยังไม่ได้เขียนของระบบไฟล์ FUSE ) เพื่อให้การอ่านมีประสิทธิภาพและเล่นสื่อได้อย่างราบรื่น
  • การใช้แคชแบบเขียนกลับของ FUSE
  • แคชสิทธิ์เพื่อลด IPC ไปยังเซิร์ฟเวอร์ระบบ
  • การเพิ่มประสิทธิภาพสำหรับแอปที่มีสิทธิ์เข้าถึงไฟล์ทั้งหมดเพื่อให้การดำเนินการแบบกลุ่มเร็วขึ้น

การปรับแต่งข้างต้นจะช่วยให้ประสิทธิภาพของอุปกรณ์ FUSE และอุปกรณ์ที่ไม่ใช่ FUSE เทียบเท่ากันได้ ตัวอย่างเช่น การทดสอบ Pixel 2 ที่ปรับแต่งแล้วโดยใช้ FUSE และ Pixel 2 โดยใช้ที่เก็บสื่อพบว่ามีประสิทธิภาพการอ่านแบบลำดับที่เทียบเท่ากัน (เช่น การเล่นวิดีโอ) ระหว่างการเข้าถึงเส้นทางไฟล์กับที่เก็บสื่อ อย่างไรก็ตาม การเขียนแบบต่อเนื่อง จะแย่กว่าเล็กน้อยเมื่อใช้ FUSE และการอ่านและการเขียนแบบสุ่มอาจช้ากว่า ถึง 2 เท่า

การวัดประสิทธิภาพอาจแตกต่างกันไปในแต่ละอุปกรณ์และระหว่างกรณีการใช้งานที่เฉพาะเจาะจง เนื่องจาก MediaProvider API ให้ประสิทธิภาพที่สอดคล้องกันมากที่สุด นักพัฒนาแอปที่กังวลเรื่องประสิทธิภาพจึงควรใช้ MediaProvider API สำหรับแอปของตน

ลดผลกระทบต่อประสิทธิภาพของ FUSE

ผลกระทบต่อประสิทธิภาพของ FUSE จะจำกัดเฉพาะผู้ใช้ที่ใช้ไฟล์ที่จัดเก็บไว้ในพื้นที่เก็บข้อมูลที่แชร์ภายนอกเป็นจำนวนมากเท่านั้น FUSE จะข้ามพื้นที่เก็บข้อมูลส่วนตัวภายนอก (ซึ่งรวมถึงไดเรกทอรี android/data และ android/obb) ในขณะที่พื้นที่เก็บข้อมูลภายใน (เช่น /data/data ซึ่งเป็นที่ที่แอปจำนวนมากจัดเก็บข้อมูลเพื่อให้ข้อมูลได้รับการเข้ารหัสและปลอดภัย) จะไม่ได้ติดตั้ง FUSE

  • แอปที่ใช้พื้นที่เก็บข้อมูลภายนอกที่แชร์เล็กน้อยมักจะโต้ตอบกับ ชุดไฟล์ที่จำกัด (โดยปกติแล้วไม่เกิน 100 ไฟล์) แอปเหล่านี้ได้รับประโยชน์จากการเพิ่มประสิทธิภาพที่มีอยู่ของการดำเนินการอ่านและเขียนทั่วไป และไม่ควรเห็นผลกระทบด้านประสิทธิภาพที่เกี่ยวข้องกับ FUSE ใน Android 11

  • แอปที่ใช้พื้นที่เก็บข้อมูลภายนอกที่ใช้ร่วมกันเป็นจำนวนมากมักจะดำเนินการกับไฟล์จำนวนมาก เช่น การแสดงหรือนำไดเรกทอรีที่มีไฟล์ 1,000 รายการออก หรือการสร้างหรือลบไดเรกทอรีที่มีไฟล์ 1 ล้านรายการในระบบไฟล์ การดำเนินการกับไฟล์จำนวนมากอาจได้รับผลกระทบจาก FUSE ใน Android 11 แต่หากแอปดังกล่าวมีสิทธิ์ใช้สิทธิ์ MANAGE_EXTERNAL_STORAGE แอปจะได้รับประโยชน์จากการเพิ่มประสิทธิภาพที่รวมอยู่ในการอัปเดตเดือนตุลาคม 2020

แอปสามารถจัดเก็บข้อมูลไว้ในที่จัดเก็บข้อมูลภายนอกแบบส่วนตัว หรือใช้ API แบบกลุ่มในคลาส ContentProvider เพื่อข้าม FUSE และรับเส้นทางที่เพิ่มประสิทธิภาพ แล้วเพื่อหลีกเลี่ยงค่าใช้จ่ายด้านประสิทธิภาพของ FUSE นอกจากนี้ การอัปเดตเดือนตุลาคม 2020 ของคอมโพเนนต์ระบบ MediaProvider ยังรวมถึงการเพิ่มประสิทธิภาพสำหรับตัวจัดการไฟล์และแอปที่คล้ายกัน (เช่น การสำรอง/กู้คืนข้อมูล โปรแกรมป้องกันไวรัส) ที่มีสิทธิ์ MANAGE_EXTERNAL_STORAGE

ความเป็นส่วนตัวเหนือประสิทธิภาพ

ในอุปกรณ์ที่ได้รับการปรับแต่งสำหรับ FUSE เส้นทางของผู้ใช้ที่สำคัญที่สุดส่วนใหญ่จะ มีประสิทธิภาพเท่ากันระหว่าง Android 10 กับ Android 11 อย่างไรก็ตาม เมื่อทดสอบเกณฑ์เปรียบเทียบในการดำเนินการกับชุดไฟล์ Android 11 อาจมีประสิทธิภาพต่ำกว่า Android 10 สำหรับรูปแบบการเข้าถึงไฟล์ ที่ทำงานได้แย่กว่าใน Android 11 (เช่น การอ่านหรือเขียนแบบสุ่ม) เราขอแนะนำให้ใช้ MediaProvider API เพื่อให้แอปมี โหมดการเข้าถึงที่ไม่ใช่ FUSE ซึ่งเป็นตัวเลือกที่ดีที่สุดและมีประสิทธิภาพอย่างสม่ำเสมอ

การอัปเดต MediaProvider และ FUSE

ลักษณะการทำงานของคอมโพเนนต์ระบบ MediaProvider จะแตกต่างกันไปในแต่ละรุ่นของ Android

  • ใน Android 10 และเวอร์ชันที่ต่ำกว่า SDCardFS เป็นระบบไฟล์และ MediaProvider มีอินเทอร์เฟซสำหรับคอลเล็กชันไฟล์ (เช่น รูปภาพ วิดีโอ ไฟล์เพลง ฯลฯ) เมื่อแอปสร้างไฟล์โดยใช้ File API แอปจะขอให้ MediaProvider สแกนไฟล์และบันทึกลงในฐานข้อมูลได้

  • ใน Android 11 ขึ้นไป ระบบจะเลิกใช้งาน SDCardFS และ MediaProvider จะกลายเป็นตัวแฮนเดิลระบบไฟล์ (สำหรับ FUSE) สำหรับพื้นที่เก็บข้อมูลภายนอก ซึ่งจะทำให้ระบบไฟล์ในพื้นที่เก็บข้อมูลภายนอกและฐานข้อมูล MediaProvider สอดคล้องกัน ในฐานะตัวแฮนเดิล userspace สำหรับระบบไฟล์ FUSE นั้น MediaProvider สามารถสกัดกั้นการเรียกเคอร์เนลและตรวจสอบว่าการดำเนินการกับไฟล์นั้นปลอดภัยต่อความเป็นส่วนตัว

ใน Android 11 ขึ้นไป MediaProvider ยังเป็นคอมโพเนนต์ของระบบโมดูล (โมดูล Mainline) ที่อัปเดตได้นอกเหนือจากการเปิดตัว Android ซึ่งหมายความว่าปัญหาด้านประสิทธิภาพ ความเป็นส่วนตัว หรือความปลอดภัยที่พบใน MediaProvider สามารถแก้ไขและส่งผ่านทางอากาศจาก Google Play Store หรือกลไกอื่นๆ ที่พาร์ทเนอร์จัดหาให้ นอกจากนี้ คุณยังอัปเดตทุกอย่างที่อยู่ในขอบเขตของสิ่งที่คาดหวังจากแฮนเดิล FUSE ได้ด้วย ซึ่งจะช่วยให้อัปเดตเพื่อแก้ไขการถดถอยและข้อบกพร่องด้านประสิทธิภาพของ FUSE ได้