ขอบเขตการจัดเก็บ

พื้นที่เก็บข้อมูลที่มีขอบเขตจำกัดการเข้าถึงแอปไปยังที่จัดเก็บข้อมูลภายนอก ใน Android 11 ขึ้นไป แอปที่กำหนดเป้าหมายเป็น API 30 ขึ้นไปต้องใช้พื้นที่เก็บข้อมูลที่มีขอบเขต ก่อนหน้านี้ใน Android 10 แอปสามารถเลือกไม่ใช้พื้นที่เก็บข้อมูลที่มีขอบเขตได้

ข้อจำกัดการเข้าถึงแอพ

เป้าหมายของพื้นที่จัดเก็บแบบมีขอบเขตคือการปกป้องความเป็นส่วนตัวของข้อมูลแอพและข้อมูลผู้ใช้ ซึ่งรวมถึงการปกป้องข้อมูลผู้ใช้ (เช่น ข้อมูลเมตาของรูปภาพ) การป้องกันไม่ให้แอปแก้ไขหรือลบไฟล์ผู้ใช้โดยไม่ได้รับอนุญาตอย่างชัดแจ้ง และการปกป้องเอกสารสำคัญของผู้ใช้ที่ดาวน์โหลดไปยังดาวน์โหลดหรือโฟลเดอร์อื่นๆ

แอปที่ใช้พื้นที่จัดเก็บแบบมีขอบเขตสามารถมีระดับการเข้าถึงต่อไปนี้ (การเข้าถึงจริงเป็นแบบเฉพาะการใช้งาน)

  • การอ่านและการเขียนการเข้าถึงไฟล์ของตัวเองด้วยไม่มีสิทธิ์
  • อ่านเข้าถึงไฟล์สื่อปพลิเคชันอื่น ๆ ด้วย READ_EXTERNAL_STORAGE ได้รับอนุญาต
  • การเขียนการเข้าถึงไฟล์สื่อปพลิเคชันอื่น ๆ ที่ได้รับอนุญาตเท่านั้นที่มีการยินยอมของผู้ใช้โดยตรง (ยกเว้นได้รับอนุญาตให้แกลลอรี่ของระบบและปพลิเคชันที่มีสิทธิ์สำหรับการเข้าถึงไฟล์ทั้งหมด)
  • ไม่อ่านหรือเขียนเข้าถึงแอปอื่น ๆ แอปภายนอกไดเรกทอรีข้อมูล

การใช้ที่เก็บข้อมูลแบบกำหนดขอบเขตด้วย FUSE

Android 11 หรือสูงกว่าในการสนับสนุนระบบแฟ้ม USERSPACE (FUSE) ซึ่งจะช่วยให้โมดูล MediaProvider ในการตรวจสอบการดำเนินงานไฟล์ในพื้นที่ของผู้ใช้และการเข้าถึงประตูไฟล์ขึ้นอยู่กับนโยบายที่จะช่วยให้การปฏิเสธหรือการเข้าถึงตรวจทาน แอปในพื้นที่จัดเก็บแบบมีขอบเขตที่ใช้ FUSE จะได้รับคุณลักษณะความเป็นส่วนตัวของพื้นที่จัดเก็บแบบมีขอบเขตและความสามารถในการเข้าถึงไฟล์โดยใช้เส้นทางของไฟล์โดยตรง (ทำให้ File APIs ทำงานในแอปได้)

MediaProvider บังคับใช้กฎการจัดเก็บที่มีขอบเขตสำหรับการเข้าถึงไฟล์ แต่ไม่ใช่สำหรับการเข้าถึงเส้นทางไฟล์โดยตรง (เช่น การใช้ File API และ NDK API) เนื่องจากต้องใช้ความพยายามในการสกัดกั้นการเรียกเคอร์เนล ด้วยเหตุนี้ แอปในพื้นที่จัดเก็บที่มีขอบเขตจึงไม่สามารถเข้าถึงไฟล์โดยใช้เส้นทางของไฟล์โดยตรง ข้อจำกัดนี้ส่งผลต่อความสามารถของนักพัฒนาแอปในการปรับตัว เนื่องจากจำเป็นต้องมีการเปลี่ยนแปลงโค้ดจำนวนมากเพื่อเขียนการเข้าถึง File API ใหม่ไปยัง MediaProvider API

FUSE และ SDCardFS

สนับสนุน Android 11 สำหรับ FUSE ไม่เกี่ยวข้องกับ การคัดค้านของ SDCardFS แต่ไม่ให้ทางเลือกในการสื่อสโตร์สำหรับอุปกรณ์ที่ใช้ก่อนหน้านี้ 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 รวมถึงการเพิ่มประสิทธิภาพการปฏิบัติงานสำหรับผู้บริหารของไฟล์และแอพพลิเคที่คล้ายกัน (เช่น backup / restore ป้องกันไวรัส) ที่ถือ 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 กลายเป็นตัวจัดการระบบไฟล์ (ฟิวส์) สำหรับจัดเก็บข้อมูลภายนอกทำให้ระบบไฟล์ที่จัดเก็บข้อมูลภายนอกและ MediaProvider ฐานข้อมูลที่สอดคล้องกัน ในฐานะที่เป็นตัวจัดการพื้นที่ผู้ใช้สำหรับระบบไฟล์ FUSE MediaProvider สามารถสกัดกั้นการเรียกเคอร์เนลและรับรองว่าการทำงานของไฟล์นั้นปลอดภัยต่อความเป็นส่วนตัว

ใน Android 11 และสูงกว่า MediaProvider ยังเป็น ส่วนประกอบของระบบโมดูลาร์ (โมดูล Mainline) ที่สามารถได้รับการปรับปรุงด้านนอกของรุ่น Android ซึ่งหมายความว่าปัญหาด้านประสิทธิภาพ ความเป็นส่วนตัว หรือความปลอดภัยที่พบใน MediaProvider สามารถแก้ไขได้และส่งผ่านทางอากาศจาก Google Play Store หรือกลไกอื่นๆ ที่พาร์ทเนอร์จัดหาให้ สิ่งใดก็ตามที่อยู่ในขอบเขตของสิ่งที่คาดหวังจากตัวจัดการ FUSE ก็สามารถอัปเดตได้เช่นกัน ทำให้การอัปเดตสามารถแก้ไขการถดถอยและจุดบกพร่องของประสิทธิภาพ FUSE