Kısıtlı depolama, uygulamanın harici depolamaya erişimini sınırlar. Android 11 veya sonraki sürümlerde, API 30 veya sonraki sürümleri hedefleyen uygulamalar kapsamlı depolama alanını kullanmalıdır. Android 10'da daha önce uygulamalar, kapsamlı depolama alanını devre dışı bırakabiliyordu.
Uygulama erişim kısıtlamaları
Kapsamlı depolamanın amacı, uygulama ve kullanıcı verilerinin gizliliğini korumaktır. Buna kullanıcı bilgilerinin (ör. fotoğraf meta verileri) korunması, uygulamaların açık izin olmadan kullanıcı dosyalarını değiştirmesini veya silmesini engelleme ve İndirme veya diğer klasörlere indirilen hassas kullanıcı dokümanlarını koruma dahildir.
Kapsamlı depolama alanını kullanan uygulamalar aşağıdaki erişim düzeylerine sahip olabilir (gerçek erişim, uygulamaya özeldir).
- Hiçbir izni olmayan kendi dosyalarına okuma ve yazma erişimi
READ_EXTERNAL_STORAGE
iznine sahip diğer uygulamaların medya dosyalarına okuma erişimi- Diğer uygulamaların medya dosyalarına yalnızca doğrudan kullanıcı izniyle yazma erişimine izin verilir (Sistem Galerisi ve tüm dosyalara erişmeye uygun uygulamalara istisnalar uygulanır)
- Diğer uygulamaların harici uygulama veri dizinlerine okuma veya yazma erişimi yok
FUSE ile kapsamlı depolama alanını kullanma
Android 11 veya sonraki sürümler, MediaProvider modülünün kullanıcı alanındaki dosya işlemlerini incelemesine ve erişime izin verme, reddet veya çıkartma politikasına bağlı olarak dosyalara erişimi denetlemesine olanak tanıyan Userspace'te (FUSE) Dosya Sistemi'ni destekler. Kapsamlı depolama alanında FUSE kullanan uygulamalar, kapsamlı depolama alanının gizlilik özelliklerini ve doğrudan dosya yolu kullanarak dosyalara erişme olanağını elde eder (Dosya API'lerinin uygulamalarda çalışmasını sağlar).
Android 10, MediaProvider tarafından yapılan dosya erişimlerinde kapsamlı depolama alanı kurallarını zorunlu kıldı ancak çekirdek çağrılarını durdurmak için gereken çaba nedeniyle doğrudan dosya yolu erişimi (ör. File API ve NDK API'leri kullanılarak) için bu kuralları zorunlu kılmadı. Sonuç olarak, kapsamlı depolama alanındaki uygulamalar doğrudan dosya yolu kullanarak dosyalara erişemiyordu. Bu kısıtlama, File API erişimini MediaProvider API'ye yeniden yazmak için önemli kod değişiklikleri gerektirdiğinden uygulama geliştiricilerin uyum sağlama yeteneğini etkiledi.
FUSE ve SDCardFS
Android 11'de FUSE desteği, SDCardFS'nin desteğinin sonlandırılmasıyla ilgili değildir ancak daha önce SDCardFS kullanan cihazlar için Media Store'a alternatif bir seçenek sunar. Cihazlar:
- Android 11 veya sonraki bir sürümde 5.4 veya daha yeni bir çekirdek kullanarak başlatma işleminde SDCardFS kullanılamaz.
- Android 11 veya sonraki bir sürüme yükseltme yaptığınızda, dosya işlemlerini durdurmak ve gizlilik hedeflerini karşılamak için SDCardFS'nin üzerine FUSE yerleştirilebilir.
FUSE performans ayarı
Android daha önce Android 7 veya daha eski sürümlerde FUSE'yi desteklerdi. Bu sürümlerde harici depolama alanı FUSE olarak monte edilirdi. Bu FUSE uygulamasındaki performans ve kilitlenme sorunları nedeniyle Android 8'de SDCardFS kullanıma sunulmuştur. Android 11, Android 7 veya önceki sürümlerdeki performans sorunlarını çözmek için ayarlanabilen iyileştirilmiş ve daha iyi test edilmiş bir libfuse
uygulaması kullanarak FUSE desteğini yeniden sunar.
FUSE ayarı aşağıdaki ince ayarları içerir:
- Bu dizinleri kullanan oyun uygulamalarının performansını artırmak için
Android/data
veAndroid/obb
dizinleri için FUSE'i atlama. - Okumaların performanslı ve medya oynatmanın sorunsuz olmasını sağlamak için optimizasyonlar (ör. FUSE dosya sisteminin önceden okuma ve kirli oranlarını ayarlama).
- FUSE geri yazma önbelleğini kullanma.
- Sistem sunucusuyla IPC'leri azaltmak için önbelleğe alma izinleri.
- Toplu işlemleri hızlandırmak için Tüm Dosyalar erişimi olan uygulamalar için optimizasyonlar.
Yukarıdaki ayar düzenlemeleri, FUSE ve FUSE olmayan cihazlar arasında benzer performanslar sağlayabilir. Örneğin, ayarlanmış bir Pixel 2'yi FUSE ve Pixel 2 kullanarak Media Store kullanarak test ettiğimizde, dosya yolu erişimi ile Medya Mağazası arasında karşılaştırılabilir sıralı okuma performansı (örneğin, video oynatma) bulundu. Ancak FUSE ile sıralı yazma işlemleri biraz daha yavaştı ve rastgele okuma ve yazma işlemleri iki kat daha yavaş olabilirdi.
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şelenen uygulama geliştiricileri uygulamaları için MediaProvider API'lerini kullanmalıdır.
FUSE'nin performans üzerindeki etkisini azaltma
FUSE'nin performans üzerindeki etkisi yalnızca harici paylaşılan depolama alanında depolanan dosyaların yoğun kullanıcılarıyla sınırlıdır. Harici özel depolama alanı (android/data
ve android/obb
dizinlerini içerir) FUSE tarafından atlanır. Dahili depolama alanı (birçok uygulamanın şifrelenmiş ve güvenli tutmak için verileri depoladığı /data/data
gibi) ise FUSE tarafından monte edilmez.
Paylaşılan harici depolama alanını az kullanan uygulamalar genellikle sınırlı sayıda dosyayla (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 yaşamaz.
Paylaşılan harici depolama alanını yoğun olarak kullanan uygulamalar genellikle toplu dosya işlemleri gerçekleştirir (ör. 1.000 dosyanın bulunduğu bir dizini listeleme veya kaldırma ya da dosya sisteminde bir milyon dosyanın bulunduğu bir dizini oluşturma veya silme). Toplu dosya işlemleri Android 11'deki FUSE'den etkilenebilir ancak bu tür uygulamalar
MANAGE_EXTERNAL_STORAGE
izni için uygunsa Ekim 2020 güncellemesinde yer alan performans optimizasyonlarından yararlanabilir.
Uygulamalar, FUSE performans yükü oluşturmasını önlemek için verileri harici özel depolama alanında saklayabilir veya FUSE'yi atlayıp performans için optimize edilmiş bir yol elde etmek üzere ContentProvider
sınıfındaki toplu API'leri kullanabilir. Ayrıca, MediaProvider sistem bileşeninde Ekim 2020'de yapılan güncelleme, MANAGE_EXTERNAL_STORAGE
iznine sahip dosya yöneticileri ve benzer uygulamalar (yedekleme/geri yükleme, antivirüs gibi) için performans optimizasyonları içerir.
Performans yerine gizlilik
FUSE için ayarlanmış cihazlarda, en önemli kullanıcı yolculuklarının çoğu Android 10 ve Android 11'de eşit performans gösterir. Ancak bir dizi dosya işlemi üzerinde karşılaştırmalı testler 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 FUSE olmayan bir erişim modu vermek üzere MediaProvider API'lerini kullanmanızı öneririz. Bu, en iyi ve tutarlı performans sunan seçenektir.
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 SDCardFS, dosya sistemiydi ve MediaProvider, dosya koleksiyonları (örneğin, resimler, videolar, müzik dosyaları vb.) için 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 isteyebilir.
Android 11 veya sonraki sürümlerde SDCardFS desteği sonlandırılır ve MediaProvider, harici depolama alanındaki dosya sistemini ve MediaProvider veritabanını tutarlı hale getirerek harici depolama alanı için dosya sistemi işleyicisi (FUSE için) olur. FUSE dosya sisteminin kullanıcı alanı işleyicisi olarak MediaProvider, çekirdek çağrılarını durdurabilir 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ümlerinin dışında güncellenebilen bir modüler sistem bileşeni (Mainline modülü) olarak da kullanılır. Bu, MediaProvider'da bulunan performans, gizlilik veya güvenlik sorunlarının Google Play Store'dan ya da iş ortağı tarafından sağlanan diğer mekanizmalardan düzeltilip kablosuz olarak yayınlanabileceği anlamına gelir. FUSE işleyicisinden beklenen kapsamdaki her şey de güncellenebilir. Bu sayede, FUSE performansındaki gerilemelerin ve hataların düzeltilmesi için güncellemeler yapılabilir.