การปล่อยผ่าน FUSE

Android 12 รองรับการแสดงวิดีโอภายนอกของ FUSE ซึ่งช่วยลดค่าใช้จ่ายของ FUSE เพื่อให้ได้ประสิทธิภาพเทียบเท่ากับการเข้าถึงระบบไฟล์ระดับล่างโดยตรง การแสดงวิดีโอภายนอกของ FUSE ได้รับการรองรับในเคอร์เนล android12-5.4, android12-5.10 และ android-mainline (สำหรับการทดสอบเท่านั้น) ซึ่งหมายความว่าการรองรับฟีเจอร์นี้ขึ้นอยู่กับเคอร์เนลที่อุปกรณ์ใช้และเวอร์ชัน Android ที่อุปกรณ์กำลังทำงานอยู่

FUSE กับ SDCardFS

File system in Userspace (FUSE) เป็นกลไกที่ ช่วยให้เคอร์เนล (ไดรเวอร์ FUSE) สามารถเอาต์ซอร์ซการดำเนินการที่ดำเนินการในระบบไฟล์ FUSE ไปยังโปรแกรม Userspace (FUSE Daemon) ซึ่งใช้การ ดำเนินการ Android 11 เลิกใช้งาน SDCardFS และทำให้ FUSE เป็น โซลูชันเริ่มต้นสำหรับการจำลองที่เก็บข้อมูล Android ได้ใช้ FUSE Daemon ของตัวเองเพื่อสกัดกั้นการเข้าถึงไฟล์ บังคับใช้ฟีเจอร์ด้านความปลอดภัยและความเป็นส่วนตัวเพิ่มเติม และจัดการไฟล์ในขณะรันไทม์ ซึ่งเป็นส่วนหนึ่งของการเปลี่ยนแปลงนี้

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

แอปสามารถใช้ การเชื่อมต่อเพื่อ ลดการคัดลอกข้อมูลและใช้ ContentProvider API เพื่อเข้าถึงไฟล์ระบบไฟล์ระดับล่างโดยตรงเพื่อลดการถดถอยเหล่านี้ แม้จะมีการเพิ่มประสิทธิภาพเหล่านี้และ อื่นๆ แต่การดำเนินการอ่าน และเขียนอาจมีแบนด์วิดท์ลดลงเมื่อใช้ FUSE เทียบกับ การเข้าถึงระบบไฟล์ระดับล่างโดยตรง — โดยเฉพาะอย่างยิ่งกับการดำเนินการอ่าน แบบสุ่ม ซึ่งการแคชหรือการอ่านล่วงหน้าช่วยไม่ได้ และแอปที่เข้าถึงที่เก็บข้อมูลโดยตรงผ่านเส้นทาง /sdcard/ แบบเดิมจะยังคงพบประสิทธิภาพที่ลดลงอย่างเห็นได้ชัด โดยเฉพาะอย่างยิ่งเมื่อดำเนินการที่มีการรับส่งข้อมูลจำนวนมาก

คำขอ Userspace ของ SDcardFS

การใช้ SDcardFS จะช่วยเร่งการจำลองที่เก็บข้อมูลและการตรวจสอบสิทธิ์ของ FUSE ได้ด้วยการนำการเรียกพื้นที่ผู้ใช้ออกจากเคอร์เนล คำขอ Userspace จะเป็นไปตามเส้นทาง Userspace → VFS → sdcardfs → VFS → ext4 → แคชหน้าเว็บ/ที่เก็บข้อมูล

FUSE Passthrough SDcardFS

รูปที่ 1 คำขอ Userspace ของ SDcardFS

คำขอ Userspace ของ FUSE

เดิมที FUSE ใช้เพื่อเปิดใช้การจำลองที่เก็บข้อมูลและอนุญาตให้แอปใช้ที่เก็บข้อมูลภายในหรือ sdcard ภายนอกได้อย่างโปร่งใส การใช้ FUSE ทำให้เกิดค่าใช้จ่ายบางอย่างเนื่องจากคำขอ Userspace แต่ละรายการจะเป็นไปตามเส้นทาง Userspace → VFS → ไดรเวอร์ FUSE → FUSE Daemon → VFS → ext4 → แคชหน้าเว็บ/ที่เก็บข้อมูล

