Kısıtlı depolama

Kapsamlı depolama, uygulamanın harici depolamaya erişimini sınırlar. Android 11 veya üzeri sürümlerde, API 30 veya üzerini hedefleyen uygulamaların kapsamlı depolama kullanması gerekir. Daha önce Android 10'da uygulamalar kapsamlı depolama kapsamının dışında kalabiliyordu.

Uygulama erişim kısıtlamaları

Kapsamlı depolamanın amacı, uygulama ve kullanıcı verilerinin gizliliğini korumaktır. Bu, kullanıcı bilgilerinin (fotoğraf meta verileri gibi) korunmasını, uygulamaların açık izin olmadan kullanıcı dosyalarını değiştirmesinin veya silmesinin engellenmesini ve İndirilenler'e veya diğer klasörlere indirilen hassas kullanıcı belgelerinin korunmasını içerir.

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

  • Hiçbir izin olmadan kendi dosyalarına 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şimine yalnızca doğrudan kullanıcının izniyle izin verilir (Sistem Galerisi ve Tüm Dosyalar erişimine uygun uygulamalara tanınan istisnalar)
  • Diğer uygulamaların harici uygulama veri dizinlerine okuma veya yazma erişimi yok

FUSE ile kapsamlı depolamayı kullanın

Android 11 veya üzeri, MediaProvider modülünün kullanıcı alanındaki dosya işlemlerini incelemesine ve erişime izin verme, reddetme veya erişim izni verme politikasına göre dosyalara erişimi kapatmasına olanak tanıyan Kullanıcı Alanındaki Dosya Sistemini (FUSE) destekler. Kapsamlı depolamada FUSE kullanan uygulamalar, kapsamlı depolamanın gizlilik özelliklerine ve doğrudan dosya yolunu kullanarak dosyalara erişme yeteneğine sahip olur (Dosya API'lerinin uygulamalarda çalışmasını sağlar).

Android 10, MediaProvider tarafından yapılan dosya erişimlerinde kapsamlı depolama kurallarını zorunlu kıldı, ancak çekirdek çağrılarının ele geçirilmesi için gereken çaba nedeniyle doğrudan dosya yolu erişimi (örneğin, Dosya API'si ve NDK API'leri kullanılarak) için uygulanmadı. Sonuç olarak, kapsamlı depolama alanındaki uygulamalar dosyalara doğrudan dosya yolunu kullanarak erişemedi. Bu kısıtlama, MediaProvider API'sine Dosya API erişimini yeniden yazmak için önemli kod değişiklikleri gerektirdiğinden uygulama geliştiricilerinin uyum sağlama becerisini etkiledi.

SİGORTA ve SDCardFS

FUSE için Android 11 desteği, SDCardFS'nin kullanımdan kaldırılmasıyla ilgili değildir ancak daha önce SDCardFS kullanan cihazlar için Media Store'a bir alternatif sağlar. Cihazlar:

  • Çekirdek 5.4 veya üzeri kullanılarak Android 11 veya üzeri sürümlerle başlatma SDCardFS'yi kullanamaz.
  • Android 11 veya daha üst bir sürüme yükseltme, dosya işlemlerini durdurmak ve gizlilik hedeflerini karşılamak için SDCardFS'nin üzerinde FUSE'yi barındırabilir.

FUSE performans ayarı

Android daha önce, harici depolamanın FUSE olarak takıldığı Android 7 veya önceki sürümlerde FUSE'ı destekliyordu. FUSE uygulamasındaki performans ve kilitlenme sorunları nedeniyle Android 8, SDCardFS'yi kullanıma sundu. Android 11, Android 7 veya önceki sürümlerdeki performans sorunlarını çözecek şekilde ayarlanabilen, geliştirilmiş, daha iyi test edilmiş bir libfuse uygulamasını kullanarak FUSE desteğini yeniden sunuyor.

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

  • Bu dizinlere dayanan oyun uygulamalarının performansını artırmak amacıyla Android/data ve Android/obb dizinleri için FUSE'yi atlamak.
  • Okuma performansını ve medya oynatımını sorunsuz tutmak için optimizasyonlar (FUSE dosya sisteminin ileri okuma ve kirli oranlarının ayarlanması gibi).
  • FUSE geri yazma önbelleğini kullanma.
  • IPC'leri sistem sunucusuna azaltmak için önbelleğe alma izinleri.
  • Toplu işlemleri daha hızlı hale getirmek için Tüm Dosyalara erişime sahip uygulamalara yönelik optimizasyonlar.

Yukarıdaki ayarlamalar, FUSE ve FUSE olmayan cihazlar arasında karşılaştırılabilir bir performans üretebilir. Örneğin, ayarlanmış bir Pixel 2'nin FUSE kullanılarak ve Pixel 2'nin Media Store kullanılarak test edilmesi, dosya yolu erişimi ile Media Store arasında karşılaştırılabilir sıralı okuma performansı (örneğin, video oynatma) buldu. Ancak sıralı yazma işlemleri FUSE ile biraz daha kötüydü ve rastgele okuma ve yazma işlemleri iki kata kadar daha yavaş olabiliyordu.

Performans ölçümleri cihazdan cihaza ve belirli kullanım durumları arasında değişebilir. MediaProvider API'leri en tutarlı performansı sağladığından, performans konusunda endişe duyan uygulama geliştiricilerinin uygulamaları için MediaProvider API'lerini kullanması gerekir.

FUSE performansı etkisini azaltın

FUSE performansının etkisi yalnızca harici paylaşılan depolama alanında depolanan dosyaların yoğun kullanıcıları ile sınırlıdır. Harici özel depolama ( android/data ve android/obb dizinlerini içerir) FUSE tarafından atlanırken dahili depolama (birçok uygulamanın verileri şifreli ve güvenli tutmak için sakladığı /data/data gibi) FUSE'ye bağlı değildir.

  • Paylaşılan harici depolamayı az kullanan uygulamalar genellikle sınırlı sayıda dosyayla (genellikle 100'den az dosya) etkileşime girer. Bu uygulamalar, ortak okuma ve yazma işlemlerinin mevcut optimizasyonlarından yararlanır ve Android 11'de FUSE ile ilgili herhangi bir performans etkisi görülmemelidir.

  • Paylaşılan harici depolamayı yoğun olarak kullanan uygulamalar, genellikle 1000 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 gerçekleştirir. Toplu dosya işlemleri Android 11'deki FUSE'den etkilenebilir ancak bu tür uygulamalar MANAGE_EXTERNAL_STORAGE iznine uygunsa Ekim 2020 güncellemesinde yer alan performans optimizasyonlarından yararlanabilirler.

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

Performanstan ziyade gizlilik

FUSE için ayarlanmış cihazlarda, en kritik kullanıcı yolculukları Android 10 ve Android 11 arasında eşit performans gösterir. Ancak, bir dizi dosya işlemi üzerinden karşılaştırmalar test edilirken Android 11, Android 10'dan daha kötü performans gösterebilir. Android 11'de daha da kötüsü (örneğin, rastgele okuma veya yazma), uygulamalara FUSE olmayan bir erişim modu vermek için MediaProvider API'lerini kullanmanızı öneririz; bu, en iyi ve tutarlı performansa sahip seçenektir.

MediaProvider ve FUSE güncellemeleri

MediaProvider sistem bileşeni 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ına (örneğin resimler, videolar, müzik dosyaları vb.) bir arayüz sağlıyordu. Bir uygulama Dosya API'sini kullanarak bir dosya oluşturduğunda MediaProvider'dan dosyayı taramasını ve veritabanına kaydetmesini isteyebilir.

  • Android 11 veya sonraki sürümlerde, SDCardFS kullanımdan kaldırılmıştır ve MediaProvider, harici depolama için dosya sistemi işleyicisi (FUSE için) haline gelerek, harici depolamadaki dosya sistemini ve MediaProvider veritabanını tutarlı hale getirir. FUSE dosya sisteminin kullanıcı alanı işleyicisi olan MediaProvider, çekirdek çağrılarını engelleyebilir ve dosya işlemlerinin gizliliğin güvenli olmasını sağlayabilir.

Android 11 ve sonraki sürümlerde MediaProvider aynı zamanda Android sürümlerinin dışında güncellenebilen modüler bir sistem bileşenidir (Ana Hat modülü). Bu, MediaProvider'da bulunan performans, gizlilik veya güvenlik sorunlarının Google Play Store veya iş ortağı tarafından sağlanan diğer mekanizmalar aracılığıyla düzeltilip kablosuz olarak iletilebileceği anlamına gelir. Bir FUSE işleyicisinden beklenenler kapsamındaki her şey de güncellenebilir olup, FUSE performansındaki gerilemeleri ve hataları düzeltmeye yönelik güncellemelere olanak tanır.