Kısıtlı depolama alanı

Kapsamlı depolama, uygulamaların harici depolamaya erişimini sınırlar. Android 11 veya sonraki sürümlerde, API düzeyi 30 veya sonraki sürümleri hedefleyen uygulamalar kapsamlı depolama alanını kullanmalıdır. Android 10'da uygulamalar, kapsamlı depolamayı devre dışı bırakabiliyordu.

Uygulama erişimi kısıtlamaları

Kapsamlı depolamanın amacı, uygulama ve kullanıcı verilerinin gizliliğini korumaktır. Bu kapsamda, kullanıcı bilgilerinin (ör. fotoğraf meta verileri) korunması, uygulamaların kullanıcının açık izni olmadan kullanıcı dosyalarını değiştirmesinin veya silmesinin engellenmesi ve İndirilenler klasörüne ya da diğer klasörlere indirilen hassas kullanıcı dokümanlarının korunması yer alır.

Kapsamlı depolama alanını kullanan uygulamalar aşağıdaki erişim düzeylerine sahip olabilir (gerçek erişim uygulamaya özeldir).

  • Kendi dosyalarına izin olmadan okuma ve yazma erişimi
  • READ_EXTERNAL_STORAGE izniyle diğer uygulamaların medya dosyalarına okuma erişimi
  • Diğer uygulamaların medya dosyalarına yazma erişimi yalnızca doğrudan kullanıcı izniyle verilir (Sistem Galerisi ve tüm dosyalara erişim için uygun olan uygulamalara istisna tanınır).
  • Diğer uygulamaların harici uygulama verileri dizinlerine okuma veya yazma erişimi yok

FUSE ile kapsamlı depolama alanını kullanma

