Android 9 ve sonraki sürümlerde platform, cihazların pil ömrünü olumsuz etkileyen davranışlar için uygulamaları izleyebilir. Platform, kullanıcılara kuralları ihlal eden uygulamaları kısıtlama seçeneği sunan bir UX akışı sağlamak için kurulum kurallarını kullanır ve değerlendirir.
Android 8.0 ve önceki sürümlerde Doze, uygulama bekleme, arka planda sınırlar ve arka planda konum sınırları gibi özellikler aracılığıyla kısıtlamalar vardı. Ancak bazı uygulamalar, bazıları Android vitals'da açıklanan kötü davranışlar sergilemeye devam etti. Android 9, zamanla güncellenebilen kurulum kurallarına göre uygulamaları algılayabilen ve kısıtlayabilen bir işletim sistemi altyapısı sundu.
Arka plan kısıtlamaları
Kullanıcılar uygulamaları kısıtlayabilir veya sistem, cihazın sağlığını olumsuz etkilediğini tespit ettiği uygulamaları önerebilir.
Kısıtlanmış uygulamalar:
- Yine de kullanıcı tarafından başlatılabilir.
- Arka planda işleri/alarmları çalıştıramıyor veya ağı kullanamıyor.
- Ön plan hizmetleri çalıştırılamıyor.
- Kullanıcı tarafından sınırsız bir uygulamaya değiştirilebilir.
Cihaz uygulayıcıları, uygulamalara aşağıdakiler için ek kısıtlamalar ekleyebilir:
- Uygulamayı kendi kendine yeniden başlatmalardan kısıtlayın.
- Hizmetlerin bağlanmasını kısıtlayın (yüksek riskli).
Arka planda kısıtlı uygulamaların bellek, CPU ve pil gibi cihaz kaynaklarını tüketmesi beklenmez. Arka planda kısıtlamalı uygulamalar, kullanıcı bu uygulamaları aktif olarak kullanmadığında cihaz sağlığını etkilememelidir. Ancak, kullanıcı uygulamaları başlattığında aynı uygulamaların tamamen işlevsel olması beklenir.
Özel uygulamaları kullanma
Cihaz uygulayıcıları, uygulamalara kısıtlamalar uygulamak için kendi özel yöntemlerini kullanmaya devam edebilir.
Uygulama kısıtlamalarını entegre etme
Aşağıdaki bölümler, cihazınızdaki uygulama kısıtlamalarını nasıl tanımlayacağınızı ve entegre edeceğinizi özetlemektedir. Android 8.x veya önceki sürümlerden uygulama kısıtlama yöntemleri kullanıyorsanız, Android 9 ve sonraki sürümlerdeki değişiklikler için aşağıdaki bölümleri yakından inceleyin.
AppOpsManager bayrağını ayarlama
Bir uygulama kısıtlandığında, AppOpsManager
uygun bayrağı ayarlayın. packages/apps/Settings/src/com/android/settings/fuelgauge/BatteryUtils.java
örnek bir kod parçacığı:
public void setForceAppStandby(int uid, String packageName, int mode) { final boolean isPreOApp = isPreOApp(packageName); if (isPreOApp) { // Control whether app could run in the background if it is pre O app mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName, mode); } // Control whether app could run jobs in the background mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName, mode); }
isBackgroundRestricted'in true değerini döndürmesini sağlamak
Bir uygulama kısıtlandığında, ActivityManager.isBackgroundRestricted()
öğesinin true
değerini döndürdüğünden emin olun.
Kısıtlama nedeninin günlüğe kaydedilmesi
Bir uygulama kısıtlandığında, kısıtlamanın nedenlerini günlüğe kaydedin. packages/apps/Settings/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java
günlüğe kaydetmeye ilişkin örnek bir kod parçacığı:
mBatteryUtils.setForceAppStandby(mBatteryUtils.getPackageUid(packageName), packageName,AppOpsManager.MODE_IGNORED); if (CollectionUtils.isEmpty(appInfo.anomalyTypes)) { // Only log context if there is no anomaly type mMetricsFeatureProvider.action(mContext, MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName, Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT,metricsKey)); } else { // Log ALL the anomaly types for (int type : appInfo.anomalyTypes) { mMetricsFeatureProvider.action(mContext, MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName, Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey), Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, type)); }
type
AnomalyType
değerle değiştirin.
Cihaz uygulayıcıları, src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java
içinde tanımlanan sabitleri kullanabilir:
public @interface AnomalyType { // This represents an error condition in the anomaly detection. int NULL = -1; // The anomaly type does not match any other defined type. int UNKNOWN_REASON = 0; // The application held a partial (screen off) wake lock for a period of time that // exceeded the threshold with the screen off when not charging. int EXCESSIVE_WAKELOCK_ALL_SCREEN_OFF = 1; // The application exceeded the maximum number of wakeups while in the background // when not charging. int EXCESSIVE_WAKEUPS_IN_BACKGROUND = 2; // The application did unoptimized Bluetooth scans too frequently when not charging. int EXCESSIVE_UNOPTIMIZED_BLE_SCAN = 3; // The application ran in the background for a period of time that exceeded the // threshold. int EXCESSIVE_BACKGROUND_SERVICE = 4; // The application exceeded the maximum number of wifi scans when not charging. int EXCESSIVE_WIFI_SCAN = 5; // The application exceed the maximum number of flash writes int EXCESSIVE_FLASH_WRITES = 6; // The application used more than the maximum memory, while not spending any time // in the foreground. int EXCESSIVE_MEMORY_IN_BACKGROUND = 7; // The application exceeded the maximum percentage of frames with a render rate of // greater than 700ms. int EXCESSIVE_DAVEY_RATE = 8; // The application exceeded the maximum percentage of frames with a render rate // greater than 16ms. int EXCESSIVE_JANKY_FRAMES = 9; // The application exceeded the maximum cold start time - the app has not been // launched since last system start, died or was killed. int SLOW_COLD_START_TIME = 10; // The application exceeded the maximum hot start time - the app and activity are // already in memory. int SLOW_HOT_START_TIME = 11; // The application exceeded the maximum warm start time - the app was already in // memory but the activity wasn't created yet or was removed from memory. int SLOW_WARM_START_TIME = 12; // The application exceeded the maximum number of syncs while in the background. int EXCESSIVE_BACKGROUND_SYNCS = 13; // The application exceeded the maximum number of gps scans while in the background. int EXCESSIVE_GPS_SCANS_IN_BACKGROUND = 14; // The application scheduled more than the maximum number of jobs while not charging. int EXCESSIVE_JOB_SCHEDULING = 15; // The application exceeded the maximum amount of mobile network traffic while in // the background. int EXCESSIVE_MOBILE_NETWORK_IN_BACKGROUND = 16; // The application held the WiFi lock for more than the maximum amount of time while // not charging. int EXCESSIVE_WIFI_LOCK_TIME = 17; // The application scheduled a job that ran longer than the maximum amount of time. int JOB_TIMED_OUT = 18; // The application did an unoptimized Bluetooth scan that exceeded the maximum // time while in the background. int LONG_UNOPTIMIZED_BLE_SCAN = 19; // The application exceeded the maximum ANR rate while in the background. int BACKGROUND_ANR = 20; // The application exceeded the maximum crash rate while in the background. int BACKGROUND_CRASH_RATE = 21; // The application exceeded the maximum ANR-looping rate. int EXCESSIVE_ANR_LOOPING = 22; // The application exceeded the maximum ANR rate. int EXCESSIVE_ANRS = 23; // The application exceeded the maximum crash rate. int EXCESSIVE_CRASH_RATE = 24; // The application exceeded the maximum crash-looping rate. int EXCESSIVE_CRASH_LOOPING = 25; // The application crashed because no more file descriptors were available. int NUMBER_OF_OPEN_FILES = 26; }
Kullanıcı veya sistem bir uygulamanın kısıtlamalarını kaldırdığında, kısıtlamaları kaldırma nedenlerini günlüğe kaydetmeniz gerekir. packages/apps/Settings/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java
günlüğe kaydetmeye ilişkin örnek bir kod parçacığı:
public void handlePositiveAction(int metricsKey) { final AppInfo appInfo = mUnRestrictAppTip.getUnrestrictAppInfo(); // Clear force app standby, then app can run in the background mBatteryUtils.setForceAppStandby(appInfo.uid, appInfo.packageName, AppOpsManager.MODE_ALLOWED); mMetricsFeatureProvider.action(mContext, MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, appInfo.packageName, Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey)); }
Uygulama kısıtlamalarını test etme
Android 9 ve sonraki sürümlerde uygulama kısıtlamalarının davranışını test etmek için aşağıdaki komutlardan birini kullanın:
- Bir uygulamayı kısıtlamaya koyun:
appops set package-name RUN_ANY_IN_BACKGROUND ignore
- Bir uygulamayı kısıtlamadan çıkarın ve varsayılan davranışı geri yükleyin:
appops set package-name RUN_ANY_IN_BACKGROUND allow
- Arka planda bir uygulamayı hemen boşta bırakın:
am make-uid-idle [--user user-id | all | current] package-name
- Kısa bir süre için
tempwhitelist
bir paket ekleyin:cmd deviceidle tempwhitelist [-u user] [-d duration] [package package-name]
- Kullanıcı beyaz listesinden bir paket ekleyin/kaldırın:
cmd deviceidle whitelist [+/-]package-name
- İş
jobscheduler
ve alarm yöneticisinin dahili durumunu kontrol edin:dumpsys jobscheduler
dumpsys alarm
Uygulama bekleme
Uygulama bekleme, arka planda ağ etkinliğini ve kullanıcının aktif olarak kullanmadığı uygulamalar için işleri erteleyerek pil ömrünü uzatır.
Uygulama bekleme yaşam döngüsü
Platform, etkin olmayan uygulamaları algılar ve kullanıcı uygulamayla aktif olarak etkileşime geçene kadar bunları uygulama beklemeye alır.
Algılama aşaması sırasında platform, cihaz şarj olmadığında ve kullanıcı uygulamayı belirli bir saat süresi ve belirli bir ekran açık süresi boyunca doğrudan veya dolaylı olarak başlatmadığında bir uygulamanın etkin olmadığını algılar. . (Dolaylı başlatmalar, bir ön plan uygulaması ikinci bir uygulamadaki bir hizmete eriştiğinde gerçekleşir.)
Uygulama bekleme sırasında platform, uygulamaların ağa günde bir kereden fazla erişmesini engelleyerek uygulama senkronizasyonlarını ve diğer işleri erteler.
Platform, aşağıdaki durumlarda uygulamadan bekleme modundan çıkar:
- Uygulama aktif hale gelir.
- Cihaz prize takılı ve şarj oluyor.
Etkin uygulamalar, uygulama bekleme modundan etkilenmez. Bir uygulama şu durumlarda etkindir :
- Bildirim dinleyicisi, erişilebilirlik hizmetleri, canlı duvar kağıdı vb. gibi şu anda ön planda olan (bir etkinlik veya ön plan hizmeti olarak veya başka bir etkinlik veya ön plan hizmeti tarafından kullanılan) bir süreç.
- Kilit ekranı veya bildirim tepsisi gibi kullanıcı tarafından görüntülenen bir bildirim
- Kullanıcı tarafından açıkça başlatıldı
Bir süre boyunca yukarıdaki etkinliklerden hiçbiri gerçekleşmediyse bir uygulama etkin değildir .
Uygulama bekleme modunu test etme
Aşağıdaki adb
komutlarını kullanarak uygulama bekleme modunu manuel olarak test edebilirsiniz:
adb shell dumpsys battery unplug
adb shell am set-idle package-name true
adb shell am set-idle package-name false
adb shell am get-idle package-name