Add Bluetooth atoms

+ refactor pullers in StatsCompanionService to be more modular
+ rename CpuSuspendTime and CpuIdleTime to SystemElapsedRealtime
  and SystemUptime

Test: will add cts test
Change-Id: I463103fb271511cef4e0f877c20fd167fe8b173b
This commit is contained in:
Chenjie Yu
2018-01-24 10:34:48 -08:00
parent 94713885ae
commit 9d7720b5b4
3 changed files with 333 additions and 226 deletions

View File

@@ -94,26 +94,27 @@ message Atom {
}
// Pulled events will start at field 10000.
// Next: 10019
oneof pulled {
WifiBytesTransfer wifi_bytes_transfer = 10000;
WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001;
MobileBytesTransfer mobile_bytes_transfer = 10002;
MobileBytesTransferByFgBg mobile_bytes_transfer_by_fg_bg = 10003;
BluetoothBytesTransfer bluetooth_bytes_transfer = 10006;
KernelWakelock kernel_wakelock = 10004;
SubsystemSleepState subsystem_sleep_state = 10005;
// 10006 and 10007 are free to use.
CpuTimePerFreq cpu_time_per_freq = 10008;
CpuTimePerUid cpu_time_per_uid = 10009;
CpuTimePerUidFreq cpu_time_per_uid_freq = 10010;
WifiActivityEnergyInfo wifi_activity_energy_info = 10011;
ModemActivityInfo modem_activity_info = 10012;
ProcessMemoryStat process_memory_stat = 10013;
CpuSuspendTime cpu_suspend_time = 10014;
CpuIdleTime cpu_idle_time = 10015;
BluetoothActivityInfo bluetooth_activity_info = 10007;
SystemElapsedRealtime system_elapsed_realtime = 10014;
SystemUptime system_uptime = 10015;
CpuActiveTime cpu_active_time = 10016;
CpuClusterTime cpu_cluster_time = 10017;
DiskSpace disk_space = 10018;
SystemUptime system_uptime = 10019;
}
}
@@ -998,6 +999,20 @@ message MobileBytesTransferByFgBg {
optional int64 tx_packets = 6;
}
/**
* Pulls bytes transferred via bluetooth. It is pulled from Bluetooth controller.
*
* Pulled from:
* StatsCompanionService
*/
message BluetoothBytesTransfer {
optional int32 uid = 1;
optional int64 rx_bytes = 2;
optional int64 tx_bytes = 3;
}
/**
* Pulls the kernel wakelock durations. This atom is adapted from
* android/internal/os/KernelWakelockStats.java
@@ -1168,6 +1183,25 @@ message ModemActivityInfo {
optional uint64 energy_used = 10;
}
/**
* Pulls Bluetooth Activity Energy Info
* Note: BluetoothBytesTransfer is pulled at the same time from the controller.
*/
message BluetoothActivityInfo {
// timestamp(wall clock) of record creation
optional uint64 timestamp_ms = 1;
// bluetooth stack state
optional int32 bluetooth_stack_state = 2;
// tx time in ms
optional uint64 controller_tx_time_ms = 3;
// rx time in ms
optional uint64 controller_rx_time_ms = 4;
// idle time in ms
optional uint64 controller_idle_time_ms = 5;
// product of current(mA), voltage(V) and time(ms)
optional uint64 energy_used = 6;
}
/*
* Logs the memory stats for a process
*/
@@ -1214,17 +1248,21 @@ message LmkEventOccurred {
}
/*
* Cpu syspend time for cpu power calculation.
* Elapsed real time from SystemClock.
*/
message CpuSuspendTime {
optional uint64 time = 1;
message SystemElapsedRealtime {
optional uint64 time_ms = 1;
}
/*
* Cpu idle time for cpu power calculation.
* Up time from SystemClock.
*/
message CpuIdleTime {
optional uint64 time = 1;
message SystemUptime {
// Milliseconds since the system was booted.
// This clock stops when the system enters deep sleep (CPU off, display dark, device waiting
// for external input).
// It is not affected by clock scaling, idle, or other power saving mechanisms.
optional uint64 uptime_ms = 1;
}
/*
@@ -1268,14 +1306,3 @@ message DiskSpace {
// available bytes in download cache or temp directories
optional uint64 temp_available_bytes = 3;
}
/*
* Pulls system up time.
*/
message SystemUptime {
// Milliseconds since the system was booted.
// This clock stops when the system enters deep sleep (CPU off, display dark, device waiting
// for external input).
// It is not affected by clock scaling, idle, or other power saving mechanisms.
optional uint64 uptime_ms = 1;
}

View File

@@ -64,12 +64,20 @@ StatsPullerManagerImpl::StatsPullerManagerImpl()
mPullers.insert({android::util::CPU_TIME_PER_FREQ, make_shared<StatsCompanionServicePuller>(android::util::CPU_TIME_PER_FREQ)});
mPullers.insert({android::util::CPU_TIME_PER_UID, make_shared<CpuTimePerUidPuller>()});
mPullers.insert({android::util::CPU_TIME_PER_UID_FREQ, make_shared<CpuTimePerUidFreqPuller>()});
mPullers.insert({android::util::CPU_SUSPEND_TIME, make_shared<StatsCompanionServicePuller>(android::util::CPU_SUSPEND_TIME)});
mPullers.insert({android::util::CPU_IDLE_TIME, make_shared<StatsCompanionServicePuller>(android::util::CPU_IDLE_TIME)});
mPullers.insert({android::util::DISK_SPACE,
make_shared<StatsCompanionServicePuller>(android::util::DISK_SPACE)});
mPullers.insert(
{android::util::SYSTEM_ELAPSED_REALTIME,
make_shared<StatsCompanionServicePuller>(android::util::SYSTEM_ELAPSED_REALTIME)});
mPullers.insert({android::util::SYSTEM_UPTIME,
make_shared<StatsCompanionServicePuller>(android::util::SYSTEM_UPTIME)});
mPullers.insert({android::util::DISK_SPACE,
make_shared<StatsCompanionServicePuller>(android::util::DISK_SPACE)});
mPullers.insert(
{android::util::BLUETOOTH_ACTIVITY_INFO,
make_shared<StatsCompanionServicePuller>(android::util::BLUETOOTH_ACTIVITY_INFO)});
mPullers.insert(
{android::util::BLUETOOTH_BYTES_TRANSFER,
make_shared<StatsCompanionServicePuller>(android::util::BLUETOOTH_BYTES_TRANSFER)});
mPullers.insert(
{android::util::WIFI_ACTIVITY_ENERGY_INFO,
make_shared<StatsCompanionServicePuller>(android::util::WIFI_ACTIVITY_ENERGY_INFO)});

View File

@@ -19,6 +19,9 @@ import android.annotation.Nullable;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.StatsManager;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.UidTraffic;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -30,7 +33,6 @@ import android.content.pm.UserInfo;
import android.net.NetworkStats;
import android.net.wifi.IWifiManager;
import android.net.wifi.WifiActivityEnergyInfo;
import android.os.StatsDimensionsValue;
import android.os.BatteryStatsInternal;
import android.os.Binder;
import android.os.Bundle;
@@ -43,6 +45,7 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StatFs;
import android.os.StatsDimensionsValue;
import android.os.StatsLogEventWrapper;
import android.os.SynchronousResultReceiver;
import android.os.SystemClock;
@@ -110,6 +113,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
new StatFs(Environment.getRootDirectory().getAbsolutePath());
private final StatFs mStatFsTemp =
new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath());
private final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
public StatsCompanionService(Context context) {
super();
@@ -402,24 +406,23 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
}
}
private StatsLogEventWrapper[] addNetworkStats(int tag, NetworkStats stats, boolean withFGBG) {
List<StatsLogEventWrapper> ret = new ArrayList<>();
int size = stats.size();
NetworkStats.Entry entry = new NetworkStats.Entry(); // For recycling
for (int j = 0; j < size; j++) {
stats.getValues(j, entry);
StatsLogEventWrapper e = new StatsLogEventWrapper(tag, withFGBG ? 6 : 5);
e.writeInt(entry.uid);
if (withFGBG) {
e.writeInt(entry.set);
}
e.writeLong(entry.rxBytes);
e.writeLong(entry.rxPackets);
e.writeLong(entry.txBytes);
e.writeLong(entry.txPackets);
ret.add(e);
private void addNetworkStats(
int tag, List<StatsLogEventWrapper> ret, NetworkStats stats, boolean withFGBG) {
int size = stats.size();
NetworkStats.Entry entry = new NetworkStats.Entry(); // For recycling
for (int j = 0; j < size; j++) {
stats.getValues(j, entry);
StatsLogEventWrapper e = new StatsLogEventWrapper(tag, withFGBG ? 6 : 5);
e.writeInt(entry.uid);
if (withFGBG) {
e.writeInt(entry.set);
}
return ret.toArray(new StatsLogEventWrapper[ret.size()]);
e.writeLong(entry.rxBytes);
e.writeLong(entry.rxPackets);
e.writeLong(entry.txBytes);
e.writeLong(entry.txPackets);
ret.add(e);
}
}
/**
@@ -485,220 +488,289 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
return null;
}
private void pullKernelWakelock(int tagId, List<StatsLogEventWrapper> pulledData) {
final KernelWakelockStats wakelockStats =
mKernelWakelockReader.readKernelWakelockStats(mTmpWakelockStats);
for (Map.Entry<String, KernelWakelockStats.Entry> ent : wakelockStats.entrySet()) {
String name = ent.getKey();
KernelWakelockStats.Entry kws = ent.getValue();
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 4);
e.writeString(name);
e.writeInt(kws.mCount);
e.writeInt(kws.mVersion);
e.writeLong(kws.mTotalTime);
pulledData.add(e);
}
}
private void pullWifiBytesTransfer(int tagId, List<StatsLogEventWrapper> pulledData) {
long token = Binder.clearCallingIdentity();
try {
// TODO: Consider caching the following call to get BatteryStatsInternal.
BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class);
String[] ifaces = bs.getWifiIfaces();
if (ifaces.length == 0) {
return;
}
NetworkStatsFactory nsf = new NetworkStatsFactory();
// Combine all the metrics per Uid into one record.
NetworkStats stats =
nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces, NetworkStats.TAG_NONE, null)
.groupedByUid();
addNetworkStats(tagId, pulledData, stats, false);
} catch (java.io.IOException e) {
Slog.e(TAG, "Pulling netstats for wifi bytes has error", e);
} finally {
Binder.restoreCallingIdentity(token);
}
}
private void pullWifiBytesTransferByFgBg(int tagId, List<StatsLogEventWrapper> pulledData) {
long token = Binder.clearCallingIdentity();
try {
BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class);
String[] ifaces = bs.getWifiIfaces();
if (ifaces.length == 0) {
return;
}
NetworkStatsFactory nsf = new NetworkStatsFactory();
NetworkStats stats = rollupNetworkStatsByFGBG(
nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces, NetworkStats.TAG_NONE, null));
addNetworkStats(tagId, pulledData, stats, true);
} catch (java.io.IOException e) {
Slog.e(TAG, "Pulling netstats for wifi bytes w/ fg/bg has error", e);
} finally {
Binder.restoreCallingIdentity(token);
}
}
private void pullMobileBytesTransfer(int tagId, List<StatsLogEventWrapper> pulledData) {
long token = Binder.clearCallingIdentity();
try {
BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class);
String[] ifaces = bs.getMobileIfaces();
if (ifaces.length == 0) {
return;
}
NetworkStatsFactory nsf = new NetworkStatsFactory();
// Combine all the metrics per Uid into one record.
NetworkStats stats =
nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces, NetworkStats.TAG_NONE, null)
.groupedByUid();
addNetworkStats(tagId, pulledData, stats, false);
} catch (java.io.IOException e) {
Slog.e(TAG, "Pulling netstats for mobile bytes has error", e);
} finally {
Binder.restoreCallingIdentity(token);
}
}
private void pullBluetoothBytesTransfer(int tagId, List<StatsLogEventWrapper> pulledData) {
BluetoothActivityEnergyInfo info = pullBluetoothData();
for (UidTraffic traffic : info.getUidTraffic()) {
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3);
e.writeInt(traffic.getUid());
e.writeLong(traffic.getRxBytes());
e.writeLong(traffic.getTxBytes());
pulledData.add(e);
}
}
private void pullMobileBytesTransferByFgBg(int tagId, List<StatsLogEventWrapper> pulledData) {
long token = Binder.clearCallingIdentity();
try {
BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class);
String[] ifaces = bs.getMobileIfaces();
if (ifaces.length == 0) {
return;
}
NetworkStatsFactory nsf = new NetworkStatsFactory();
NetworkStats stats = rollupNetworkStatsByFGBG(
nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces, NetworkStats.TAG_NONE, null));
addNetworkStats(tagId, pulledData, stats, true);
} catch (java.io.IOException e) {
Slog.e(TAG, "Pulling netstats for mobile bytes w/ fg/bg has error", e);
} finally {
Binder.restoreCallingIdentity(token);
}
}
private void pullCpuTimePerFreq(int tagId, List<StatsLogEventWrapper> pulledData) {
for (int cluster = 0; cluster < mKernelCpuSpeedReaders.length; cluster++) {
long[] clusterTimeMs = mKernelCpuSpeedReaders[cluster].readAbsolute();
if (clusterTimeMs != null) {
for (int speed = clusterTimeMs.length - 1; speed >= 0; --speed) {
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3);
e.writeInt(cluster);
e.writeInt(speed);
e.writeLong(clusterTimeMs[speed]);
pulledData.add(e);
}
}
}
}
private void pullWifiActivityEnergyInfo(int tagId, List<StatsLogEventWrapper> pulledData) {
long token = Binder.clearCallingIdentity();
if (mWifiManager == null) {
mWifiManager =
IWifiManager.Stub.asInterface(ServiceManager.getService(Context.WIFI_SERVICE));
}
if (mWifiManager != null) {
try {
SynchronousResultReceiver wifiReceiver = new SynchronousResultReceiver("wifi");
mWifiManager.requestActivityInfo(wifiReceiver);
final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver);
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 6);
e.writeLong(wifiInfo.getTimeStamp());
e.writeInt(wifiInfo.getStackState());
e.writeLong(wifiInfo.getControllerTxTimeMillis());
e.writeLong(wifiInfo.getControllerRxTimeMillis());
e.writeLong(wifiInfo.getControllerIdleTimeMillis());
e.writeLong(wifiInfo.getControllerEnergyUsed());
pulledData.add(e);
} catch (RemoteException e) {
Slog.e(TAG, "Pulling wifiManager for wifi controller activity energy info has error", e);
} finally {
Binder.restoreCallingIdentity(token);
}
}
}
private void pullModemActivityInfo(int tagId, List<StatsLogEventWrapper> pulledData) {
long token = Binder.clearCallingIdentity();
if (mTelephony == null) {
mTelephony = TelephonyManager.from(mContext);
}
if (mTelephony != null) {
SynchronousResultReceiver modemReceiver = new SynchronousResultReceiver("telephony");
mTelephony.requestModemActivityInfo(modemReceiver);
final ModemActivityInfo modemInfo = awaitControllerInfo(modemReceiver);
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 6);
e.writeLong(modemInfo.getTimestamp());
e.writeLong(modemInfo.getSleepTimeMillis());
e.writeLong(modemInfo.getIdleTimeMillis());
e.writeLong(modemInfo.getTxTimeMillis()[0]);
e.writeLong(modemInfo.getTxTimeMillis()[1]);
e.writeLong(modemInfo.getTxTimeMillis()[2]);
e.writeLong(modemInfo.getTxTimeMillis()[3]);
e.writeLong(modemInfo.getTxTimeMillis()[4]);
e.writeLong(modemInfo.getRxTimeMillis());
e.writeLong(modemInfo.getEnergyUsed());
pulledData.add(e);
}
}
private void pullBluetoothActivityInfo(int tagId, List<StatsLogEventWrapper> pulledData) {
BluetoothActivityEnergyInfo info = pullBluetoothData();
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 6);
e.writeLong(info.getTimeStamp());
e.writeInt(info.getBluetoothStackState());
e.writeLong(info.getControllerTxTimeMillis());
e.writeLong(info.getControllerRxTimeMillis());
e.writeLong(info.getControllerIdleTimeMillis());
e.writeLong(info.getControllerEnergyUsed());
pulledData.add(e);
}
private synchronized BluetoothActivityEnergyInfo pullBluetoothData() {
if (adapter != null) {
SynchronousResultReceiver bluetoothReceiver = null;
bluetoothReceiver = new SynchronousResultReceiver("bluetooth");
adapter.requestControllerActivityEnergyInfo(bluetoothReceiver);
return awaitControllerInfo(bluetoothReceiver);
} else {
return null;
}
}
private void pullSystemElapsedRealtime(int tagId, List<StatsLogEventWrapper> pulledData) {
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 1);
e.writeLong(SystemClock.elapsedRealtime());
pulledData.add(e);
}
private void pullDiskSpace(int tagId, List<StatsLogEventWrapper> pulledData) {
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3);
e.writeLong(mStatFsData.getAvailableBytes());
e.writeLong(mStatFsSystem.getAvailableBytes());
e.writeLong(mStatFsTemp.getAvailableBytes());
pulledData.add(e);
}
private void pullSystemUpTime(int tagId, List<StatsLogEventWrapper> pulledData) {
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 1);
e.writeLong(SystemClock.uptimeMillis());
pulledData.add(e);
}
/**
*
* Pulls wifi controller activity energy info from WiFiManager
* Pulls various data.
*/
@Override // Binder call
public StatsLogEventWrapper[] pullData(int tagId) {
enforceCallingPermission();
if (DEBUG)
Slog.d(TAG, "Pulling " + tagId);
List<StatsLogEventWrapper> ret = new ArrayList();
switch (tagId) {
case StatsLog.WIFI_BYTES_TRANSFER: {
long token = Binder.clearCallingIdentity();
try {
// TODO: Consider caching the following call to get BatteryStatsInternal.
BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class);
String[] ifaces = bs.getWifiIfaces();
if (ifaces.length == 0) {
return null;
}
NetworkStatsFactory nsf = new NetworkStatsFactory();
// Combine all the metrics per Uid into one record.
NetworkStats stats = nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces,
NetworkStats.TAG_NONE, null).groupedByUid();
return addNetworkStats(tagId, stats, false);
} catch (java.io.IOException e) {
Slog.e(TAG, "Pulling netstats for wifi bytes has error", e);
} finally {
Binder.restoreCallingIdentity(token);
}
break;
pullWifiBytesTransfer(tagId, ret);
break;
}
case StatsLog.MOBILE_BYTES_TRANSFER: {
long token = Binder.clearCallingIdentity();
try {
BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class);
String[] ifaces = bs.getMobileIfaces();
if (ifaces.length == 0) {
return null;
}
NetworkStatsFactory nsf = new NetworkStatsFactory();
// Combine all the metrics per Uid into one record.
NetworkStats stats = nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces,
NetworkStats.TAG_NONE, null).groupedByUid();
return addNetworkStats(tagId, stats, false);
} catch (java.io.IOException e) {
Slog.e(TAG, "Pulling netstats for mobile bytes has error", e);
} finally {
Binder.restoreCallingIdentity(token);
}
break;
pullMobileBytesTransfer(tagId, ret);
break;
}
case StatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG: {
long token = Binder.clearCallingIdentity();
try {
BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class);
String[] ifaces = bs.getWifiIfaces();
if (ifaces.length == 0) {
return null;
}
NetworkStatsFactory nsf = new NetworkStatsFactory();
NetworkStats stats = rollupNetworkStatsByFGBG(
nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces,
NetworkStats.TAG_NONE, null));
return addNetworkStats(tagId, stats, true);
} catch (java.io.IOException e) {
Slog.e(TAG, "Pulling netstats for wifi bytes w/ fg/bg has error", e);
} finally {
Binder.restoreCallingIdentity(token);
}
break;
pullWifiBytesTransferByFgBg(tagId, ret);
break;
}
case StatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG: {
long token = Binder.clearCallingIdentity();
try {
BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class);
String[] ifaces = bs.getMobileIfaces();
if (ifaces.length == 0) {
return null;
}
NetworkStatsFactory nsf = new NetworkStatsFactory();
NetworkStats stats = rollupNetworkStatsByFGBG(
nsf.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces,
NetworkStats.TAG_NONE, null));
return addNetworkStats(tagId, stats, true);
} catch (java.io.IOException e) {
Slog.e(TAG, "Pulling netstats for mobile bytes w/ fg/bg has error", e);
} finally {
Binder.restoreCallingIdentity(token);
}
break;
pullMobileBytesTransferByFgBg(tagId, ret);
break;
}
case StatsLog.BLUETOOTH_BYTES_TRANSFER: {
pullBluetoothBytesTransfer(tagId, ret);
break;
}
case StatsLog.KERNEL_WAKELOCK: {
final KernelWakelockStats wakelockStats =
mKernelWakelockReader.readKernelWakelockStats(mTmpWakelockStats);
List<StatsLogEventWrapper> ret = new ArrayList();
for (Map.Entry<String, KernelWakelockStats.Entry> ent : wakelockStats.entrySet()) {
String name = ent.getKey();
KernelWakelockStats.Entry kws = ent.getValue();
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 4);
e.writeString(name);
e.writeInt(kws.mCount);
e.writeInt(kws.mVersion);
e.writeLong(kws.mTotalTime);
ret.add(e);
}
return ret.toArray(new StatsLogEventWrapper[ret.size()]);
pullKernelWakelock(tagId, ret);
break;
}
case StatsLog.CPU_TIME_PER_FREQ: {
List<StatsLogEventWrapper> ret = new ArrayList();
for (int cluster = 0; cluster < mKernelCpuSpeedReaders.length; cluster++) {
long[] clusterTimeMs = mKernelCpuSpeedReaders[cluster].readAbsolute();
if (clusterTimeMs != null) {
for (int speed = clusterTimeMs.length - 1; speed >= 0; --speed) {
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3);
e.writeInt(cluster);
e.writeInt(speed);
e.writeLong(clusterTimeMs[speed]);
ret.add(e);
}
}
}
return ret.toArray(new StatsLogEventWrapper[ret.size()]);
pullCpuTimePerFreq(tagId, ret);
break;
}
case StatsLog.WIFI_ACTIVITY_ENERGY_INFO: {
List<StatsLogEventWrapper> ret = new ArrayList();
long token = Binder.clearCallingIdentity();
if (mWifiManager == null) {
mWifiManager = IWifiManager.Stub.asInterface(ServiceManager.getService(
Context.WIFI_SERVICE));
}
if (mWifiManager != null) {
try {
SynchronousResultReceiver wifiReceiver = new SynchronousResultReceiver("wifi");
mWifiManager.requestActivityInfo(wifiReceiver);
final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver);
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 6);
e.writeLong(wifiInfo.getTimeStamp());
e.writeInt(wifiInfo.getStackState());
e.writeLong(wifiInfo.getControllerTxTimeMillis());
e.writeLong(wifiInfo.getControllerRxTimeMillis());
e.writeLong(wifiInfo.getControllerIdleTimeMillis());
e.writeLong(wifiInfo.getControllerEnergyUsed());
ret.add(e);
return ret.toArray(new StatsLogEventWrapper[ret.size()]);
} catch (RemoteException e) {
Slog.e(TAG, "Pulling wifiManager for wifi controller activity energy info has error", e);
} finally {
Binder.restoreCallingIdentity(token);
}
}
break;
pullWifiActivityEnergyInfo(tagId, ret);
break;
}
case StatsLog.MODEM_ACTIVITY_INFO: {
List<StatsLogEventWrapper> ret = new ArrayList();
long token = Binder.clearCallingIdentity();
if (mTelephony == null) {
mTelephony = TelephonyManager.from(mContext);
}
if (mTelephony != null) {
SynchronousResultReceiver modemReceiver = new SynchronousResultReceiver("telephony");
mTelephony.requestModemActivityInfo(modemReceiver);
final ModemActivityInfo modemInfo = awaitControllerInfo(modemReceiver);
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 10);
e.writeLong(modemInfo.getTimestamp());
e.writeLong(modemInfo.getSleepTimeMillis());
e.writeLong(modemInfo.getIdleTimeMillis());
e.writeLong(modemInfo.getTxTimeMillis()[0]);
e.writeLong(modemInfo.getTxTimeMillis()[1]);
e.writeLong(modemInfo.getTxTimeMillis()[2]);
e.writeLong(modemInfo.getTxTimeMillis()[3]);
e.writeLong(modemInfo.getTxTimeMillis()[4]);
e.writeLong(modemInfo.getRxTimeMillis());
e.writeLong(modemInfo.getEnergyUsed());
ret.add(e);
return ret.toArray(new StatsLogEventWrapper[ret.size()]);
}
break;
pullModemActivityInfo(tagId, ret);
break;
}
case StatsLog.CPU_SUSPEND_TIME: {
List<StatsLogEventWrapper> ret = new ArrayList();
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 1);
e.writeLong(SystemClock.elapsedRealtime());
ret.add(e);
return ret.toArray(new StatsLogEventWrapper[ret.size()]);
}
case StatsLog.CPU_IDLE_TIME: {
List<StatsLogEventWrapper> ret = new ArrayList();
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 1);
e.writeLong(SystemClock.uptimeMillis());
ret.add(e);
return ret.toArray(new StatsLogEventWrapper[ret.size()]);
}
case StatsLog.DISK_SPACE: {
List<StatsLogEventWrapper> ret = new ArrayList();
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3);
e.writeLong(mStatFsData.getAvailableBytes());
e.writeLong(mStatFsSystem.getAvailableBytes());
e.writeLong(mStatFsTemp.getAvailableBytes());
ret.add(e);
return ret.toArray(new StatsLogEventWrapper[ret.size()]);
case StatsLog.BLUETOOTH_ACTIVITY_INFO: {
pullBluetoothActivityInfo(tagId, ret);
break;
}
case StatsLog.SYSTEM_UPTIME: {
List<StatsLogEventWrapper> ret = new ArrayList();
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 1);
e.writeLong(SystemClock.uptimeMillis());
ret.add(e);
return ret.toArray(new StatsLogEventWrapper[ret.size()]);
pullSystemUpTime(tagId, ret);
break;
}
case StatsLog.SYSTEM_ELAPSED_REALTIME: {
pullSystemElapsedRealtime(tagId, ret);
break;
}
case StatsLog.DISK_SPACE: {
pullDiskSpace(tagId, ret);
break;
}
default:
Slog.w(TAG, "No such tagId data as " + tagId);
return null;
}
return null;
return ret.toArray(new StatsLogEventWrapper[ret.size()]);
}
@Override // Binder call