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

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
ไอคอน 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 เพื่อโต้ตอบกับไฟล์บนที่เก็บข้อมูลแบบพกพา การเข้าถึงโดยตรงถูกบล็อกอย่างชัดเจนด้วยเหตุผลด้านความเป็นส่วนตัวและความปลอดภัย