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