Depolama

Android harici depolama HAL simgesi

Android, çok çeşitli depolama cihazı türlerini ve özelliklerini destekleyecek şekilde zaman içinde gelişti. Android'in tüm sürümleri, taşınabilir ve taklit depolamayı da içeren geleneksel depolamaya sahip cihazları destekler. Taşınabilir depolama, geçici veri aktarımı/dosya depolaması için SD kart veya USB gibi fiziksel ortamlarla sağlanabilir. Fiziksel medya uzun süre cihazda kalabilir ancak cihaza bağlı değildir ve çıkarılabilir. SD kartlar, Android 1.0'dan beri taşınabilir depolama olarak mevcuttur; Android 6.0 USB desteği ekledi. Öykünülmüş depolama, dahili depolamanın bir kısmının bir öykünme katmanı yoluyla açığa çıkarılmasıyla sağlanır ve Android 3.0'dan beri mevcuttur.

Android 6.0'dan itibaren Android, SD kart veya USB gibi fiziksel medya tarafından sağlanan, şifrelenmiş ve dahili depolama gibi davranacak şekilde biçimlendirilmiş uyarlanabilir depolamayı destekler. Kabul edilebilir depolama her türlü uygulama verisini depolayabilir.

İzinler

Harici depolamaya erişim çeşitli Android izinleriyle korunmaktadır. Android 1.0'dan itibaren yazma erişimi WRITE_EXTERNAL_STORAGE izniyle korunmaktadır. Android 4.1'den itibaren okuma erişimi READ_EXTERNAL_STORAGE izniyle korunmaktadır.

Android 4.4'ten başlayarak, harici depolama aygıtlarındaki dosyaların sahibi, grubu ve modları artık dizin yapısına göre sentezleniyor. Bu, uygulamaların geniş WRITE_EXTERNAL_STORAGE iznine sahip olmalarına gerek kalmadan harici depolamadaki pakete özel dizinlerini yönetmelerine olanak tanır. Örneğin, com.example.foo paket adına sahip uygulama artık Android/data/com.example.foo/ dosyasına harici depolama aygıtlarında herhangi bir izin olmadan serbestçe erişebilir. Bu sentezlenmiş izinler, ham depolama aygıtlarının bir FUSE arka plan programına sarılmasıyla gerçekleştirilir.

Android 10'dan başlayarak, Android 9'u hedefleyen ve varsayılanı eski depolamaya düşüren uygulamalar, yalıtılmış depolamayı tercih edebilir. Android 10'u hedefleyen ve varsayılan olarak yalıtılmış depolamayı hedefleyen uygulamalar , geçici olarak bu seçeneğin dışında kalabilir. Varsayılan durumu değiştirmek için depolama modelini kontrol eden requestLegacyExternalStorage bildirim özniteliğini kullanın.

Hem READ_EXTERNAL_STORAGE hem de WRITE_EXTERNAL_STORAGE izinleri yazılımla kısıtlı olduğundan, yükleyici uygulamayı beyaz listeye almamışsa izin, SD karta erişim olmaksızın yalnızca işitsel ve görsel koleksiyonlara erişimi kontrol eder. Bu, uygulama eski depolamayı talep etse bile geçerlidir. Hem katı kısıtlamalar hem de yazılım kısıtlamaları hakkında daha fazla bilgi için bkz. Android 10'daki sert ve yazılım kısıtlamaları .

Yükleyici izni beyaz listeye aldıysa eski modda çalışan bir uygulama, yalıtılmamış izin davranışını alır. İzin, SD kart erişimini ve işitsel ve görsel koleksiyonları kontrol eder. Bu durum, uygulamanın Android 9 veya daha düşük bir sürümü hedefleyip yalıtılmış depolamayı etkinleştirmemesi veya Android 10'u hedefleyip kapsam dışında kalması durumunda meydana gelir.

Beyaz liste durumu yalnızca yükleme sırasında belirtilebilir ve uygulama yüklenene kadar değiştirilemez.

READ_EXTERNAL_STORAGE iznini ayarlama hakkında daha fazla bilgi için, PackageInstaller.SessionParams sınıfındaki setWhitelistedRestrictedPermissions() bakın.

Android 13, diğer uygulamalar tarafından oluşturulan medya dosyalarına erişen uygulamaları desteklemek için ayrıntılı medya izinleri sunar. Uygulamalar, READ_EXTERNAL_STORAGE izni yerine Ayrıntılı medya izinleri bölümünde listelenen ayrıntılı medya izinlerinden bir veya daha fazlasını talep etmelidir.

Android 14, uygulamalar medya izinleri istediğinde kullanıcıların görsel medya kitaplıklarına kısmi erişim vermesine olanak tanıyan ayrıntılı medya izinlerini temel alır. Daha fazla bilgi için Fotoğraflara ve videolara kısmi erişim verme konusuna bakın.

Çalışma zamanı izinleri

Android 6.0, uygulamaların çalışma zamanında ihtiyaç duyulduğunda yetenek talep ettiği yeni bir çalışma zamanı izinleri modeli sunuyor. Yeni model READ/WRITE_EXTERNAL_STORAGE izinlerini içerdiğinden platformun, halihazırda çalışan uygulamaları sonlandırmadan veya yeniden başlatmadan dinamik olarak depolama erişimi vermesi gerekiyor. Bunu, takılı tüm depolama aygıtlarının üç farklı görünümünü koruyarak yapar:

  • /mnt/runtime/default özel depolama izinleri olmayan uygulamalara ve adbd ile diğer sistem bileşenlerinin bulunduğu kök ad alanına gösterilir.
  • /mnt/runtime/read READ_EXTERNAL_STORAGE özelliğine sahip uygulamalara gösterilir (Android 10 için LEGACY_STORAGE ayarlayın)
  • /mnt/runtime/write WRITE_EXTERNAL_STORAGE özelliğine sahip uygulamalara gösterilir

Zygote fork zamanında, çalışan her uygulama için bir bağlama ad alanı oluştururuz ve uygun ilk görünümü yerine bağlarız. Daha sonra, çalışma zamanı izinleri verildiğinde vold , halihazırda çalışmakta olan uygulamaların bağlama ad alanına atlar ve bağlama, yükseltilmiş görünümü yerine bağlar. İzinlerin düşürülmesinin her zaman uygulamanın sonlandırılmasına neden olduğunu unutmayın.

Bu özelliği uygulamak için kullanılan setns() işlevi en az Linux 3.8 gerektirir, ancak yamalar başarıyla Linux 3.4'e aktarılmıştır. PermissionsHostTest CTS testi, doğru çekirdek davranışını doğrulamak için kullanılabilir.