Storage

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