Android 11 (API düzeyi 30) veya sonraki sürümlerde önbelleğe alınmış uygulamaları dondurma özelliği desteklenir. Bu özellik, önbelleğe alınan işlemlerin yürütülmesini durdurur ve önbelleğe alınmış durumdayken çalışmaya çalışan hatalı uygulamaların kaynak kullanımını azaltır.
Önbelleğe alınan uygulamaları dondurma özelliği, uygulamaları CPU'dan uzak tutarken RAM'de tutar. Android, bir uygulamanın çalışmaması gerektiğine ancak gelecekte gerekebileceğine karar verirse uygulama sürecini sonlandırmak yerine dondurur. Bu sayede, uygulamaya tekrar ihtiyaç duyulduğunda sıfırdan başlatma önlenir.
Android, işlemlerini dondurulmuş bir cgroup'a taşıyarak önbelleğe alınmış uygulamaları dondurur. Bu, etkin olarak önbelleğe alınmış uygulamalar olduğunda etkin ve boşta CPU tüketimini azaltır. Uygulama dondurucuyu bir sistem yapılandırma işareti veya geliştirici seçeneği kullanarak etkinleştirebilirsiniz.
Android 14 (API düzeyi 34) ve sonraki sürümlerde, önbelleğe alınmış uygulamaları dondurma özelliği aşağıdaki güçlü davranışları içerir:
- Önbelleğe alınmış durumdaki uygulama işlemleri, önbelleğe alınmış duruma girildikten 10 saniye sonra dondurulur.
- Sistem, yaşam döngüsü etkinliği sırasında donmuş bir uygulama sürecinin donmasını hemen çözer. Bu etkinlikler arasında amaç alma, iş hizmeti başlatma veya kullanıcının etkinliğe devam etmesi yer alır.
ActivityManagerService tüm uygulama süreçlerini yönetir ve uygulama yaşam döngüsüyle ilgili kararlar verir. CachedAppOptimizer, uygulama sürecini dondurmaktan sorumludur.
Bir uygulama işlemi dondurulduğunda tüm iş parçacıkları askıya alınır ve dondurma işlemi kaldırılana kadar CPU çalışması yapamaz. Bu nedenle uygulama, çöp toplama (GC) işlemini gerçekleştiremez ve bellek kırpma etkinliklerine yanıt veremez. Ayrıntılı bilgi için ComponentCallbacks2.onTrimMemory(int) başlıklı makaleyi inceleyin. Bunu karşılamak için Android 14'ten itibaren:
- Görünür bir
Activityörneği olan uygulamalar, arka plana taşındıkları andaTRIM_MEMORY_UI_HIDDENhakkında bilgilendirilir. Ön plan hizmeti içeren uygulamalar gibi, kullanıcı arayüzü olmadan yaşam döngüsünde kalan uygulamalarTRIM_MEMORY_BACKGROUNDalabilir. Uygulamalar bu etkinliklere uygun olduğunda dondurulmaları beklendiğinden diğer kırpma etkinlikleri yayınlanmaz. - Önbelleğe alınmış duruma girdikten kısa süre sonra sistem, olası donma durumuna hazırlık olarak uygulama çalışma zamanından çöp toplama işlemi gerçekleştirmesini isteyebilir.
- Bir uygulama işlemi dondurulduğunda ek bellek sıkıştırma adımları (ör. kirli sayfaları destekleme depolama alanına yazma ve anonim sayfaları ZRAM'e takas etme) gerçekleşebilir.
- Belirli bir uygulamayla ilgili tüm işlemler dondurulursa sistem, uygulama tarafından tutulan tüm etkin TCP soketlerini sonlandırır. Bu, soketin sunucu tarafının, cihaz modemini uyandıracak TCP canlı tutma ping'leri göndermesini engeller.
Önbelleğe alınmış uygulama işlemleri, işlem durumları önbelleğe alınmış durumdan daha önemli bir duruma yükseldiğinde dondurulmaz. Android 14 ve sonraki sürümlerde dondurma çözme etkinliklerini azaltmak için sistem, uygulama önbelleğe alınmış durumdayken bağlamda kayıtlı yayınları sıraya alır. Bağlamda kayıtlı yayın alıcılar, bir uygulamanın Context.registerReceiver'ı çağırarak dinamik olarak kaydettiği alıcılardır. Sistem, bu sıraya alınmış yayınları yalnızca uygulama dondurulması kaldırıldıktan sonra yayınlar. Bunun aksine, sistem manifest'te belirtilen yayınları sıraya almaz.
Manifest'te belirtilen yayınlar, <receiver> öğesi kullanılarak AndroidManifest.xml içinde statik olarak belirtilen alıcılardır. Sistem, manifestte belirtilen yayınları sunmak için önbelleğe alınan uygulamayı hemen çözdürür.
Sistem sağlığı üzerindeki etkisi
Android, MAX_CACHED_PROCESSES'den fazla önbelleğe alınmış uygulama işlemi varsa en son kullanılan önbelleğe alınmış uygulama işlemini sonlandırır. Android 14 veya sonraki sürümlerin yüklü olduğu desteklenen cihazlarda MAX_CACHED_PROCESSES önemli ölçüde artırılır. Böylece cihazlar, RAM'de çok daha fazla sayıda önbelleğe alınmış uygulama işlemi tutabilir.
RAM'de daha fazla uygulamanın önbelleğe alınması, baştan başlatma işlemlerinde% 30'a varan azalma sağlar. Azalma oranı, cihazın toplam RAM'ine göre değişir. Aynı zamanda, önbelleğe alınan uygulamaların CPU tüketimi en aza indirilir ve bu da önemli ölçüde pil tasarrufu sağlar.
Dondurucu muafiyetleri
Belirli koşullar altında, bir uygulama süreci önbelleğe alınmış duruma girebilir ancak dondurulmamış olarak kalabilir. Bu muafiyetler uygulama ayrıntılarıdır ve gelecekteki Android sürümlerinde değişebilir:
- Dosya kilitleri: Önbelleğe alınmış bir işlem, diğer önbelleğe alınmamış işlemleri engelleyen bir dosya kilidi tutuyorsa kilidi tutan işlem dondurulmaz.
BIND_WAIVE_PRIORITYbindings:Context.BIND_WAIVE_PRIORITYkullanılarak oluşturulan, gelen bağlamaları olan uygulama işlemleri önbelleğe alınmış duruma girebilir ancak bağlı tüm istemci işlemleri de önbelleğe alınana kadar dondurulmaz. Bu muafiyet, özel sekmeleri kullanan web tarayıcıları gibi çok işlemli uygulamaları destekler.
Uygulama dondurucuyu kullanma
Önbelleğe alınmış uygulamaları dondurma özelliği, çekirdek cgroup v2 dondurma özelliğinden yararlanır. Uyumlu çekirdekle birlikte gelen cihazlarda etkinleştirilebilir. Önbelleğe alınmış uygulamalar için yürütmeyi askıya al geliştirici seçeneğini etkinleştirin veya cihaz yapılandırma flag'ini activity_manager_native_boot use_freezer olarak ayarlayın.true Örneğin:
adb shell device_config put activity_manager_native_boot use_freezer true && adb rebootuse_freezer işaretini false olarak ayarladığınızda veya geliştirici seçeneğini devre dışı bıraktığınızda dondurma özelliği devre dışı bırakılır. Örneğin:
adb shell device_config put activity_manager_native_boot use_freezer false && adb rebootBu ayarı, bir yazılım sürümünde veya güncellemesinde cihaz yapılandırmasını değiştirerek etkinleştirebilir ya da devre dışı bırakabilirsiniz.
MAX_CACHED_PROCESSES değerini geçersiz kılmak için (ör. test için değeri 1024 olarak ayarlamak istiyorsanız):
adb shell device_config put activity_manager max_cached_processes 1024
adb shell device_config set_sync_disabled_for_tests persistentMAX_CACHED_PROCESSES geçersiz kılma işlemini geri almak için:
adb shell device_config delete activity_manager max_cached_processes
adb shell device_config set_sync_disabled_for_tests noneUygulama dondurucu, resmi API'leri kullanıma sunmaz ve referans uygulama istemcisi yoktur. Ancak, tek bir işlemi dondurmak için gizli sistem API'lerini (setProcessFrozen) ve dondurmayı genel olarak etkinleştirmek veya devre dışı bırakmak için (enableFreezer) kullanır.
Özel özellikleri işleme
Uygulama işlemleri, önbelleğe alındığında herhangi bir işlem yapmaz. Ancak bazı uygulamalarda, önbelleğe alınmış durumdayken çalışması gereken işlemler tarafından desteklenen özel özellikler olabilir. Bu tür uygulamaların çalıştığı bir cihazda uygulama dondurucu etkinleştirildiğinde, önbelleğe alınmış işlemler dondurulur ve özel özelliklerin çalışmasını engelleyebilir.
Geçici çözüm olarak, işlem herhangi bir çalışma yapmadan önce işlem durumunu önbelleğe alınmamış olarak değiştirebilirsiniz. Bu değişiklik, uygulamaların etkin kalmasına olanak tanır. Etkin durumlara örnek olarak bağlı ön plan hizmeti veya ön plan durumu verilebilir.
Sık karşılaşılan arıza modları
Uygulama süreçleri dondurulduğunda, süreçler arası iletişim (IPC) veya görev planlama düzgün yapılmadığı için uygulamalar sonlandırılabilir ya da beklenmedik davranışlar görülebilir.
Dondurulmuş süreçlere eşzamanlı bağlayıcı işlemleri
Bir istemci uygulaması işlemi, dondurulmuş bir sunucu uygulaması işlemine senkron bir bağlayıcı işlemi gönderdiğinde sistem, sunucu uygulaması işlemini hemen sonlandırır. Bu, istemci iş parçacığının dondurulmuş sunucudan yanıt beklerken süresiz olarak engellenmesini önler. Ardından, istemci iş parçacığı RemoteException alır ve kayıtlı tüm dinleyiciler tetiklenir. Ayrıntılı bilgi için IBinder.linkToDeath başlıklı makaleyi inceleyin.
Temel neden: Bu hata genellikle istemci uygulamasındaki bir hatadan kaynaklanır.
Bir istemci bir hizmete bağlandığında sunucu işlemi istemciye bağlanır ve istemci bağlanmadan önce önbelleğe alınmış duruma girmesi engellenir. Ayrıntılı bilgi için Context.bindService başlıklı makaleyi inceleyin. Ancak istemci aradığında
Context.unbindService sunucu işlemi önbelleğe alınabilir ve dondurulabilir. İstemci, bağlamayı kaldırdıktan sonra önbelleğe alınmış IBinder referansını kullanmaya devam ederse dondurulmuş bir işlemle iletişim kurma riskiyle karşı karşıya kalır.
Bu sorunu önlemek için istemci uygulamalarının IBinder
referanslarını Context.unbindService çağrıldıktan hemen sonra silmesini sağlayın.
Eşzamansız bağlayıcı işlem arabellek taşması
Bir sunucu uygulaması işlemi dondurulmuş durumdayken eşzamansız (oneway) bağlayıcı işlemleri aldığında, işlemler süreç başına arabellekte arabelleğe alınır. Sunucu, dondurulmuş durumdayken çok fazla eşzamansız işlem alırsa arabellek taşar ve sistem, sunucu uygulaması sürecini sonlandırır.
Bu arabellek taşmasını önlemek için, önbelleğe alınmış veya dondurulmuş olabilecek işlemlere aşırı sayıda eşzamansız bağlayıcı işlemi göndermeyin.
Dondurma kaldırıldıktan sonra planlanmış görevlerin tekrar tekrar yürütülmesi
Bir uygulama tekrarlayan görevler yürütüyorsa işlem dondurulmuşken bu görevler askıya alınır. Ayrıntılı bilgi için ScheduledThreadPoolExecutor.scheduleAtFixedRate veya Timer.scheduleAtFixedRate başlıklı makaleyi inceleyin. İşlem dondurulması kaldırıldığında, biriken kaçırılan yürütmeler neredeyse hiç gecikme olmadan hızlı bir şekilde arka arkaya çalışabilir.
Uygulama dondurulması kaldırıldığında yürütme işlemlerinin artmasını önlemek için arka plan görevlerinde scheduleAtFixedRate yerine scheduleWithFixedDelay kullanın. WorkManager aracını da kullanabilirsiniz.
Uygulama dondurucuyu test etme ve sorunlarını giderme
Uygulama dondurucunun amaçlandığı şekilde çalıştığını doğrulamak veya dondurucuyla ilgili sorunları gidermek için aşağıdaki teşhis araçlarını ve komutlarını kullanın:
Etkinlik yöneticisi komutları
Belirli bir işlem için dondurma ve sıkıştırmayı manuel olarak kontrol etmek üzere adb shell am komutlarını kullanabilirsiniz:
Bir işlemi dondurmaya zorlama:
adb shell am freeze <process>Bir işlemin donmasını çözmek:
adb shell am unfreeze <process>Bir süreçte tam bellek sıkıştırmasını zorlama:
adb shell am compact full <process>
Logcat incelemesi
Bir işlem dondurucuya her taşındığında veya dondurucudan her çıktığında dondurulmuş ve dondurulmamış girişleri görmek için logcat'i görüntüleyin:
adb logcat | grep -i "\(freezing\|froze\)"Dondurmayı kaldırma nedeni günlükleri, UnfreezeReason protokol arabelleği enum'undan numaralandırılmış değerler çıkarır.
Dumpsys incelemesi
dumpsys activity kullanarak dondurulmuş işlemlerin listesini kontrol edin:
adb shell dumpsys activity | grep -A 20 "Apps frozen:"/sys/fs/cgroup/uid_0/cgroup.freeze dosyasının olup olmadığını kontrol edin.
ApplicationExitInfo
Önceki bir işlem kapatma nedenini sorgulamak için ActivityManager.getHistoricalProcessExitReasons bölümüne bakın.
Bir uygulama işlemi, donmayla ilgili bir sorun nedeniyle sonlandırıldıysa (ör. donmuş durumdayken senkron bağlayıcı işlemi alma) çıkış nedeni ApplicationExitInfo.REASON_FREEZER olarak ayarlanır.
Perfetto izleme
Dondurucuyla ilgili etkinlikler, Perfetto izlemelerinde Freezer adlı bir kanala gönderilir:system_server
FreezeveUnfreezedilimleri, bir işlemin durumunun değiştiğini gösterir.updateAppFreezeStateLSPetkinlikleri, sistem sunucusu dondurma veya çözme kararları vermek için işlem özelliklerini yeniden incelediğinde gösterilir.
Bu etkinlikleri doğrudan Perfetto kullanıcı arayüzünde inceleyebilir veya PerfettoSQL kullanarak analiz edebilirsiniz:
INCLUDE PERFETTO MODULE slices.with_context;
SELECT *
FROM process_slice
WHERE process_name = "system_server"
AND track_name = "Freezer"
AND (name LIKE "Freeze %" OR name LIKE "Unfreeze %");
PerfettoSQL standart kitaplığında, dondurucu etkinlikleri android_freezer_events tablosunda da özetlenir.