Storage

Android harici depolama HAL simgesi

Android, zaman içinde çok çeşitli depolama cihazı türlerini ve özelliklerini destekleyecek şekilde gelişti. Android'in tüm sürümleri, taşınabilir ve taklit depolama alanı da dahil olmak üzere geleneksel depolama alanı bulunan cihazları destekler. Taşınabilir depolama alanı, SD kart veya USB gibi fiziksel medyalar tarafından sağlanabilir. Bu medyalar geçici veri aktarımı/dosya depolama için kullanılır. Fiziksel medya uzun süre cihazda kalabilir ancak cihaza bağlı değildir ve kaldırılabilir. SD kartlar, Android 1.0'dan beri taşınabilir depolama birimi olarak kullanılabilir. Android 6.0'ta USB desteği eklendi. Yapay zekayla taklit edilerek oluşturulan depolama alanı, dahili depolama alanının bir kısmının bir emülasyon katmanı aracılığıyla gösterilmesiyle sağlanır ve Android 3.0'tan beri kullanılabilir.

Android 6.0'dan itibaren Android, SD kart veya USB gibi fiziksel medya tarafından sağlanan, şifrelenmiş ve dahili depolama alanı gibi davranacak şekilde biçimlendirilmiş uygulanabilir depolama alanını destekler. Uyarlanabilir depolama alanında her tür uygulama verisi saklanabilir.

İzinler

Harici depolama alanına erişim, çeşitli Android izinleriyle korunur. Android 1.0'dan itibaren yazma erişimi WRITE_EXTERNAL_STORAGE izniyle korunur. Android 4.1'den itibaren okuma erişimi READ_EXTERNAL_STORAGE izniyle korunur.

Android 4.4'ten itibaren, harici depolama cihazlarındaki dosyaların sahibi, grubu ve modları dizin yapısına göre birleştirilir. Bu sayede uygulamalar, geniş kapsamlı WRITE_EXTERNAL_STORAGE iznine sahip olmak zorunda kalmadan harici depolama alanında pakete özgü dizinlerini yönetebilir. Örneğin, com.example.foo paket adına sahip uygulama artık harici depolama cihazlarında Android/data/com.example.foo/'e izinsiz olarak erişebilir. Bu sentezlenmiş izinler, ham depolama cihazları bir FUSE daemon'una sarmalanarak elde edilir.

Android 10'dan itibaren, Android 9 ve önceki sürümleri hedefleyen uygulamalar varsayılan olarak eski depolama alanını kullanır ve izole depolama alanını etkinleştirebilir. Android 10'u hedefleyen ve varsayılan olarak ayrılmış depolama alanını kullanan uygulamalar bu özelliği geçici olarak devre dışı bırakabilir. Varsayılan durumu değiştirmek için depolama modelini kontrol eden manifest requestLegacyExternalStorage özelliğini kullanın.

Hem READ_EXTERNAL_STORAGE hem de WRITE_EXTERNAL_STORAGE izinleri yumuşak olarak kısıtlandığından, yükleyici uygulamayı beyaz listeye eklemediyse izin yalnızca işitsel ve görsel koleksiyonlara erişimi kontrol eder, SD karta erişim vermez. Bu durum, uygulama eski depolama alanı talep etse bile geçerlidir. Hem katı kısıtlamalar hem de yumuşak kısıtlamalar hakkında daha fazla bilgi için Android 10'daki katı ve yumuşak kısıtlamalar başlıklı makaleyi inceleyin.

Yükleyici izni beyaz listeye eklediyse eski modda çalışan bir uygulama, ayrılmış olmayan izin davranışını alır. İzin, SD kart erişimini ve işitsel ve görsel koleksiyonları kontrol eder. Bu durum, uygulama Android 9 veya önceki bir sürümü hedefliyorsa ve izole depolama alanını etkinleştirmemişse ya da Android 10'u hedefliyorsa ve devre dışı bırakmışsa ortaya çıkar.

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() öğesine bakın.

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

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

Çalışma zamanı izinleri

Android 6.0, uygulamaların çalışma zamanında ihtiyaç duyduğunda özellik isteğinde bulunduğu yeni bir çalışma zamanı izni modeli sunar. Yeni model READ/WRITE_EXTERNAL_STORAGE izinlerini içerdiğinden platformun, çalışan uygulamaları kapatmadan veya yeniden başlatmadan depolama erişimini dinamik olarak vermesi gerekir. Bunu, takılı tüm depolama cihazlarının üç farklı görünümünü koruyarak yapar:

  • /mnt/runtime/default, özel depolama alanı izni 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 değerine sahip uygulamalara gösterilir (Android 10 için LEGACY_STORAGE değerini ayarlayın)
  • /mnt/runtime/write, WRITE_EXTERNAL_STORAGE özelliğine sahip uygulamalarda gösterilir

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

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