Android 11 veya sonraki sürümlerde, kullanıcı alanındaki dosya işlemlerinin MediaProvider modülü tarafından incelenmesini ve dosyalara erişimin izin verme, reddetme veya redaksiyon politikasına göre kontrol edilmesini sağlayan Filesystem in Userspace (FUSE) desteklenir. FUSE kullanan, kapsamlı depolama alanındaki uygulamalar, kapsamlı depolama alanının gizlilik özelliklerinden yararlanır ve doğrudan dosya yolu kullanarak dosyalara erişebilir (Dosya API'lerinin uygulamalarda çalışmaya devam etmesini sağlar).

Android 10, MediaProvider tarafından dosyalara erişim için kapsamlı depolama kurallarını zorunlu kıldı ancak çekirdek çağrılarını engellemek için gereken çaba nedeniyle doğrudan dosya yolu erişimi (ör. File API ve NDK API'leri kullanılarak) için bu kurallar geçerli değildir. Sonuç olarak, kapsamlı depolama alanındaki uygulamalar doğrudan dosya yolu kullanarak dosyalara erişemiyordu. Bu kısıtlama, Dosya API'si erişiminin MediaProvider API'ye yeniden yazılması için önemli kod değişiklikleri gerektirdiğinden uygulama geliştiricilerin uyum sağlama becerisini etkiledi.

FUSE ve SDCardFS

FUSE'un Android 11'de desteklenmesi, SDCardFS'nin desteğinin sonlandırılması ile ilgili değildir ancak daha önce SDCardFS kullanan cihazlarda Media Store'a alternatif bir çözüm sunar. Cihazlar:

  • Android 11 veya sonraki sürümlerde, 5.4 ya da sonraki bir çekirdek sürümüyle başlatılan cihazlarda SDCardFS kullanılamaz.
  • Android 11 veya sonraki sürümlere yükseltme, dosya işlemlerini yakalamak ve gizlilik hedeflerini karşılamak için FUSE'u SDCardFS'nin üzerinde barındırabilir.

FUSE performans ayarı

Android, daha önce Android 7 veya daha eski sürümlerde FUSE'u destekliyordu. Bu sürümlerde harici depolama alanı FUSE olarak monte ediliyordu. Bu FUSE uygulamasında performans ve kilitlenme sorunları yaşandığı için Android 8'de SDCardFS kullanıma sunuldu. Android 11, Android 7 veya daha eski sürümlerdeki performans sorunlarını çözmek için ayarlanabilen libfuse'nin geliştirilmiş ve daha iyi test edilmiş bir uygulamasını kullanarak FUSE desteğini yeniden sunar.

FUSE ayarlaması aşağıdaki ince ayarları içerir:

  • Bu dizinlere dayanan oyun uygulamalarının performansını artırmak için Android/data ve Android/obb dizinlerinde FUSE'u atlama.
  • Okuma işlemlerinin performanslı ve medya oynatmanın sorunsuz olması için optimizasyonlar (ör. FUSE dosya sisteminin önceden okuma ve kirli oranlarını ayarlama).
  • FUSE geri yazma önbelleğini kullanma.
  • Sistem sunucusuna IPC sayısını azaltmak için önbelleğe alma izinleri.
  • Toplu işlemleri daha hızlı hale getirmek için Tüm Dosyalar erişimi olan uygulamalara yönelik optimizasyonlar.

Yukarıdaki ayarlama değişiklikleri, FUSE ve FUSE dışı cihazlar arasında benzer performans sağlayabilir. Örneğin, FUSE kullanılarak ayarlanmış bir Pixel 2 ile Media Store kullanılarak ayarlanmış bir Pixel 2'nin test edilmesi sonucunda, dosya yolu erişimi ve Media Store arasında karşılaştırılabilir sıralı okuma performansı (ör. video oynatma) elde edildi. Ancak FUSE ile sıralı yazma işlemleri biraz daha kötüydü ve rastgele okuma ve yazma işlemleri iki kat daha yavaş olabiliyordu.

Performans ölçümleri cihazdan cihaza ve belirli kullanım alanları arasında değişiklik gösterebilir. MediaProvider API'leri en tutarlı performansı sağladığından performans konusunda endişeleri olan uygulama geliştiriciler, uygulamalarında MediaProvider API'lerini kullanmalıdır.

FUSE'un performans üzerindeki etkisini azaltma

FUSE performans etkisi yalnızca harici paylaşılan depolama alanında depolanan dosyaları yoğun olarak kullanan kullanıcılarla sınırlıdır. Harici özel depolama alanı (android/data ve android/obb dizinleri dahil) FUSE tarafından atlanırken dahili depolama alanı (ör. birçok uygulamanın verileri şifrelenmiş ve güvenli tutmak için depoladığı /data/data) FUSE'a bağlı değildir.

  • Paylaşılan harici depolama alanını az kullanan uygulamalar genellikle sınırlı bir dosya grubuyla (genellikle 100'den az dosya) etkileşim kurar. Bu uygulamalar, yaygın okuma ve yazma işlemlerinin mevcut optimizasyonlarından yararlanır ve Android 11'de FUSE ile ilgili herhangi bir performans etkisi görmez.

  • Paylaşılan harici depolama alanını yoğun olarak kullanan uygulamalar genellikle toplu dosya işlemleri gerçekleştirir. Örneğin, 1.000 dosya içeren bir dizini listeleme veya kaldırma ya da dosya sisteminde bir milyon dosya içeren bir dizin oluşturma veya silme gibi. Toplu dosya işlemleri, Android 11'de FUSE'dan etkilenebilir. Ancak bu tür uygulamalar MANAGE_EXTERNAL_STORAGE izni için uygunsa Ekim 2020 güncellemesinde yer alan performans optimizasyonlarından yararlanır.

Uygulamalar, FUSE performans ek yükünden kaçınmak için verileri harici özel depolama alanında depolayabilir veya FUSE'u atlayıp performansı optimize edilmiş bir yol elde etmek için ContentProvider sınıfındaki toplu API'leri kullanabilir. Ayrıca, MediaProvider sistem bileşeninin Ekim 2020 güncellemesi, MANAGE_EXTERNAL_STORAGE iznine sahip dosya yöneticileri ve benzer uygulamalar (ör. yedekleme/geri yükleme, antivirüs) için performans optimizasyonları içerir.

Performanstan daha önemli olan gizlilik

FUSE için ayarlanmış cihazlarda, en önemli kullanıcı yolculuklarının çoğu Android 10 ile Android 11 arasında eşit performans gösterir. Ancak bir dizi dosya işlemi üzerinde karşılaştırma testleri yapılırken Android 11, Android 10'dan daha kötü performans gösterebilir. Android 11'de daha kötü performans gösteren dosya erişim kalıpları (ör. rastgele okuma veya yazma) için uygulamalara en iyi ve tutarlı performans gösteren seçenek olan FUSE dışı erişim modu sağlamak üzere MediaProvider API'lerini kullanmanızı öneririz.

MediaProvider ve FUSE güncellemeleri

MediaProvider sistem bileşeninin davranışı Android sürümleri arasında farklılık gösterir.

  • Android 10 ve önceki sürümlerde dosya sistemi SDCardFS'ydi ve MediaProvider, dosya koleksiyonlarına (ör. resimler, videolar, müzik dosyaları vb.) bir arayüz sağlıyordu. Bir uygulama, File API'yi kullanarak dosya oluşturduğunda MediaProvider'dan dosyayı taramasını ve veritabanına kaydetmesini isteyebiliyordu.

  • Android 11 veya sonraki sürümlerde SDCardFS desteği sonlandırıldı. Harici depolama için dosya sistemi işleyici (FUSE için) MediaProvider oldu. Bu sayede, harici depolamadaki dosya sistemi ile MediaProvider veritabanı tutarlı hale geldi. FUSE dosya sistemi için kullanıcı alanı işleyicisi olarak MediaProvider, çekirdek çağrılarını yakalayabilir ve dosya işlemlerinin gizlilik açısından güvenli olmasını sağlayabilir.

Android 11 ve sonraki sürümlerde MediaProvider, Android sürümleri dışında güncellenebilen bir modüler sistem bileşenidir (bir Mainline modülü). Bu sayede, MediaProvider'da bulunan performans, gizlilik veya güvenlik sorunları düzeltilip Google Play Store'dan ya da diğer iş ortakları tarafından sağlanan mekanizmalardan kablosuz olarak dağıtılabilir. FUSE işleyiciden beklenenler kapsamındaki her şey güncellenebilir. Böylece, FUSE performansındaki gerilemeleri ve hataları düzeltmek için güncellemeler yapılabilir.