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

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

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

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

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

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

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

Android 11 ขึ้นไปรองรับ Filesystem ใน 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 โดยใช้ Media Store พบประสิทธิภาพการอ่านตามลำดับที่คล้ายกัน (เช่น การเล่นวิดีโอ) ระหว่างการเข้าถึงเส้นทางไฟล์กับ Media Store อย่างไรก็ตาม การเขียนตามลำดับจะมีประสิทธิภาพต่ำกว่าเล็กน้อยเมื่อใช้ FUSE และการอ่านและการเขียนแบบสุ่มอาจช้ากว่าถึง 2 เท่า

การวัดประสิทธิภาพอาจแตกต่างกันไปในแต่ละอุปกรณ์และระหว่าง Use Case ที่เฉพาะเจาะจง เนื่องจาก 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

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

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