SİGORTA geçidi

Android 12, daha düşük dosya sistemine doğrudan erişimle karşılaştırılabilir bir performans elde etmek için FUSE yükünü en aza indiren FUSE geçişini destekler. FUSE geçişi android12-5.4 , android12-5.10 ve android-mainline (yalnızca test) çekirdeklerinde desteklenir; bu, bu özelliğin desteğinin cihaz tarafından kullanılan çekirdeğe ve cihazın çalıştırdığı Android sürümüne bağlı olduğu anlamına gelir:

  • Android 11'den Android 12'ye yükseltme yapan cihazlar, bu cihazların çekirdekleri donmuş olduğundan ve FUSE geçiş değişiklikleriyle resmi olarak yükseltilmiş bir çekirdeğe taşınamadığından FUSE geçişini destekleyemez.

  • Android 12 ile başlatılan cihazlar, resmi bir çekirdek kullanıldığında FUSE geçişini destekleyebilir. Bu tür cihazlar için, FUSE geçişini uygulayan Android çerçeve kodu, otomatik olarak yükseltilen MediaProvider ana hat modülüne yerleştirilmiştir. MediaProvider'ı ana hat modülü olarak uygulamayan cihazlar (örneğin, Android Go cihazları), genel olarak paylaşıldıkları için MediaProvider değişikliklerine de erişebilir.

FUSE ve SDCardFS

Kullanıcı Alanındaki Dosya Sistemi (FUSE), FUSE dosya sistemi üzerinde gerçekleştirilen işlemlerin, çekirdek (FUSE sürücüsü) tarafından, işlemleri uygulayan bir kullanıcı alanı programına (FUSE arka plan programı) dış kaynaklardan sağlanmasına olanak tanıyan bir mekanizmadır. Android 11 , SDCardFS'yi kullanımdan kaldırdı ve FUSE'ı depolama emülasyonu için varsayılan çözüm haline getirdi. Bu değişikliğin bir parçası olarak Android, dosya erişimlerini engellemek, ekstra güvenlik ve gizlilik özelliklerini uygulamak ve çalışma zamanında dosyaları değiştirmek için kendi FUSE arka plan programını uyguladı.

FUSE, sayfalar veya öznitelikler gibi önbelleğe alınabilir bilgilerle uğraşırken iyi performans gösterirken, özellikle orta ve düşük seviye cihazlarda görülebilen harici depolamaya erişirken performans gerilemelerine neden olur. Bu gerilemelere, FUSE dosya sisteminin uygulanmasında işbirliği yapan bir bileşenler zincirinin yanı sıra, FUSE sürücüsü ile FUSE arka plan programı arasındaki iletişimde çekirdek alanından kullanıcı alanına yapılan çoklu geçişler (alt dosyaya doğrudan erişimle karşılaştırıldığında) neden olur. daha yalın ve tamamen çekirdeğe uygulanan sistem).

Bu gerilemeleri azaltmak amacıyla uygulamalar, veri kopyalamayı azaltmak için birleştirmeyi kullanabilir ve daha düşük dosya sistemi dosyalarına doğrudan erişim elde etmek için ContentProvider API'yi kullanabilir. Bu ve diğer optimizasyonlarla bile, FUSE kullanıldığında okuma ve yazma işlemleri, daha düşük dosya sistemine doğrudan erişimle karşılaştırıldığında daha düşük bant genişliği görebilir; özellikle önbelleğe alma veya ileri okumanın yardımcı olamayacağı rastgele okuma işlemlerinde. Ve depolamaya eski /sdcard/ yolu üzerinden doğrudan erişen uygulamalar, özellikle IO yoğun işlemler gerçekleştirirken gözle görülür performans düşüşleri yaşamaya devam ediyor.

SDcardFS kullanıcı alanı istekleri

SDcardFS'nin kullanılması, kullanıcı alanı çağrısını çekirdekten kaldırarak FUSE'nin depolama emülasyonunu ve izin kontrollerini hızlandırabilir. Kullanıcı alanı istekleri şu yolu izler: Kullanıcı Alanı → VFS → sdcardfs → VFS → ext4 → Sayfa önbelleği/Depolama.

SİGORTA Geçişli SDcardFS

Şekil 1. SDcardFS kullanıcı alanı istekleri

FUSE kullanıcı alanı istekleri

FUSE başlangıçta depolama öykünmesini etkinleştirmek ve uygulamaların dahili depolamayı veya harici bir sd kartı şeffaf bir şekilde kullanmasına izin vermek için kullanıldı. FUSE kullanmak bir miktar ek yük getirir çünkü her kullanıcı alanı isteği şu yolu izler: Kullanıcı Alanı → VFS → FUSE sürücüsü → FUSE arka plan programı → VFS → ext4 → Sayfa önbelleği/Depolama.

SİGORTA Geçişli SİGORTA

Şekil 2. FUSE kullanıcı alanı istekleri

FUSE geçiş istekleri

Çoğu dosya erişim izni, dosya açılma zamanında kontrol edilir; ek izin kontrolleri, o dosyadan okuma ve dosyaya yazma sırasında meydana gelir. Bazı durumlarda, dosya açma zamanında istekte bulunan uygulamanın istenen dosyaya tam erişime sahip olduğunu bilmek mümkündür, böylece sistemin FUSE sürücüsünden gelen okuma ve yazma isteklerini FUSE arka plan programına iletmeye devam etmesine gerek kalmaz (bunun gibi) verileri yalnızca bir yerden diğerine taşır).

