Uygulama güç yönetimi

Android 9 ve sonraki sürümlerde platform, uygulamaların davranışını izleyebilirsiniz. cihazların pil ömrünü olumsuz yönde etkiler. Platformda kullanılan ve kullanıcılara kampanya izleme seçeneği sunan bir kullanıcı deneyimi akışı sağlamak için kurulum kurallarını değerlendirir. Kuralları ihlal eden uygulamaları kısıtlayabilirsiniz.

Android 8.0 ve önceki sürümlerde özellikler nedeniyle kısıtlamalar vardı Doz, uygulama bekleme modu, arka plan sınırları ve arka planda konumu gibi anlamına gelir. Ancak bazı uygulamalar kötü davranış sergilemeye devam ederken Android vitals bölümünde açıklanmıştır. Android 9, algılayabilen ve kısıtlayabilen bir işletim sistemi altyapısı sundu zaman içinde güncellenebilen kurulum kurallarına dayalı uygulamalar.

Arka plan kısıtlamaları

Kullanıcılar uygulamaları kısıtlayabilir veya sistem, cihazının sağlığını olumsuz yönde etkilediğini tespit eder.

Kısıtlanmış uygulamalar:

  • Yine de kullanıcı tarafından başlatılabilir.
  • İşleri/alarmları çalıştıramaz veya arka planda ağı kullanamaz.
  • Ön plan hizmetleri çalıştırılamıyor.
  • Kullanıcı tarafından kısıtlanmamış bir uygulamaya dönüştürülebilir.

Cihaz uygulamaları, aşağıdaki işlemler için uygulamalara ek kısıtlamalar ekleyebilir:

  • Uygulamanın kendi kendine yeniden başlatılmasını kısıtlayın.
  • Hizmetlerin bağlanmasını kısıtlayın (çok riskli).

Arka planda kısıtlanmış uygulamaların herhangi bir cihaz kaynağını tüketmesi beklenmez. Örneğin: ve pili kullanıyor. Arka planda kısıtlanmış uygulamalar şu durumlarda cihaz sağlığını etkilemez: Kullanıcı bu uygulamaları aktif olarak kullanmıyorsa. Ancak aynı uygulamaların Kullanıcı uygulamaları başlattığında tam olarak işlevsel olmalıdır.

Özel uygulamaları kullanma

Cihaz uygulamaları, uygulamalara kısıtlamalar uygulamak için kendi özel yöntemlerini kullanmaya devam edebilir.

Uygulama kısıtlamalarını entegre edin

Aşağıdaki bölümlerde, uygulamanın nasıl tanımlanıp entegre edileceği açıklanmaktadır bazı kısıtlamalar olduğunu unutmayın. Uygulama kısıtlama yöntemlerini kullanıyorsanız veya başka bir sürümün yüklü olduğu bir sürümü kullanıyorsanız aşağıdaki bölümleri inceleyerek Android 9 ve sonraki sürümlerdeki değişiklikler.

AppOpsManager işaretini ayarlayın

Bir uygulama kısıtlandığında, AppOpsManager Şu kaynaktan bir örnek kod snippet'i: packages/apps/Settings/src/com/android/settings/fuelgauge/BatteryUtils.java:

   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 doğru değerini döndürdüğünden emin olun.

Bir uygulama kısıtlandığında, ActivityManager.isBackgroundRestricted(), true değerini döndürür.

Kısıtlama nedenini günlüğe kaydedin

Bir uygulama kısıtlandığında kısıtlamanın nedenlerini günlüğe kaydedin. şuradan günlük kaydının örnek kod snippet'i packages/apps/Settings/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java:

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 yerine AnomalyType değerini girin.

Cihaz uygulamaları, src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java:

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ın kaldırılma nedenlerini günlüğe kaydederiz. packages/apps/Settings/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java:

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));
    }

Test uygulaması kısıtlamaları

Android 9 ve sonraki sürümlerde uygulama kısıtlamalarının davranışını test etmek için şu komutları kullanın:

  • Uygulamalara kısıtlama getirme:
    appops set package-name RUN_ANY_IN_BACKGROUND ignore
  • Uygulamayı kısıtlamadan çıkarıp varsayılan davranışı geri yükleyin:
    appops set package-name RUN_ANY_IN_BACKGROUND allow
  • Arka plandaki bir uygulamanın hemen boşta kalmasını sağlamak için:
    am make-uid-idle [--user user-id | all | current] package-name
  • tempwhitelist için kısa bir süre için paket ekleyin:
    cmd deviceidle tempwhitelist [-u user] [-d duration] [package package-name]
  • Kullanıcı beyaz listesine paket ekleme/kaldırma:
    cmd deviceidle whitelist [+/-]package-name
  • jobscheduler cihazının ve alarm yöneticisinin dahili durumunu kontrol edin:
    dumpsys jobscheduler
    dumpsys alarm

Uygulamayı beklemeye alma

Uygulamayı beklemeye alma özelliği, arka plan ağını erteleyerek pil ömrünü uzatır kullanıcının aktif olarak kullanmadığı uygulamalardaki etkinlik ve işler.

Uygulamayı bekleme yaşam döngüsü

Platform, etkin olmayan uygulamaları tespit edip uygulamaya yerleştirir kullanıcı uygulamayla aktif bir şekilde etkileşim kurmaya başlayana kadar bekleme modunda kalır.

Algılama aşamasında, platform şu durumlarda uygulamanın etkin olmadığını tespit eder: cihaz şarj olmuyor ve kullanıcı uygulamayı doğrudan başlatmamışsa veya süre ve belirli bir ekranda görünme süresi için dolaylı olarak yol açabilir. (Dolaylı başlatmalar, ön plan uygulaması ikinci bir uygulamadaki bir hizmete eriştiğinde gerçekleşir.)

Platform, uygulamayı bekleme sırasında uygulamaların ağa daha fazla erişmesini engeller günde bir kereden fazla, uygulama senkronizasyonu ve diğer işleri ertelemek.

Platform, aşağıdaki durumlarda uygulamadan bekleme modundan çıkar:

  • Uygulama etkin hale gelir.
  • Cihaz fişe takılı ve şarj oluyor.

Etkin uygulamalar, uygulamayı bekleme modundan etkilenmez. Bir uygulama aşağıdaki durumlarda etkin olur:

  • Şu anda ön planda olan bir işlem (etkinlik veya ön plan hizmeti tarafından kullanılan veya başka bir etkinlik ya da ön plan hizmeti tarafından kullanılan içerikler, bildirim dinleyici, erişilebilirlik hizmetleri, animasyonlu duvar kağıdı vb. gibi
  • Kullanıcı tarafından görüntülenen bir bildirim (örneğin, kilit ekranı veya Bildirim tepsisi
  • Kullanıcı tarafından açıkça başlatılmış olmalıdır.

Yukarıdaki etkinliklerden hiçbiri belirli bir süre boyunca gerçekleşmemişse uygulama etkin değil demektir. kazanıyor.

Test uygulamasını bekleme modu

Uygulama bekleme modunu aşağıdaki adb ile manuel olarak test edebilirsiniz komutları:

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