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.
Uygulama uyku modu, kullanıcının birkaç aydır kullanmadığı uygulamaları izinlerin otomatik olarak iptal edilmesi gibi uykuya alır. Bu işlem, uygulamayı zorla durdurur ve performans yerine depolama 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ı kullanır. Zorla durdurulan uygulamalar arka planda işleri çalıştırmaz veya uyarı göndermez ve push bildirimi 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 uyku moduna girmeden önce planlanan tüm işlerin/uyarıların/bildirimlerin yeniden planlanması gerekir.
Platformu değiştiren OEM'ler, uygulama uyku moduna alma özelliğinin uygulanmasıyla çakışabilir. Örneğin
- Uygulama kullanım tanımının değiştirilmesi veya AOSP'de bulunmayan uygulama uyandırma yöntemlerinin kullanılması, uygulama uyku modunun doğruluğunu etkileyebilir.
- Uygulama uyku moduna 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. Uygulama uyku moduna alma 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 uykuya alma sistemi 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 sistem hizmeti 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 uyku moduna alınması gerektiğini belirleme işlemi öncelikle UsageStatsService
tarafından desteklenir ve PermissionController
'deki AppHibernationJobService
tarafından 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 tümü paketin optimize edilmesiyle sağlanır. 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ümlerde otomatik iptal işlevinin korunması için izin iptali 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 edilmesinden muafiyet isteğiyle, geliştiricinin kullanıcıdan hazırda bekleme özelliğinden 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ışamaz. 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. Bu sırada, İzinler alt menüsündeki orijinal otomatik iptal açma/kapatma düğmesi korunur. Bu açma/kapatma düğmesi, uygulama için genel uygulama uyku modundan muafiyet sistemini 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 uygulama uyku modunun varsayılan olarak ETKİN olması gerekir. Bu, izinlerin otomatik olarak iptal edilmesiyle aynıdır. Ayarların kendisi AÇIK olsa da uygulama uyku moduna alma özelliği, 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 bu özellik, temelde yalnızca otomatik olarak iptal etme işlevini görü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 uyutma sistemiyle birlikte kullanılabilir.
Test
Uygulama hazırda bekletme özelliğinin doğru çalıştığından emin olmak için CTS ve birim testleri vardır.
AutoRevokeTest
AppHibernationIntegrationTest