พื้นที่เก็บข้อมูลที่กำหนดขอบเขตจะจำกัดการเข้าถึงพื้นที่เก็บข้อมูลภายนอกของแอป ใน Android 11 ขึ้นไป แอปที่กำหนดเป้าหมายเป็น API 30 ขึ้นไปต้องใช้ พื้นที่เก็บข้อมูลที่จำกัดขอบเขต ก่อนหน้านี้ใน Android 10 แอปสามารถเลือกไม่ใช้พื้นที่เก็บข้อมูลที่จำกัดขอบเขตได้
การจำกัดการเข้าถึงแอป
เป้าหมายของพื้นที่เก็บข้อมูลที่กำหนดขอบเขตคือการปกป้องความเป็นส่วนตัวของข้อมูลแอปและข้อมูลผู้ใช้ ซึ่งรวมถึงการปกป้องข้อมูลผู้ใช้ (เช่น ข้อมูลเมตาของรูปภาพ) การป้องกันไม่ให้แอป แก้ไขหรือลบไฟล์ของผู้ใช้โดยไม่ได้รับสิทธิ์อย่างชัดแจ้ง และ การปกป้องเอกสารที่ละเอียดอ่อนของผู้ใช้ที่ดาวน์โหลดไปยังโฟลเดอร์ดาวน์โหลดหรือโฟลเดอร์อื่นๆ
แอปที่ใช้พื้นที่เก็บข้อมูลที่จำกัดขอบเขตจะมีสิทธิ์เข้าถึงในระดับต่อไปนี้ (สิทธิ์เข้าถึงจริง ขึ้นอยู่กับการใช้งาน)
- สิทธิ์ในการอ่านและเขียนไฟล์ของตนเองโดยไม่ต้องมีสิทธิ์
- สิทธิ์เข้าถึงอ่านไฟล์สื่อของแอปอื่นๆ ด้วย
READ_EXTERNAL_STORAGEสิทธิ์ - อนุญาตสิทธิ์เขียนไฟล์สื่อของแอปอื่นเฉพาะในกรณีที่ผู้ใช้ให้ความยินยอมโดยตรง (ยกเว้นสำหรับแกลเลอรีระบบและแอปที่มีสิทธิ์เข้าถึงไฟล์ทั้งหมด )
- ไม่มีสิทธิ์เข้าถึงแบบอ่านหรือเขียนไปยังไดเรกทอรีข้อมูลแอปภายนอกของแอปอื่นๆ
ใช้ที่เก็บข้อมูลที่กำหนดขอบเขตกับ FUSE
Android 11 ขึ้นไปรองรับ Filesystem in Userspace (FUSE) ซึ่งช่วยให้โมดูล MediaProvider ตรวจสอบการดำเนินการกับไฟล์ใน พื้นที่ผู้ใช้ และควบคุมการเข้าถึงไฟล์ตามนโยบายเพื่ออนุญาต ปฏิเสธ หรือปกปิดการเข้าถึง แอปในพื้นที่เก็บข้อมูลที่จำกัดขอบเขตซึ่งใช้ FUSE จะได้รับฟีเจอร์ด้านความเป็นส่วนตัวของพื้นที่เก็บข้อมูลที่จำกัดขอบเขตและความสามารถในการเข้าถึงไฟล์โดยใช้เส้นทางไฟล์โดยตรง (ทำให้ File API ทำงานในแอปได้)
Android 10 บังคับใช้กฎพื้นที่เก็บข้อมูลที่จำกัดขอบเขตในการเข้าถึงไฟล์โดย MediaProvider แต่ ไม่ได้บังคับใช้กับการเข้าถึงเส้นทางไฟล์โดยตรง (เช่น การใช้ File API และ NDK API) เนื่องจาก ต้องใช้ความพยายามในการสกัดกั้นการเรียกเคอร์เนล ด้วยเหตุนี้ แอปใน Scoped Storage จึงเข้าถึงไฟล์โดยใช้เส้นทางไฟล์โดยตรงไม่ได้ ข้อจำกัดนี้ ส่งผลต่อความสามารถของนักพัฒนาแอปในการปรับตัว เนื่องจากต้องมีการเปลี่ยนแปลงโค้ด จำนวนมากเพื่อเขียนสิทธิ์เข้าถึง 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
เพื่อหลีกเลี่ยงค่าใช้จ่ายด้านประสิทธิภาพของ 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 สอดคล้องกัน ในฐานะตัวแฮนเดิล userspace สำหรับระบบไฟล์ FUSE นั้น MediaProvider สามารถสกัดกั้นการเรียกเคอร์เนลและตรวจสอบว่าการดำเนินการกับไฟล์นั้นปลอดภัยต่อความเป็นส่วนตัว
ใน Android 11 ขึ้นไป MediaProvider ยังเป็นคอมโพเนนต์ของระบบโมดูล (โมดูล Mainline) ที่อัปเดตได้นอกเหนือจากการเปิดตัว Android ซึ่งหมายความว่าปัญหาด้านประสิทธิภาพ ความเป็นส่วนตัว หรือความปลอดภัยที่พบใน MediaProvider สามารถแก้ไขและส่งผ่านทางอากาศจาก Google Play Store หรือกลไกอื่นๆ ที่พาร์ทเนอร์จัดหาให้ นอกจากนี้ คุณยังอัปเดตทุกอย่างที่อยู่ในขอบเขตของสิ่งที่คาดหวังจากแฮนเดิล FUSE ได้ด้วย ซึ่งจะช่วยให้อัปเดตเพื่อแก้ไขการถดถอยของประสิทธิภาพและข้อบกพร่องของ FUSE ได้