Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

พื้นที่จัดเก็บแบบดั้งเดิม

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

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

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

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

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

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

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