พื้นที่เก็บข้อมูลแบบเดิม

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

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()

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

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

การรองรับสื่อ USB

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

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