พื้นที่จัดเก็บ

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

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

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

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

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

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

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 เพื่อตรวจสอบการทำงานของเคอร์เนลที่ถูกต้อง