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

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