Ortalama bir Android kullanıcısı cihazlarına 50'den fazla uygulama yükler (cihazların RAM sınıfı arttıkça bu sayı da artar). Ancak bu uygulamaların önemli bir kısmı kullanıcı tarafından uzun süre boyunca kullanılmaz.
Uygulama hazırda bekletme özelliği, izinlerin otomatik olarak iptal edilmesine benzer şekilde, kullanıcının birkaç ay boyunca kullanmadığı uygulamaları hazırda bekletir. Bu işlem, uygulamayı zorla durdurur ve performans yerine depolama için optimizasyon yaptığımız bir duruma getirir. İzinlerin otomatik olarak iptal edilmesi özelliği de bu durumla birlikte sunulur ve Ayarlar'da aynı muafiyet ayarını paylaşır. Zorunlu olarak durdurulan uygulamalar arka planda iş veya uyarı çalıştırmaz ve push bildirimi gönderemez. Kullanıcı uygulamayı tekrar kullandığında uygulama uyku modundan çıkar ve işler/uyarılar/bildirimler normal şekilde tekrar çalışır. Uygulama uyku moduna girmeden önce planlanmış tüm işlerin/uyarıların/bildirimlerin yeniden planlanması gerekir.
Platformu değiştiren OEM'ler, uygulamanın uyku moduna geçirilmesi ile çakışabilir. Örneğin
- Uygulama kullanımı tanımını değiştirmek veya AOSP'de bulunmayan bir uygulamayı uyandırmanın yollarını tanıtmak, uygulamanın uyku modunda kalma süresinin doğruluğunu etkileyebilir.
- OEM'lerin uygulamayı uyku moduna alma özelliğine benzer özel kısıtlama mekanizmaları da benzer bir işlev görebilir. Her ikisi de mevcut olabilir ancak bazı noktalarda çakışmalar olabilir.
CDD, mevcut 3.5.1 koşuluna benzer şekilde, uygulama kullanımına dayalı değişiklikler için yeni bir şart grubu belirler. Uygulamanın uyku moduna alınması bu şartlara tabidir.
Çerçeve kodu şu konumlarda bulunur:
- repo: platform/frameworks/base
- dizin: services/core/java/com/android/server/apphibernation
Politika mantığı şu yerlerde bulunur:
- repo: platform/packages/modules/Permission
- dizin: PermissionController/src/com/android/permissioncontroller/hibernation
Üst düzey mimari
Uygulama hazırda bekleme sistemi hizmeti, kullanıcının sık kullanmadığı uygulamaları depolama alanı için optimize eder ve bu uygulamaların arka planda çalışmasını engeller. Bu sonuçları elde etmek için bir uygulamayı uyku moduna aldığımızda özellikle şunları yaparız:
- İzinleri otomatik olarak iptal etme
- Uygulamayı zorla durdurma
- ODEX ve VDEX dosyalarını silme
- Uygulama önbelleğini silme
Hedefimiz, uygulamanın kullanıcı tarafından başlatıcı ve diğer platformlar üzerinden erişilebilir kalması için uyku modunu geri alınabilir bir işlem olarak uygulamaktır. Uygulamayı başlattığınızda, uygulamayı zorla durdurma durumundan geri yükler ve ODEX ile VDEX dosyalarını oluşturmaya normal şekilde devam ederiz.
Planlanan tasarım iki ana bölümden oluşur:
- Bir paketin ne zaman uykuya geçmesi gerektiğini belirleme
- Hazırda bekleme paketini optimize etme
Yeni bir sistem hizmeti olan AppHibernationService
ve bir iş hizmeti olan AppHibernationJobService,
,PermissionController
genel karar verme sürecini ve mantığını kontrol eden bağlayıcıdır.
Bir paketin ne zaman uyku moduna geçmesi gerektiği, temel olarak UsageStatsService
tarafından desteklenir ve PermissionController
'de AppHibernationJobService
tarafından yönetilir. Bu politika mantığı, Mainline üzerinden dinamik olarak güncelleme yapmamıza olanak tanımak için PermissionController
içinde yer alır. Ayrıca, paketin bileşenlerinin (ör. hizmetler, içerik sağlayıcılar) kullanımını UsageStatsService
'te yeni bir metrik olarak yakalamak için yeni bir sinyal (bileşen kullanımı) eklemeyi planlıyoruz.
Gerçek tasarrufların ve optimizasyonların tümü bir paketi optimize ederken gerçekleşir. AppHibernationService
, paketi durdurmak, önbellek verilerini silmek, ART yapılarını silmek vb. için sistemin çeşitli bölümleriyle iletişim kurar.
Android 11 ve önceki sürümleri çalıştıran cihazlarda otomatik iptal işlevini korumak için izin iptal işlemi doğrudan AppHibernationJobService
üzerinden başlatılır.
Kullanıcı deneyimi
Kullanıcıya, hangi uygulamaların uyku moduna alınabileceğiyle ilgili bilgi ve kontroller sağlanır.
Otomatik iptal işlemine benzer şekilde, kullanıcı hangi uygulamaların uyku moduna alındığıyla ilgili bir bildirim alır ve doğrudan bildirimden Ayarlar'a giderek uygulamayı açıp uyku modundan çıkarabilir veya gerekirse kullanılmayan uygulamayı silebilir.
Geliştiricinin, mevcut izinlerin otomatik olarak iptal edilmesinden muafiyet isteğinde bulunmak için kullanıcıdan izin isteme niyetini desteklemeye devam ediyoruz.
Geriye dönük uyumluluk
Uyku moduna özgü özellikler Android 12'den itibaren kullanılabilir. Platform bileşenleri (ör. yeni sistem hizmeti) bulunmadığından bu özellik önceki sürümlerde kullanılamazdı. Otomatik iptal, önceki işletim sistemi sürümlerinde uygulandığı şekilde çalışmaya devam eder.
Android 12'den itibaren, geriye dönük uyumluluğu sağlamak için uygulamanın sayfasında Ayarlar'daki Uygulamalar ve bildirimler bölümünde bir kış uykusu açma/kapatma düğmesi eklenirken orijinal otomatik iptal açma/kapatma düğmesi İzinler alt menüsünde tutulur. Bu açma/kapatma düğmesi, uygulama için genel uygulama hazırda bekleme sistemi muafiyetini kontrol eder.
Özelleştirme
Uygulamanın bir kısmı modüler sistem bileşeninin bir parçası olduğundan iş ortaklarının özelliği değiştirmesi önerilmez. İş ortakları, CDD şartlarını karşıladıkları sürece benzer özellikleri veya işlevleri uygulayabilir.
Uygulamanın kış uykusuna yatması özelliği, Android 11 veya sonraki sürümleri hedefleyen tüm uygulamalarda varsayılan olarak AÇIK olmalıdır. Bu, izinlerin otomatik olarak iptal edilmesiyle aynıdır. Ayarın kendisi AÇIK olsa da uygulamanın hazırda bekleme modu uygulaması, Android 11'i hedefleyen uygulamalar ile Android 12'yi hedefleyen uygulamalar arasında farklılık gösterebilir. Daha ayrıntılı belirtmek gerekirse, uygulama kış uykusu yalnızca Android 11'i hedefleyen uygulamalarda çalışır. Android 12'yi hedefleyen uygulamalarda ise yalnızca otomatik olarak iptal edilir.
Ayrıca OEM'ler de benzer bir özellik uyguluyor olabilir. Ancak bu özellikler, OEM'ye özgü olabilecek pil optimizasyonları için çok daha kısa bir zaman aralığında hedeflenir. OEM'ler tarafından geliştirilen benzer uygulama kısıtlaması özellikleri, CDD'de tanımlanan mevcut ölçütleri karşıladığı sürece uygulama hazırda bekleme sistemiyle birlikte kullanılabilir.
Test
Uygulamanın uyku modunda düzgün çalıştığından emin olmak için CTS ve birim testleri vardır.
AutoRevokeTest
AppHibernationIntegrationTest