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