• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.os.health;
18 
19 import android.content.Context;
20 import android.os.BatteryStats;
21 import android.os.Process;
22 import android.os.RemoteException;
23 import android.os.ServiceManager;
24 
25 import com.android.internal.app.IBatteryStats;
26 
27 /**
28  * Provides access to data about how various system resources are used by applications.
29  * @more
30  * <p>
31  * If you are going to be using this class to log your application's resource usage,
32  * please consider the amount of resources (battery, network, etc) that will be used
33  * by the logging itself.  It can be substantial.
34  * <p>
35  * <b>Battery Usage</b><br>
36  * The statistics related to power (battery) usage are recorded since the device
37  * was last unplugged. It is expected that applications schedule more work to do
38  * while the device is plugged in (e.g. using {@link android.app.job.JobScheduler
39  * JobScheduler}), and while that can affect charging rates, it is still preferable
40  * to actually draining the battery.
41  */
42 public class SystemHealthManager {
43     private final IBatteryStats mBatteryStats;
44 
45     /**
46      * Construct a new SystemHealthManager object.
47      * @hide
48      */
SystemHealthManager()49     public SystemHealthManager() {
50         mBatteryStats = IBatteryStats.Stub.asInterface(
51             ServiceManager.getService(BatteryStats.SERVICE_NAME));
52     }
53 
54     /**
55      * Obtain a SystemHealthManager object for the supplied context.
56      *
57      * @hide
58      */
from(Context context)59     public static SystemHealthManager from(Context context) {
60         return (SystemHealthManager)context.getSystemService(Context.SYSTEM_HEALTH_SERVICE);
61     }
62 
63     /**
64      * Return a {@link HealthStats} object containing a snapshot of system health
65      * metrics for the given uid (user-id, which in usually corresponds to application).
66      * @more
67      *
68      * An application must hold the {@link android.Manifest.permission#BATTERY_STATS
69      * android.permission.BATTERY_STATS} permission in order to retrieve any HealthStats
70      * other than its own.
71      *
72      * @param uid User ID for a given application.
73      * @return A {@link HealthStats} object containing the metrics for the requested
74      * application. The keys for this HealthStats object will be from the {@link UidHealthStats}
75      * class.
76      * @see Process#myUid() Process.myUid()
77      */
takeUidSnapshot(int uid)78     public HealthStats takeUidSnapshot(int uid) {
79         try {
80             final HealthStatsParceler parceler = mBatteryStats.takeUidSnapshot(uid);
81             return parceler.getHealthStats();
82         } catch (RemoteException ex) {
83             throw new RuntimeException(ex);
84         }
85     }
86 
87     /**
88      * Return a {@link HealthStats} object containing a snapshot of system health
89      * metrics for the application calling this API. This method is the same as calling
90      * {@code takeUidSnapshot(Process.myUid())}.
91      *
92      * @return A {@link HealthStats} object containing the metrics for this application. The keys
93      * for this HealthStats object will be from the {@link UidHealthStats} class.
94      */
takeMyUidSnapshot()95     public HealthStats takeMyUidSnapshot() {
96         return takeUidSnapshot(Process.myUid());
97     }
98 
99     /**
100      * Return a {@link HealthStats} object containing a snapshot of system health
101      * metrics for the given uids (user-id, which in usually corresponds to application).
102      * @more
103      *
104      * An application must hold the {@link android.Manifest.permission#BATTERY_STATS
105      * android.permission.BATTERY_STATS} permission in order to retrieve any HealthStats
106      * other than its own.
107      *
108      * @param uids An array of User IDs to retrieve.
109      * @return An array of {@link HealthStats} objects containing the metrics for each of
110      * the requested uids. The keys for this HealthStats object will be from the
111      * {@link UidHealthStats} class.
112      */
takeUidSnapshots(int[] uids)113     public HealthStats[] takeUidSnapshots(int[] uids) {
114         try {
115             final HealthStatsParceler[] parcelers = mBatteryStats.takeUidSnapshots(uids);
116             final HealthStats[] results = new HealthStats[uids.length];
117             final int N = uids.length;
118             for (int i=0; i<N; i++) {
119                 results[i] = parcelers[i].getHealthStats();
120             }
121             return results;
122         } catch (RemoteException ex) {
123             throw new RuntimeException(ex);
124         }
125     }
126 
127 }
128 
129