การจัดเก็บแบบดั้งเดิม

ไอคอน HAL ที่จัดเก็บข้อมูลภายนอกของ Android

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

ที่จัดเก็บข้อมูลภายนอกสำหรับผู้ใช้หลายคน

ตั้งแต่ Android 4.2 เป็นต้นไป อุปกรณ์สามารถรองรับผู้ใช้หลายราย และพื้นที่จัดเก็บข้อมูลภายนอกต้องเป็นไปตามข้อจำกัดต่อไปนี้:

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

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

เมื่อบูตระบบ ระบบจะติดตั้ง FUSE daemon ที่จัดเก็บข้อมูลภายนอกที่จำลองเพียงตัวเดียวที่ EMULATED_STORAGE_SOURCE ซึ่งถูกซ่อนจากแอป หลังจาก Zygote forks มันจะผูกเข้ากับไดเร็กทอรีย่อยเฉพาะผู้ใช้ที่เหมาะสมจากภายใต้ FUSE daemon ไปยัง EMULATED_STORAGE_TARGET เพื่อให้เส้นทางที่จัดเก็บข้อมูลภายนอกแก้ไขได้อย่างถูกต้องสำหรับแอป เนื่องจากแอปไม่มีจุดเชื่อมต่อที่สามารถเข้าถึงได้สำหรับพื้นที่จัดเก็บข้อมูลของผู้ใช้รายอื่น พวกเขาจึงสามารถเข้าถึงพื้นที่เก็บข้อมูลสำหรับผู้ใช้ที่เริ่มต้นเท่านั้น

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

อุปกรณ์จัดเก็บข้อมูลภายนอกหลายเครื่อง

เริ่มตั้งแต่ Android 4.4 เป็นต้นไป อุปกรณ์จัดเก็บข้อมูลภายนอกหลายเครื่องจะปรากฏให้นักพัฒนาเห็นผ่าน Context.getExternalFilesDirs() , Context.getExternalCacheDirs() และ Context.getObbDirs()

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

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

รองรับสื่อ USB

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

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