พื้นที่เก็บข้อมูลที่กำหนดขอบเขตจำกัดการเข้าถึงแอปไปยังที่จัดเก็บข้อมูลภายนอก ใน 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
ฟิวส์และ SDCardFS
การสนับสนุน Android 11 สำหรับ FUSE ไม่เกี่ยวข้องกับ การเลิกใช้งาน SDCardFS แต่ให้ทางเลือกแทน Media Store สำหรับอุปกรณ์ที่เคยใช้ SDCardFS อุปกรณ์:
- เปิดตัวด้วย Android 11 หรือสูงกว่าโดยใช้เคอร์เนล 5.4 หรือสูงกว่า ไม่สามารถใช้ SDCardFS
- การอัปเกรดเป็น Android 11 หรือสูงกว่าสามารถโฮสต์ FUSE ที่ด้านบนของ SDCardFS เพื่อสกัดกั้นการทำงานของไฟล์และบรรลุเป้าหมายความเป็นส่วนตัว
การปรับแต่งประสิทธิภาพของ FUSE
ก่อนหน้านี้ Android รองรับ FUSE ใน Android 7 หรือต่ำกว่า ซึ่งติดตั้งที่จัดเก็บข้อมูลภายนอกเป็น FUSE เนื่องจากปัญหาด้านประสิทธิภาพและการหยุดชะงักในการใช้งาน FUSE นั้น Android 8 จึงแนะนำ SDCardFS 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 และการอ่านและเขียนแบบสุ่มอาจช้ากว่าถึงสองเท่า
การวัดประสิทธิภาพสามารถเปลี่ยนจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งและระหว่างกรณีการใช้งานเฉพาะได้ เนื่องจาก MediaProvider API ให้ประสิทธิภาพที่สม่ำเสมอที่สุด นักพัฒนาแอปที่กังวลเกี่ยวกับประสิทธิภาพจึงควรใช้ MediaProvider API สำหรับแอปของตน
ลดผลกระทบต่อประสิทธิภาพของ FUSE
ผลกระทบต่อประสิทธิภาพของ FUSE นั้นจำกัดเฉพาะผู้ใช้ไฟล์จำนวนมากที่จัดเก็บไว้ในที่จัดเก็บข้อมูล ที่ใช้ร่วมกัน ภายนอกเท่านั้น ที่เก็บ ข้อมูลส่วนตัว ภายนอก (ซึ่งรวมถึงไดเร็กทอรี android/data
และ android/obb
) จะถูกข้ามโดย FUSE ในขณะที่ที่เก็บข้อมูลภายใน (เช่น /data/data
ซึ่งแอปจำนวนมากจัดเก็บข้อมูลเพื่อเข้ารหัสและปลอดภัย) ไม่ได้ติดตั้ง FUSE
แอปที่เป็นผู้ใช้พื้นที่จัดเก็บข้อมูลภายนอกที่ใช้ร่วมกันเพียงเล็กน้อยมักจะโต้ตอบกับชุดไฟล์ที่จำกัด (โดยทั่วไปจะมีไฟล์น้อยกว่า 100 ไฟล์) แอปเหล่านี้ได้รับประโยชน์จากการเพิ่มประสิทธิภาพการดำเนินการอ่านและเขียนทั่วไปที่มีอยู่ และไม่ควรเห็นผลกระทบด้านประสิทธิภาพที่เกี่ยวข้องกับ FUSE ใน Android 11
แอพที่เป็นผู้ใช้พื้นที่จัดเก็บข้อมูลภายนอกที่ใช้ร่วมกันจำนวนมากมักจะดำเนินการกับไฟล์จำนวนมาก เช่น การแสดงรายการหรือลบไดเร็กทอรีที่มีไฟล์ 1,000 ไฟล์ หรือการสร้างหรือลบไดเร็กทอรีที่มีไฟล์นับล้านไฟล์ในระบบไฟล์ การทำงานของไฟล์จำนวนมากอาจได้รับผลกระทบจาก FUSE บน Android 11 แต่หากแอปดังกล่าวมีสิทธิ์ได้รับสิทธิ์
MANAGE_EXTERNAL_STORAGE
แอปเหล่านั้นจะได้รับประโยชน์จากการเพิ่มประสิทธิภาพการทำงานที่รวมอยู่ในการอัปเดตเดือนตุลาคม 2020
เพื่อหลีกเลี่ยงค่าใช้จ่ายด้านประสิทธิภาพ FUSE แอปสามารถจัดเก็บข้อมูลในพื้นที่จัดเก็บข้อมูลส่วนตัวภายนอก หรือใช้ API จำนวนมากในคลาส ContentProvider
เพื่อเลี่ยงผ่าน 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 สอดคล้องกัน ในฐานะตัวจัดการพื้นที่ผู้ใช้สำหรับระบบไฟล์ FUSE นั้น MediaProvider สามารถสกัดกั้นการเรียกเคอร์เนลและรับรองว่าการทำงานของไฟล์นั้นปลอดภัยต่อความเป็นส่วนตัว
ใน Android 11 และสูงกว่า MediaProvider ยังเป็น ส่วนประกอบของระบบโมดูลาร์ (โมดูล Mainline) ที่สามารถอัปเดตนอก Android รุ่นต่างๆ ได้ ซึ่งหมายความว่าปัญหาด้านประสิทธิภาพ ความเป็นส่วนตัว หรือความปลอดภัยที่พบใน MediaProvider สามารถแก้ไขได้และส่งมอบทางอากาศจาก Google Play Store หรือกลไกอื่น ๆ ที่ได้รับจากพันธมิตร ทุกสิ่งที่อยู่ในขอบเขตของสิ่งที่คาดหวังจากตัวจัดการ FUSE ก็สามารถอัปเดตได้เช่นกัน ทำให้สามารถอัปเดตเพื่อแก้ไขการถดถอยและข้อบกพร่องของประสิทธิภาพ FUSE