FUSE geçişi ile, açık bir isteği işleyen FUSE arka plan programı, FUSE sürücüsüne işleme izin verildiğini ve sonraki tüm okuma ve yazma isteklerinin doğrudan alt dosya sistemine iletilebileceğini bildirebilir. Bu, kullanıcı alanı FUSE arka plan programının FUSE sürücüsü isteklerine yanıt vermesini beklemenin getirdiği ekstra yükü ortadan kaldırır.

FUSE ve FUSE geçiş isteklerinin karşılaştırması aşağıda gösterilmiştir.

SİGORTA Geçiş Karşılaştırması

Şekil 3. FUSE isteği ile FUSE geçiş isteği karşılaştırması

Bir uygulama FUSE dosya sistemi erişimi gerçekleştirdiğinde aşağıdaki işlemler gerçekleşir:

  1. FUSE sürücüsü isteği işler ve kuyruğa alır, ardından bunu, FUSE arka plan programının okumasının engellendiği /dev/fuse dosyasındaki belirli bir bağlantı örneği aracılığıyla FUSE dosya sistemini işleyen FUSE arka plan programına sunar.

  2. FUSE arka plan programı bir dosyayı açma isteği aldığında, söz konusu dosya için FUSE geçişinin mevcut olup olmayacağına karar verir. Mevcutsa, arka plan programı:

    1. FUSE sürücüsüne bu isteği bildirir.

    2. Açılan /dev/fuse dosyasının dosya tanımlayıcısında gerçekleştirilmesi gereken FUSE_DEV_IOC_PASSTHROUGH_OPEN ioctl'yi kullanan dosya için FUSE geçişini etkinleştirir.

  3. ioctl, aşağıdakileri içeren bir veri yapısını (parametre olarak) alır:

    • Geçiş özelliğinin hedefi olan alt dosya sistemi dosyasının dosya tanımlayıcısı.

    • Şu anda işlenmekte olan FUSE isteğinin benzersiz tanımlayıcısı (açık veya oluştur-ve-aç olmalıdır).

    • Boş bırakılabilen ve gelecekteki uygulamalara yönelik olan ekstra alanlar.

  4. Ioctl başarılı olursa, FUSE arka plan programı açma isteğini tamamlar, FUSE sürücüsü FUSE arka plan programının yanıtını yönetir ve çekirdek içindeki FUSE dosyasına alt dosya sistemi dosyasına bir referans eklenir. Bir uygulama bir FUSE dosyasında okuma/yazma işlemi istediğinde, FUSE sürücüsü daha düşük bir dosya sistemi dosyasına referansın mevcut olup olmadığını kontrol eder.

    • Bir referans mevcutsa sürücü, daha düşük dosya sistemi dosyasını hedefleyen aynı parametrelerle yeni bir Sanal Dosya Sistemi (VFS) isteği oluşturur.

    • Bir referans mevcut değilse sürücü, isteği FUSE arka plan programına iletir.

Yukarıdaki işlemler, genel dosyalar üzerinde okuma/yazma ve okuma-iter/yaz-iter için ve bellek eşlemeli dosyalar üzerinde okuma/yazma işlemleri için gerçekleşir. Belirli bir dosya için FUSE geçişi, o dosya kapatılana kadar mevcuttur.

FUSE geçişini uygulayın

Android 12 çalıştıran cihazlarda FUSE geçişini etkinleştirmek için hedef cihazın $ANDROID_BUILD_TOP/device/…/device.mk dosyasına aşağıdaki satırları ekleyin.

# Use FUSE passthrough
PRODUCT_PRODUCT_PROPERTIES += \
    persist.sys.fuse.passthrough.enable=true

FUSE geçişini devre dışı bırakmak için yukarıdaki yapılandırma değişikliğini atlayın veya persist.sys.fuse.passthrough.enable değerini false olarak ayarlayın. Daha önce FUSE geçişini etkinleştirdiyseniz, bunun devre dışı bırakılması cihazın FUSE geçişini kullanmasını engeller ancak cihaz çalışır durumda kalır.

FUSE geçişini aygıtın flaşını yapmadan etkinleştirmek/devre dışı bırakmak için ADB komutlarını kullanarak sistem özelliğini değiştirin. Aşağıda bir örnek gösterilmiştir.

adb root
adb shell setprop persist.sys.fuse.passthrough.enable {true,false}
adb reboot

Ek yardım için referans uygulamasına bakın.

FUSE geçişini doğrula

MediaProvider'ın FUSE geçişini kullandığını doğrulamak için logcat hata ayıklama mesajlarını kontrol edin. Örneğin:

adb logcat FuseDaemon:V \*:S
--------- beginning of main
03-02 12:09:57.833  3499  3773 I FuseDaemon: Using FUSE passthrough
03-02 12:09:57.833  3499  3773 I FuseDaemon: Starting fuse...

FuseDaemon: Using FUSE passthrough FUSE geçiş geçişinin kullanımda olmasını sağlar.

Android 12 CTS, FUSE geçişini tetikleyen testleri içeren CtsStorageTest içerir. Testi manuel olarak çalıştırmak için atest'i aşağıda gösterildiği gibi kullanın:

atest CtsStorageTest