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 geçici veri aktarımı/dosya depolama için kullanılan fiziksel medyalar tarafından sağlanabilir. 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 sürümünden itibaren Android, SD kart veya USB gibi fiziksel medya tarafından sağlanan, şifrelenmiş ve dahili depolama gibi davranacak şekilde biçimlendirilen kabul edilebilir depolama alanını desteklemektedir. Kabul edilebilir depolama her tür uygulama verisini depolayabilir.

İ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, genel WRITE_EXTERNAL_STORAGE iznine sahip olmaları gerekmeden harici depolamadaki pakete özgü dizinleri yönetebilir. Örneğin, paket adı com.example.foo olan uygulama artık hiçbir izni olmayan harici depolama cihazlarında Android/data/com.example.foo/ uygulamasına serbestçe 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 sağlamaz. Bu durum, uygulama eski depolama alanı talep etse bile geçerlidir. Hem katı hem de geçici kısıtlamalar hakkında daha fazla bilgi edinmek için Android 10'daki katı ve hafif kısıtlamalar bölümüne bakın.

Yükleyici, izni beyaz listeye aldıysa eski modda çalışan bir uygulama, bağımsız olmayan izin davranışını alır. Bu izin, 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 PackageLoader.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 modelini kullanıma 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 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 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 uygulamalara 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ında izinler verildiğinde vold, zaten ç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ğin uygulanmasında kullanılan setns() işlevi için en az Linux 3.8 gereklidir. 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.