
Android รองรับอุปกรณ์ที่มีพื้นที่เก็บข้อมูลแบบดั้งเดิม ซึ่งกำหนดให้เป็นระบบไฟล์ที่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ที่มีคลาสและโหมดสิทธิ์ POSIX ที่ไม่เปลี่ยนแปลง แนวคิดของพื้นที่เก็บข้อมูลแบบดั้งเดิมจะรวมพื้นที่เก็บข้อมูลที่จำลองและแบบพกพา พื้นที่เก็บข้อมูลแบบพกพาหมายถึงพื้นที่เก็บข้อมูลภายนอกที่ระบบไม่ได้ นำมาใช้ จึงไม่ได้จัดรูปแบบและเข้ารหัสหรือเชื่อมโยงกับอุปกรณ์ใดอุปกรณ์หนึ่ง เนื่องจากพื้นที่เก็บข้อมูลภายนอกแบบดั้งเดิมมีการป้องกันข้อมูลที่จัดเก็บไว้เพียงเล็กน้อย โค้ดของระบบจึงไม่ควรจัดเก็บข้อมูลที่ละเอียดอ่อนไว้ในพื้นที่เก็บข้อมูลภายนอก กล่าวโดยละเอียดคือ ควรจัดเก็บไฟล์การกําหนดค่าและไฟล์บันทึกไว้ในที่จัดเก็บข้อมูลภายในเท่านั้นที่จะสามารถปกป้องไฟล์เหล่านั้นได้อย่างมีประสิทธิภาพ
พื้นที่เก็บข้อมูลภายนอกสำหรับผู้ใช้หลายคน
ตั้งแต่ Android 4.2 เป็นต้นไป อุปกรณ์จะรองรับผู้ใช้หลายคน และพื้นที่เก็บข้อมูลภายนอกต้องเป็นไปตามข้อจำกัดต่อไปนี้
- ผู้ใช้แต่ละรายต้องมีที่จัดเก็บข้อมูลภายนอกหลักแยกต่างหากของตนเอง และจะต้องไม่มีสิทธิ์เข้าถึงที่จัดเก็บข้อมูลภายนอกหลักของผู้ใช้รายอื่น
- เส้นทาง
/sdcard
ต้องนำไปยังพื้นที่เก็บข้อมูลภายนอกหลักที่ถูกต้องสำหรับผู้ใช้ โดยอิงตามผู้ใช้ที่กระบวนการทำงานอยู่ - พื้นที่เก็บข้อมูลสำหรับไฟล์ OBB ขนาดใหญ่ในไดเรกทอรี
Android/obb
อาจแชร์ระหว่างผู้ใช้หลายคนเพื่อเพิ่มประสิทธิภาพ - แอปต้องเขียนไม่ได้ในที่จัดเก็บข้อมูลภายนอกรอง ยกเว้นในไดเรกทอรีเฉพาะแพ็กเกจตามที่สิทธิ์แบบรวมอนุญาต
การใช้งานแพลตฟอร์มเริ่มต้นของฟีเจอร์นี้ใช้ประโยชน์จากเนมสเปซเคอร์เนล Linux เพื่อสร้างตารางการต่อเชื่อมแบบแยกต่างหากสำหรับแต่ละกระบวนการที่แยกจาก Zygote จากนั้นใช้การต่อเชื่อมแบบบอนด์เพื่อมอบพื้นที่เก็บข้อมูลภายนอกหลักที่ถูกต้องสำหรับผู้ใช้แต่ละรายลงในเนมสเปซส่วนตัวนั้น
เมื่อบูต ระบบจะเมานต์ FUSE daemon ของที่จัดเก็บข้อมูลภายนอกแบบจำลองรายการเดียวที่ EMULATED_STORAGE_SOURCE
ซึ่งซ่อนจากแอป หลังจากแยกกระบวนการของ Zygote แล้ว ระบบจะเชื่อมโยงการต่อเชื่อมไดเรกทอรีย่อยเฉพาะผู้ใช้ที่เหมาะสมจากภายใต้ D-Bus ของ FUSE ไปยัง EMULATED_STORAGE_TARGET
เพื่อให้เส้นทางของพื้นที่เก็บข้อมูลภายนอกแก้ไขได้อย่างถูกต้องสำหรับแอป เนื่องจากแอปไม่มีจุดต่อเชื่อมที่เข้าถึงได้สำหรับพื้นที่เก็บข้อมูลของผู้ใช้รายอื่น แอปจึงเข้าถึงได้เฉพาะพื้นที่เก็บข้อมูลของผู้ใช้ที่เริ่มต้นแอป
การใช้งานนี้ยังใช้ฟีเจอร์เคอร์เนลซับต้นไม้ที่แชร์เพื่อนำไปเผยแพร่เหตุการณ์การต่อเชื่อมจากเนมสเปซรูทเริ่มต้นไปยังเนมสเปซแอปด้วย ซึ่งจะช่วยให้ฟีเจอร์ต่างๆ เช่น คอนเทนเนอร์ ASEC และการต่อเชื่อม OBB ทำงานได้อย่างถูกต้องต่อไป โดยระบบจะดำเนินการนี้โดยการต่อเชื่อมรูทไฟล์เป็น "แชร์" แล้วต่อเชื่อมอีกครั้งเป็น "สเลฟ" หลังจากที่สร้างเนมสเปซ Zygote แต่ละรายการแล้ว
อุปกรณ์เก็บข้อมูลภายนอกหลายเครื่อง
ตั้งแต่ Android 4.4 เป็นต้นไป ระบบจะแสดงอุปกรณ์พื้นที่เก็บข้อมูลภายนอกหลายเครื่องแก่นักพัฒนาแอปผ่าน Context.getExternalFilesDirs()
,
Context.getExternalCacheDirs()
และ
Context.getObbDirs()
สิทธิ์ WRITE_EXTERNAL_STORAGE
ต้องให้สิทธิ์การเขียนเข้าถึงพื้นที่เก็บข้อมูลภายนอกหลักในอุปกรณ์เท่านั้น แอปต้องไม่ได้รับอนุญาตให้เขียนไปยังอุปกรณ์จัดเก็บข้อมูลภายนอกรอง ยกเว้นในไดเรกทอรีเฉพาะแพ็กเกจตามที่สิทธิ์ที่สังเคราะห์ไว้อนุญาต การจํากัดการเขียนด้วยวิธีนี้ช่วยให้ระบบล้างไฟล์ได้เมื่อมีการถอนการติดตั้งแอปพลิเคชัน
การรองรับสื่อ USB
Android 6.0 รองรับอุปกรณ์เก็บข้อมูลแบบพกพาที่เชื่อมต่อกับอุปกรณ์เป็นระยะเวลาสั้นๆ เท่านั้น เช่น แฟลชไดรฟ์ USB เมื่อผู้ใช้เสียบอุปกรณ์แบบพกพาเครื่องใหม่ แพลตฟอร์มจะแสดงการแจ้งเตือนเพื่อให้ผู้ใช้คัดลอกหรือจัดการเนื้อหาของอุปกรณ์นั้นได้
ใน Android 6.0 ระบบจะถือว่าอุปกรณ์ที่ไม่ได้นำส่งเป็นแบบพกพา เนื่องจากพื้นที่เก็บข้อมูลแบบพกพาเชื่อมต่อเพียงระยะเวลาสั้นๆ แพลตฟอร์มจึงหลีกเลี่ยงการดำเนินการที่หนักหน่วง เช่น การสแกนสื่อ แอปของบุคคลที่สามต้องผ่านเฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูลเพื่อโต้ตอบกับไฟล์ในพื้นที่เก็บข้อมูลแบบพกพา ระบบจะบล็อกการเข้าถึงโดยตรงอย่างชัดเจนเพื่อเหตุผลด้านความเป็นส่วนตัวและความปลอดภัย