Penyimpanan

Ikon HAL penyimpanan eksternal Android

Android telah berkembang dari waktu ke waktu untuk mendukung berbagai jenis dan fitur perangkat penyimpanan. Semua versi perangkat dukungan Android dengan penyimpanan tradisional , yang mencakup penyimpanan portabel dan emulasi. Penyimpanan portabel dapat disediakan oleh media fisik, seperti kartu SD atau USB, yaitu untuk transfer data/penyimpanan file sementara. Media fisik mungkin tetap berada di perangkat untuk waktu yang lama, tetapi tidak terikat ke perangkat dan dapat dilepas. Kartu SD telah tersedia sebagai penyimpanan portabel sejak Android 1.0; Android 6.0 menambahkan dukungan USB. Penyimpanan yang diemulasi disediakan dengan memaparkan sebagian dari penyimpanan internal melalui lapisan emulasi dan telah tersedia sejak Android 3.0.

Mulai Android 6.0, Android mendukung penyimpanan yang dapat diadopsi , yang disediakan oleh media fisik, seperti kartu SD atau USB, yang dienkripsi dan diformat untuk berperilaku seperti penyimpanan internal. Penyimpanan yang dapat diadopsi dapat menyimpan semua jenis data aplikasi.

Izin

Akses ke penyimpanan eksternal dilindungi oleh berbagai izin Android. Mulai Android 1.0, akses tulis dilindungi dengan izin WRITE_EXTERNAL_STORAGE . Mulai Android 4.1, akses baca dilindungi dengan izin READ_EXTERNAL_STORAGE .

Mulai Android 4.4, pemilik, grup, dan mode file pada perangkat penyimpanan eksternal kini disintesis berdasarkan struktur direktori. Ini memungkinkan aplikasi untuk mengelola direktori khusus paket mereka di penyimpanan eksternal tanpa mengharuskan mereka memegang izin WRITE_EXTERNAL_STORAGE yang luas. Misalnya, aplikasi dengan nama paket com.example.foo sekarang dapat dengan bebas mengakses Android/data/com.example.foo/ di perangkat penyimpanan eksternal tanpa izin. Izin yang disintesis ini dicapai dengan membungkus perangkat penyimpanan mentah dalam daemon FUSE.

Mulai Android 10, aplikasi yang menargetkan Android 9 dan default yang lebih rendah ke penyimpanan lama, dan dapat memilih untuk menggunakan penyimpanan terisolasi. Aplikasi yang menargetkan Android 10 dan default ke penyimpanan terisolasi dapat menyisih darinya untuk sementara . Gunakan atribut manifes requestLegacyExternalStorage , yang mengontrol model penyimpanan, untuk mengubah status default.

Karena izin READ_EXTERNAL_STORAGE dan WRITE_EXTERNAL_STORAGE dibatasi sementara, jika penginstal tidak memasukkan aplikasi ke daftar putih, izin mengontrol akses ke koleksi aural dan visual saja, tanpa akses ke kartu SD. Ini berlaku bahkan jika aplikasi meminta penyimpanan lama. Untuk informasi selengkapnya tentang pembatasan keras dan pembatasan lunak, lihat Pembatasan keras dan lunak di Android 10 .

Jika penginstal mengizinkan izin, aplikasi yang berjalan dalam mode lama mendapatkan perilaku izin yang tidak terisolasi. Izin mengontrol akses kartu SD, dan koleksi aural dan visual. Ini terjadi saat aplikasi menargetkan Android 9 atau lebih rendah dan tidak memilih untuk menggunakan penyimpanan terisolasi, atau menargetkan Android 10 dan memilih tidak ikut.

Status daftar putih hanya dapat ditentukan pada waktu penginstalan, dan tidak dapat diubah hingga aplikasi diinstal.

Untuk informasi selengkapnya tentang menyetel izin READ_EXTERNAL_STORAGE , lihat setWhitelistedRestrictedPermissions() di kelas PackageInstaller.SessionParams .

Izin waktu proses

Android 6.0 memperkenalkan model izin waktu proses baru di mana aplikasi meminta kemampuan saat dibutuhkan saat waktu proses. Karena model baru menyertakan izin READ/WRITE_EXTERNAL_STORAGE , platform perlu memberikan akses penyimpanan secara dinamis tanpa mematikan atau memulai ulang aplikasi yang sudah berjalan. Ini dilakukan dengan mempertahankan tiga tampilan berbeda dari semua perangkat penyimpanan yang terpasang:

  • /mnt/runtime/default ditampilkan ke aplikasi tanpa izin penyimpanan khusus, dan ke ruang nama root tempat adbd dan komponen sistem lainnya berada.
  • /mnt/runtime/read ditampilkan ke aplikasi dengan READ_EXTERNAL_STORAGE (Setel LEGACY_STORAGE untuk Android 10)
  • /mnt/runtime/write ditampilkan ke aplikasi dengan WRITE_EXTERNAL_STORAGE

Pada waktu fork Zygote, kami membuat mount namespace untuk setiap aplikasi yang berjalan dan mengikat mount tampilan awal yang sesuai ke tempatnya. Kemudian, ketika izin waktu proses diberikan, vold melompat ke mount namespace dari aplikasi yang sudah berjalan dan mengikat mount tampilan yang ditingkatkan ke tempatnya. Perhatikan bahwa penurunan versi izin selalu mengakibatkan aplikasi dimatikan.

setns() yang digunakan untuk mengimplementasikan fitur ini memerlukan setidaknya Linux 3.8, tetapi patch telah berhasil di-backport ke Linux 3.4. Tes CTS PermissionsHostTest dapat digunakan untuk memverifikasi perilaku kernel yang benar.