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

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

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

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

สิทธิ์

การเข้าถึงที่จัดเก็บข้อมูลภายนอกได้รับการคุ้มครองโดยสิทธิ์ Android ต่างๆ เริ่มต้นใน Android 1.0 การเข้าถึงการเขียนได้รับการป้องกันด้วยสิทธิ์ WRITE_EXTERNAL_STORAGE เริ่มต้นใน Android 4.1 การเข้าถึงการอ่านได้รับการป้องกันด้วยสิทธิ์ READ_EXTERNAL_STORAGE

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

เริ่มตั้งแต่ Android 10 แอปที่กำหนดเป้าหมายเป็น Android 9 และค่าเริ่มต้นต่ำกว่าเป็นพื้นที่เก็บข้อมูลแบบเดิม และสามารถ เลือกใช้ พื้นที่เก็บข้อมูลแบบแยกได้ แอปที่กำหนดเป้าหมายเป็น Android 10 และค่าเริ่มต้นเป็นพื้นที่เก็บข้อมูลแบบแยกสามารถ เลือกไม่ใช้ได้ชั่วคราว ใช้แอ็ตทริบิวต์ manifest requestLegacyExternalStorage ซึ่งควบคุมโมเดลหน่วยเก็บข้อมูล เพื่อเปลี่ยนสถานะดีฟอลต์

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

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

สถานะรายการที่อนุญาตพิเศษสามารถระบุได้ในเวลาติดตั้งเท่านั้น และไม่สามารถเปลี่ยนแปลงได้จนกว่าจะติดตั้งแอปแล้ว

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าสิทธิ์ READ_EXTERNAL_STORAGE โปรดดูที่ setWhitelistedRestrictedPermissions() ในคลาส PackageInstaller.SessionParams

Android 13 แนะนำสิทธิ์สื่อแบบละเอียดเพื่อรองรับแอปที่เข้าถึงไฟล์สื่อที่สร้างโดยแอปอื่น แอปต้องขอสิทธิ์สื่อแบบละเอียดอย่างน้อย 1 รายการที่แสดงอยู่ใน สิทธิ์อนุญาตสื่อแบบละเอียด แทนสิทธิ์ READ_EXTERNAL_STORAGE

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

สิทธิ์รันไทม์

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

  • /mnt/runtime/default จะแสดงต่อแอปที่ไม่มีสิทธิ์ในการจัดเก็บข้อมูลพิเศษ และแสดงต่อเนมสเปซรูทที่มี adbd และส่วนประกอบของระบบอื่น ๆ อยู่
  • /mnt/runtime/read จะแสดงต่อแอปที่มี READ_EXTERNAL_STORAGE (ตั้งค่า LEGACY_STORAGE สำหรับ Android 10)
  • /mnt/runtime/write จะแสดงต่อแอปที่มี WRITE_EXTERNAL_STORAGE

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

ฟังก์ชัน setns() ที่ใช้ในการปรับใช้ฟีเจอร์นี้ต้องใช้ Linux 3.8 เป็นอย่างน้อย แต่แพตช์กลับพอร์ตไปยัง Linux 3.4 ได้สำเร็จ สามารถใช้การทดสอบ PermissionsHostTest CTS เพื่อตรวจสอบพฤติกรรมเคอร์เนลที่ถูกต้อง