Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Manajemen Daya Aplikasi

Di Android 9 dan lebih tinggi, platform dapat memantau aplikasi untuk perilaku yang berdampak negatif pada masa pakai baterai perangkat. Platform menggunakan dan mengevaluasi aturan penyiapan untuk memberikan aliran UX yang memberi pengguna opsi untuk membatasi aplikasi yang melanggar aturan.

Di Android 8.0 dan yang lebih rendah, ada batasan melalui fitur seperti Istirahatkan, aplikasi standby, batas latar belakang, dan batas lokasi latar belakang. Namun, beberapa aplikasi terus menunjukkan perilaku buruk, beberapa di antaranya dijelaskan di Android vitals . Android 9 memperkenalkan infrastruktur OS yang dapat mendeteksi dan membatasi aplikasi berdasarkan aturan penyiapan yang dapat diperbarui dari waktu ke waktu.

Pembatasan latar belakang

Pengguna dapat membatasi aplikasi, atau sistem mungkin menyarankan aplikasi yang dideteksinya berdampak negatif pada kesehatan perangkat.

Aplikasi yang dibatasi:

  • Masih bisa diluncurkan oleh pengguna.
  • Tidak dapat menjalankan pekerjaan / alarm atau menggunakan jaringan di latar belakang.
  • Tidak dapat menjalankan layanan latar depan.
  • Dapat diubah menjadi aplikasi yang tidak dibatasi oleh pengguna.

Pelaksana perangkat dapat menambahkan batasan tambahan ke aplikasi untuk:

  • Batasi aplikasi dari mulai ulang sendiri.
  • Batasi layanan agar tidak terikat (sangat berisiko).

Aplikasi yang dibatasi di latar belakang tidak diharapkan untuk mengonsumsi sumber daya perangkat apa pun, seperti memori, CPU, dan baterai. Aplikasi yang dibatasi latar belakang seharusnya tidak memengaruhi kesehatan perangkat saat pengguna tidak aktif menggunakan aplikasi tersebut. Namun, aplikasi yang sama diharapkan berfungsi penuh saat pengguna meluncurkan aplikasi.

Menggunakan implementasi kustom

Pelaksana perangkat dapat terus menggunakan metode khusus mereka untuk menerapkan batasan pada aplikasi.

Mengintegrasikan batasan aplikasi

Bagian berikut menjelaskan cara menentukan dan mengintegrasikan batasan aplikasi di perangkat Anda. Jika Anda menggunakan metode pembatasan aplikasi dari Android 8.x atau yang lebih rendah, tinjau bagian berikut dengan cermat untuk mengetahui perubahan di Android 9 dan yang lebih tinggi.

Menyetel tanda AppOpsManager

Saat aplikasi dibatasi, setel tanda yang sesuai di AppOpsManager . Contoh potongan kode dari 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);
    }

Memastikan isBackgroundRestricted menampilkan nilai true

Saat aplikasi dibatasi, pastikan ActivityManager.isBackgroundRestricted() true .

Mencatat alasan pembatasan

Saat aplikasi dibatasi, catat alasan pembatasan tersebut. Contoh cuplikan kode logging dari 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));
  }
.dll

Ganti type dengan nilai dari AnomalyType .

Pelaksana perangkat dapat menggunakan konstanta yang ditentukan di 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;
    }

Saat pengguna atau sistem menghapus batasan aplikasi, Anda harus mencatat alasan untuk menghapus batasan tersebut. Contoh cuplikan kode logging dari 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));
    }
.dll

Menguji batasan aplikasi

Untuk menguji perilaku pembatasan aplikasi di Android 9 dan yang lebih tinggi, gunakan salah satu dari perintah berikut:

  • Batasi aplikasi:
    appops set package-name RUN_ANY_IN_BACKGROUND ignore
  • Ambil aplikasi dari batasan dan pulihkan perilaku default:
    appops set package-name RUN_ANY_IN_BACKGROUND allow
  • Buat aplikasi di latar belakang segera menganggur:
    am make-uid-idle [--user user-id | all | current] package-name
  • Tambahkan paket ke daftar tempwhitelist untuk durasi singkat:
    cmd deviceidle tempwhitelist [-u user] [-d duration] [package package-name]
  • Tambahkan / hapus paket dari daftar putih pengguna:
    cmd deviceidle whitelist [+/-]package-name
  • Periksa status internal jobscheduler dan manajer alarm:
    dumpsys jobscheduler
    dumpsys alarm

Aplikasi siaga

Siaga aplikasi memperpanjang masa pakai baterai dengan menunda aktivitas jaringan latar belakang dan pekerjaan untuk aplikasi yang tidak aktif digunakan pengguna.

Siklus hidup siaga aplikasi

Platform mendeteksi aplikasi yang tidak aktif dan menempatkannya dalam mode siaga hingga pengguna mulai terlibat secara aktif dengan aplikasi tersebut.

Selama fase deteksi , platform mendeteksi bahwa aplikasi tidak aktif saat perangkat tidak mengisi daya dan pengguna belum meluncurkan aplikasi secara langsung atau tidak langsung untuk jumlah waktu jam tertentu serta jumlah waktu layar-on tertentu . (Peluncuran tidak langsung terjadi saat aplikasi latar depan mengakses layanan di aplikasi kedua.)

Selama siaga aplikasi , platform mencegah aplikasi mengakses jaringan lebih dari sekali sehari, menunda sinkronisasi aplikasi dan pekerjaan lain.

Platform keluar dari aplikasi dari standby ketika:

  • Aplikasi menjadi aktif.
  • Perangkat dicolokkan dan diisi.

Aplikasi aktif tidak terpengaruh oleh siaga aplikasi. Sebuah aplikasi aktif jika memiliki:

  • Proses yang saat ini berada di latar depan (baik sebagai aktivitas atau layanan latar depan, atau sedang digunakan oleh aktivitas lain atau layanan latar depan), seperti pendengar notifikasi, layanan aksesibilitas, wallpaper animasi, dll.
  • Pemberitahuan yang dilihat oleh pengguna, seperti di layar kunci atau baki pemberitahuan
  • Diluncurkan secara eksplisit oleh pengguna

Aplikasi tidak aktif jika tidak ada aktivitas di atas yang terjadi selama jangka waktu tertentu.

Menguji aplikasi siaga

Anda dapat menguji aplikasi standby secara manual menggunakan perintah adb berikut:

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