พื้นที่เก็บข้อมูลที่กำหนดขอบเขตจะจำกัดการเข้าถึงที่จัดเก็บข้อมูลภายนอกของแอป ใน 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 ได้