สถิติการจัดเก็บที่รวดเร็วยิ่งขึ้น

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

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

เพื่อปรับปรุงประสบการณ์เหล่านี้ Android 8.0 เสนอให้ใช้ประโยชน์จากการสนับสนุน "โควต้า" ของระบบไฟล์ ext4 เพื่อส่งคืนสถิติการใช้งานดิสก์เกือบจะในทันที คุณสมบัติโควต้านี้ยังปรับปรุงเสถียรภาพของระบบด้วยการป้องกันไม่ให้แอปเดียวใช้พื้นที่ดิสก์มากกว่า 90% หรือ 50% ของ inodes

การนำไปปฏิบัติ

คุณลักษณะโควต้าเป็นส่วนหนึ่งของการใช้งานเริ่มต้นของ installd installd จะใช้คุณลักษณะโควต้าโดยอัตโนมัติเมื่อเปิดใช้งานบนระบบไฟล์เฉพาะ ระบบจะดำเนินการคำนวณด้วยตนเองต่อโดยอัตโนมัติและโปร่งใสเมื่อไม่ได้เปิดใช้งานหรือรองรับคุณสมบัติโควต้าบนอุปกรณ์บล็อกที่กำลังวัด

หากต้องการเปิดใช้งานการสนับสนุนโควต้าบนอุปกรณ์บล็อกเฉพาะ:

  1. เปิดใช้งานตัวเลือกเคอร์เนล CONFIG_QUOTA , CONFIG_QFMT_V2 และ CONFIG_QUOTACTL
  2. เพิ่มตัวเลือก quota ให้กับพาร์ติชันข้อมูลผู้ใช้ของคุณในไฟล์ fstab ของคุณ:
    /dev/block/platform/soc/624000.ufshc/by-name/userdata   /data
    ext4    noatime,nosuid,nodev,barrier=1,noauto_da_alloc
    latemount,wait,check,formattable,fileencryption=ice,quota

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

การสนับสนุนโควต้าได้รับการทดสอบบน ext4 และ Linux 3.18 หรือสูงกว่าเท่านั้น หากเปิดใช้งานบนระบบไฟล์อื่นหรือบนเคอร์เนลเวอร์ชันเก่า ผู้ผลิตอุปกรณ์จะต้องรับผิดชอบในการทดสอบและตรวจสอบความถูกต้องทางสถิติ

ไม่จำเป็นต้องมีการสนับสนุนฮาร์ดแวร์พิเศษ

การตรวจสอบ

มีการทดสอบ CTS ภายใต้ StorageHostTest ซึ่งใช้ API สาธารณะเพื่อวัดการใช้งานดิสก์ API เหล่านี้คาดว่าจะส่งคืนค่าที่ถูกต้องโดยไม่คำนึงถึงการเปิดหรือปิดใช้งานการสนับสนุนโควต้า

การดีบัก

แอปทดสอบจะจัดสรรพื้นที่ดิสก์อย่างระมัดระวังโดยใช้ตัวเลขเฉพาะที่ไม่ซ้ำกันสำหรับขนาด เมื่อแก้ไขข้อบกพร่องของการทดสอบเหล่านี้ ให้ใช้สิ่งนี้เพื่อระบุสาเหตุของความคลาดเคลื่อนใดๆ ตัวอย่างเช่น หากการทดสอบล้มเหลวโดยมีขนาดเดลต้า 11MB ให้ตรวจสอบเมธอด Utils.useSpace() เพื่อดูว่าหยดขนาด 11MB ถูกจัดเก็บไว้ใน getExternalCacheDir()

นอกจากนี้ยังมีการทดสอบภายในบางอย่างที่อาจเป็นประโยชน์สำหรับการแก้ไขจุดบกพร่อง แต่อาจจำเป็นต้องปิดใช้การตรวจสอบความปลอดภัยจึงจะผ่าน:

runtest -x frameworks/base/services/tests/servicestests/ \
  src/com/android/server/pm/InstallerTest.java
adb shell /data/nativetest64/installd_utils_test/installd_utils_test
adb shell /data/nativetest64/installd_cache_test/installd_cache_test
adb shell /data/nativetest64/installd_service_test/installd_service_test