การส่งผ่าน FUSE

รูปที่ 2 คำขอ Userspace ของ FUSE

คำขอการแสดงวิดีโอภายนอกของ FUSE

ระบบจะตรวจสอบสิทธิ์การเข้าถึงไฟล์ส่วนใหญ่เมื่อเปิดไฟล์ และจะมีการตรวจสอบสิทธิ์เพิ่มเติมเมื่ออ่านและเขียนไฟล์นั้น ในบางกรณี ระบบจะทราบเมื่อเปิดไฟล์ว่าแอปที่ส่งคำขอมีสิทธิ์เข้าถึงไฟล์ที่ขออย่างเต็มรูปแบบ ดังนั้นระบบจึงไม่จำเป็นต้องส่งต่อคำขออ่านและเขียนจากไดรเวอร์ FUSE ไปยัง FUSE Daemon ต่อไป (เนื่องจากจะเป็นเพียงการย้ายข้อมูลจากที่หนึ่งไปยังอีกที่หนึ่ง)

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

การเปรียบเทียบคำขอ FUSE และคำขอการแสดงวิดีโอภายนอกของ FUSE แสดงไว้ด้านล่าง

การเปรียบเทียบการส่งผ่าน FUSE

รูปที่ 3 คำขอ FUSE เทียบกับคำขอการแสดงวิดีโอภายนอกของ FUSE

เมื่อแอปเข้าถึงระบบไฟล์ FUSE การดำเนินการต่อไปนี้จะเกิดขึ้น

  1. ไดรเวอร์ FUSE จะจัดการและจัดคิวคำขอ จากนั้นนำเสนอคำขอดังกล่าวต่อ FUSE Daemon ที่จัดการระบบไฟล์ FUSE นั้นผ่านอินสแตนซ์การเชื่อมต่อที่เฉพาะเจาะจงในไฟล์ /dev/fuse ซึ่ง FUSE Daemon ถูกบล็อกไม่ให้อ่าน

  2. เมื่อ FUSE Daemon ได้รับคำขอให้เปิดไฟล์ ระบบจะตัดสินใจว่าควรมีการแสดงวิดีโอภายนอกของ FUSE สำหรับไฟล์นั้นหรือไม่ หากมีการแสดงวิดีโอภายนอก Daemon จะดำเนินการดังนี้

    1. แจ้งไดรเวอร์ FUSE เกี่ยวกับคำขอนี้

    2. เปิดใช้การส่งผ่าน FUSE สำหรับไฟล์โดยใช้ FUSE_DEV_IOC_PASSTHROUGH_OPEN ioctl ซึ่งต้องดำเนินการในตัวบอกไฟล์ของ /dev/fuse ที่เปิดอยู่

  3. ioctl จะรับ (เป็นพารามิเตอร์) โครงสร้างข้อมูลที่มีข้อมูลต่อไปนี้

    • ตัวบอกไฟล์ของไฟล์ระบบไฟล์ระดับล่างซึ่งเป็นเป้าหมายของฟีเจอร์การปล่อยผ่านสัญญาณ

    • ตัวระบุที่ไม่ซ้ำกันของคำขอ FUSE ที่กำลังจัดการอยู่ (ต้องเปิดหรือสร้างและเปิด)

    • ช่องเพิ่มเติมที่สามารถปล่อยว่างไว้และมีไว้สำหรับการใช้งานในอนาคต

  4. หาก ioctl สำเร็จ FUSE Daemon จะดำเนินการคำขอเปิดให้เสร็จสมบูรณ์ ไดรเวอร์ FUSE จะจัดการการตอบกลับของ FUSE Daemon และระบบจะเพิ่มการอ้างอิงไปยังไฟล์ระบบไฟล์ระดับล่างลงในไฟล์ FUSE ภายในเคอร์เนล เมื่อแอปขอการดำเนินการอ่าน/เขียนในไฟล์ FUSE ไดรเวอร์ FUSE จะตรวจสอบว่ามีการอ้างอิงไปยังไฟล์ระบบไฟล์ระดับล่างหรือไม่

    • หากมีการอ้างอิง ไดรเวอร์จะสร้างคำขอระบบไฟล์เสมือน (VFS) ใหม่ที่มีพารามิเตอร์เดียวกันซึ่งกำหนดเป้าหมายเป็นไฟล์ระบบไฟล์ระดับล่าง

    • หากไม่มีการอ้างอิง ไดรเวอร์จะส่งต่อคำขอไปยัง FUSE Daemon

