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

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