blob: 6e259ea2642cff7b7ad2c1f1cc1608820989b22e [file] [log] [blame]
/*
* 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.compat.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 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);
}
}
}