การดำเนินการข้างต้นจะเกิดขึ้นสำหรับการอ่าน/เขียนและการอ่านซ้ำ/เขียนซ้ำในไฟล์ทั่วไป และการดำเนินการอ่าน/เขียนในไฟล์ที่แมปหน่วยความจำ การแสดงวิดีโอภายนอกของ FUSE สำหรับไฟล์ที่กำหนดจะคงอยู่จนกว่าจะปิดไฟล์นั้น

ใช้การแสดงวิดีโอภายนอกของ FUSE

หากต้องการเปิดใช้การแสดงวิดีโอภายนอกของ FUSE ในอุปกรณ์ที่ใช้ Android 12 ให้เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ $ANDROID_BUILD_TOP/device/…/device.mk ของอุปกรณ์เป้าหมาย

# Use FUSE passthrough
PRODUCT_PRODUCT_PROPERTIES += \
    persist.sys.fuse.passthrough.enable=true

หากต้องการปิดใช้การแสดงวิดีโอภายนอกของ FUSE ให้ละเว้นการเปลี่ยนแปลงการกำหนดค่าข้างต้นหรือตั้งค่า persist.sys.fuse.passthrough.enable เป็น false หากคุณเคยเปิดใช้การแสดงวิดีโอภายนอกของ FUSE ไว้ก่อนหน้านี้ การปิดใช้จะป้องกันไม่ให้อุปกรณ์ใช้การแสดงวิดีโอภายนอกของ FUSE แต่อุปกรณ์จะยังคงทำงานได้

หากต้องการเปิด/ปิดใช้การแสดงวิดีโอภายนอกของ FUSE โดยไม่ต้องแฟลชอุปกรณ์ ให้เปลี่ยนพร็อพเพอร์ตี้ของระบบโดยใช้คำสั่ง ADB ตัวอย่างแสดงไว้ด้านล่าง

adb root
adb shell setprop persist.sys.fuse.passthrough.enable {true,false}
adb reboot

ดูความช่วยเหลือเพิ่มเติมได้ในการใช้งานอ้างอิง reference implementation

ตรวจสอบการแสดงวิดีโอภายนอกของ FUSE

หากต้องการตรวจสอบว่า MediaProvider ใช้การแสดงวิดีโอภายนอกของ FUSE หรือไม่ ให้ตรวจสอบ logcat เพื่อดูข้อความการแก้ไขข้อบกพร่อง เช่น

adb logcat FuseDaemon:V \*:S
--------- beginning of main
03-02 12:09:57.833  3499  3773 I FuseDaemon: Using FUSE passthrough
03-02 12:09:57.833  3499  3773 I FuseDaemon: Starting fuse...

รายการ FuseDaemon: Using FUSE passthrough ในบันทึกจะช่วยให้มั่นใจว่ามีการใช้การแสดงวิดีโอภายนอกของ FUSE

CTS ของ Android 12 มี CtsStorageTest ซึ่งรวมถึงการทดสอบที่ทริกเกอร์การแสดงวิดีโอภายนอกของ FUSE หากต้องการเรียกใช้การทดสอบด้วยตนเอง ให้ใช้ atest ดังที่แสดงด้านล่าง

atest CtsStorageTest