Ortalama bir Android kullanıcısı cihazlarına 50'den fazla uygulama yükler (cihazların RAM katmanı arttıkça bu sayı da artar). Ancak bu uygulamaların önemli bir kısmı kullanıcı tarafından uzun süre kullanılmaz.
Uygulamayı hazırda bekletme, kullanıcının birkaç aydır kullanmadığı uygulamaları izinlerin otomatik olarak iptal edilmesi gibi hazırda bekletir. Bu işlem, uygulamayı zorla durdurur ve performans yerine depolama alanı için optimizasyon yaptığımız bir duruma getirir. İzinlerin otomatik olarak iptal edilmesi de bu durumla birlikte gelir ve Ayarlar'da aynı muafiyet ayarını paylaşır. Zorla durdurulan bir uygulama, arka planda işleri veya uyarıları çalıştırmaz ve anlık bildirim gönderemez. Kullanıcı uygulamayı tekrar kullandığında uygulama hazırda bekleme modundan çıkar ve işler/uyarılar/bildirimler normal şekilde tekrar çalışır. Uygulama hazırda bekletme moduna girmeden önce planlanan tüm işlerin/uyarıların/bildirimlerin yeniden planlanması gerekir.
Platformu değiştiren OEM'ler, uygulamayı hazırda bekletme özelliğinin uygulanmasıyla çakışabilir. Örneğin
- Uygulama kullanımı tanımının değiştirilmesi veya AOSP'de bulunmayan bir uygulamayı uyandırma yöntemlerinin kullanılması, uygulama hazırda bekletme özelliğinin doğruluğunu etkileyebilir.
- Uygulamayı hazırda bekletmeye benzer bir OEM'nin tescilli kısıtlama mekanizması da benzer bir amaçla kullanılabilir. Her ikisi de mevcut olsa da bazı çakışmalar olabilir.
CDD, uygulama kullanımına dayalı değişiklikler için mevcut 3.5.1 koşuluna benzer yeni bir koşul grubu tanımlar. Uygulamayı hazırda bekletme işlemi aşağıdaki şartlara tabidir.
Çerçeve kodu şu konumda bulunur:
- repo: platform/frameworks/base
- dizin: services/core/java/com/android/server/apphibernation
Politika mantığı şu konumlarda bulunur:
- repo: platform/packages/modules/Permission
- dizin: PermissionController/src/com/android/permissioncontroller/hibernation
Üst düzey mimari
Uygulama uyku modu sistem hizmeti, kullanıcının seyrek kullandığı 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ı hazırda bekletirken özellikle şunları yaparız:
- İzinleri otomatik olarak iptal etme
- Uygulamayı zorla durdurma
- ODEX ve VDEX dosyalarını silin.
- Uygulama önbelleğini silme
Amacımız, hazırda bekletme özelliğini geri alınabilir bir işlem olarak uygulamaktır. Böylece uygulama, başlatıcı ve uygulama verilerinin bozulmadan kaldığı diğer yüzeyler aracılığıyla kullanıcıya sunulmaya devam eder. Uygulama başlatıldığında, zorla durdurma durumundan geri yüklenir ve ODEX ile VDEX dosyası oluşturma işlemi normal şekilde devam eder.
Planlanan tasarım iki ana bölümden oluşur:
- Bir paketin ne zaman hazırda bekletileceğini belirleme
- Hazırda bekletme paketini optimize etme
Yeni bir sisteme ait hizmet olan AppHibernationService ve bir iş hizmeti olan AppHibernationJobService,, genel karar alma sürecini ve mantığı kontrol eden yapıştırıcıdır.PermissionController
Bir paketin ne zaman hazırda bekletileceğini belirleme işlemi öncelikle UsageStatsService tarafından desteklenir ve AppHibernationJobService tarafından PermissionController içinde yönetilir. Bu politika mantığı, Mainline üzerinden dinamik olarak güncellememize 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'da yeni bir metrik olarak yakalamak için yeni bir sinyal olan bileşen kullanımını eklemeyi planlıyoruz.
Gerçek tasarrufların ve optimizasyonların gerçekleştiği yer, paketin optimize edildiği kısımdır. AppHibernationService Paketi durdurmak, önbellek verilerini silmek, ART yapılarını silmek vb. için sistemin çeşitli bölümleriyle iletişim kurar.
İzin iptali, Android 11 ve önceki sürümlerde otomatik iptal işlevini korumak için doğrudan AppHibernationJobService üzerinden başlatılır.
Kullanıcı deneyimi
Kullanıcıya, hangi uygulamaların hazırda bekletilebileceği konusunda hem bilgi hem de kontrol seçenekleri sunulur.
Otomatik iptal işlemine benzer şekilde, kullanıcı hangi uygulamaların hazırda bekletildiğiyle ilgili bir bildirim alır. Ayrıca, uygulamayı açıp hazırda bekletme modundan çıkarmak veya gerekirse kullanılmayan uygulamayı silmek için doğrudan bildirimden Ayarlar'a gidebilir.
Mevcut izinlerin otomatik olarak iptal edilmesine ilişkin muafiyet intent'iyle, geliştiricinin kullanıcıdan hazırda bekletmeden muafiyet isteme amacını desteklemeye devam ediyoruz.
Geriye dönük uyumluluk
Hazırda bekletmeye özgü özellikler Android 12'den itibaren kullanılabilir. Bu özellik, platform bileşenleri (ör. yeni sistem hizmeti) mevcut olmadığından önceki sürümlerde çalışmaz. 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 Ayarlar'daki Uygulamalar ve bildirimler bölümünde uygulama sayfasına hazırda bekletme açma/kapatma düğmesi eklenir. İzinler alt menüsündeki orijinal otomatik iptal etme açma/kapatma düğmesi ise korunur. Bu açma/kapatma düğmesi, uygulama için genel uygulamayı hazırda bekletme sistemi muafiyetini kontrol eder.
Özelleştirme
Uygulamanın bir kısmı modüler sistem bileşeninin parçası olduğundan iş ortaklarının bu özelliği değiştirmemesi önerilir. İş ortakları, CDD şartlarına uymaları koşuluyla benzer özellikler veya işlevler uygulayabilir.
Android 11 veya daha yeni sürümleri hedefleyen tüm uygulamalarda uygulamayı hazırda bekletme varsayılan olarak AÇIK olmalıdır. Bu, izinlerin otomatik olarak iptal edilmesiyle aynıdır. Ayarların kendisi AÇIK olsa da uygulamayı hazırda bekletme uygulaması, Android 11'i hedefleyen uygulamalar ile Android 12'yi hedefleyen uygulamalar arasında farklılık gösterebilir. Daha net bir ifadeyle, uygulama uyku modu yalnızca Android 11'i hedefleyen uygulamalarda çalışır. Android 12'yi hedefleyen uygulamalarda ise otomatik olarak iptal etme işlevi kullanılır.
Ayrıca, OEM'ler de benzer bir özellik uygulayabilir. Ancak bu özellikler, pil optimizasyonları için çok daha kısa bir zaman ölçeğinde hedeflenir ve OEM'ye özgü olabilir. OEM'ler tarafından geliştirilen benzer uygulama kısıtlama özellikleri, CDD'de tanımlanan mevcut ölçütleri karşıladıkları sürece uygulama hazırda bekletme sistemiyle birlikte kullanılabilir.
Test
Uygulama uyku modunun doğru çalıştığından emin olmak için CTS ve birim testleri vardır.
AutoRevokeTestAppHibernationIntegrationTest