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