Add log for BatteryUtils
This cl add logs to get more data for app usage time. Also refactor BatteryUtils to singleton pattern because we need to extract package name from uid. Bug: 36909166 Test: RunSettingsRoboTests Change-Id: I6ede354035c46e46cb856b7cf57bd1b7ccbd6d4f
This commit is contained in:
@@ -105,10 +105,11 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase implements
|
|||||||
final Bundle args = new Bundle();
|
final Bundle args = new Bundle();
|
||||||
final BatterySipper sipper = entry.sipper;
|
final BatterySipper sipper = entry.sipper;
|
||||||
final BatteryStats.Uid uid = sipper.uidObj;
|
final BatteryStats.Uid uid = sipper.uidObj;
|
||||||
|
final BatteryUtils batteryUtils = BatteryUtils.getInstance(caller);
|
||||||
|
|
||||||
final long backgroundTimeMs = BatteryUtils.getProcessTimeMs(
|
final long backgroundTimeMs = batteryUtils.getProcessTimeMs(
|
||||||
BatteryUtils.StatusType.BACKGROUND, uid, which);
|
BatteryUtils.StatusType.BACKGROUND, uid, which);
|
||||||
final long foregroundTimeMs = BatteryUtils.getProcessTimeMs(
|
final long foregroundTimeMs = batteryUtils.getProcessTimeMs(
|
||||||
BatteryUtils.StatusType.FOREGROUND, uid, which);
|
BatteryUtils.StatusType.FOREGROUND, uid, which);
|
||||||
|
|
||||||
if (ArrayUtils.isEmpty(sipper.mPackages)) {
|
if (ArrayUtils.isEmpty(sipper.mPackages)) {
|
||||||
|
@@ -16,9 +16,13 @@
|
|||||||
package com.android.settings.fuelgauge;
|
package com.android.settings.fuelgauge;
|
||||||
|
|
||||||
import android.annotation.IntDef;
|
import android.annotation.IntDef;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.os.BatteryStats;
|
import android.os.BatteryStats;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.annotation.VisibleForTesting;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
@@ -38,7 +42,23 @@ public class BatteryUtils {
|
|||||||
int ALL = 2;
|
int ALL = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getProcessTimeMs(@StatusType int type, @Nullable BatteryStats.Uid uid,
|
private static final String TAG = "BatteryUtils";
|
||||||
|
private static BatteryUtils sInstance;
|
||||||
|
|
||||||
|
private PackageManager mPackageManager;
|
||||||
|
|
||||||
|
public static BatteryUtils getInstance(Context context) {
|
||||||
|
if (sInstance == null || sInstance.isDataCorrupted()) {
|
||||||
|
sInstance = new BatteryUtils(context);
|
||||||
|
}
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BatteryUtils(Context context) {
|
||||||
|
mPackageManager = context.getPackageManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getProcessTimeMs(@StatusType int type, @Nullable BatteryStats.Uid uid,
|
||||||
int which) {
|
int which) {
|
||||||
if (uid == null) {
|
if (uid == null) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -56,34 +76,46 @@ public class BatteryUtils {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) {
|
private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) {
|
||||||
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
||||||
final long timeUs = uid.getProcessStateTime(
|
final long timeUs = uid.getProcessStateTime(
|
||||||
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which);
|
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which);
|
||||||
|
|
||||||
|
Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid()));
|
||||||
|
Log.v(TAG, "background time(us): " + timeUs);
|
||||||
return convertUsToMs(timeUs);
|
return convertUsToMs(timeUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) {
|
private long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) {
|
||||||
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
||||||
final int foregroundTypes[] = {BatteryStats.Uid.PROCESS_STATE_TOP,
|
final int foregroundTypes[] = {BatteryStats.Uid.PROCESS_STATE_TOP,
|
||||||
BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE,
|
BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE,
|
||||||
BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING,
|
BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING,
|
||||||
BatteryStats.Uid.PROCESS_STATE_FOREGROUND};
|
BatteryStats.Uid.PROCESS_STATE_FOREGROUND};
|
||||||
|
Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid()));
|
||||||
|
|
||||||
long timeUs = 0;
|
long timeUs = 0;
|
||||||
for (int type : foregroundTypes) {
|
for (int type : foregroundTypes) {
|
||||||
timeUs += uid.getProcessStateTime(type, rawRealTimeUs, which);
|
final long localTime = uid.getProcessStateTime(type, rawRealTimeUs, which);
|
||||||
|
Log.v(TAG, "type: " + type + " time(us): " + localTime);
|
||||||
|
timeUs += localTime;
|
||||||
}
|
}
|
||||||
|
Log.v(TAG, "foreground time(us): " + timeUs);
|
||||||
|
|
||||||
return convertUsToMs(timeUs);
|
return convertUsToMs(timeUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long convertUsToMs(long timeUs) {
|
private long convertUsToMs(long timeUs) {
|
||||||
return timeUs / 1000;
|
return timeUs / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long convertMsToUs(long timeMs) {
|
private long convertMsToUs(long timeMs) {
|
||||||
return timeMs * 1000;
|
return timeMs * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isDataCorrupted() {
|
||||||
|
return mPackageManager == null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -73,6 +73,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
|
|||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
private UserManager mUserManager;
|
private UserManager mUserManager;
|
||||||
private Map<Integer, PowerUsageData> mBatteryDataMap;
|
private Map<Integer, PowerUsageData> mBatteryDataMap;
|
||||||
|
private BatteryUtils mBatteryUtils;
|
||||||
|
|
||||||
Handler mHandler = new Handler() {
|
Handler mHandler = new Handler() {
|
||||||
|
|
||||||
@@ -116,6 +117,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
|
|||||||
.getPowerUsageFeatureProvider(context);
|
.getPowerUsageFeatureProvider(context);
|
||||||
mPackageManager = context.getPackageManager();
|
mPackageManager = context.getPackageManager();
|
||||||
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
||||||
|
mBatteryUtils = BatteryUtils.getInstance(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -223,8 +225,8 @@ public class PowerUsageAdvanced extends PowerUsageBase {
|
|||||||
final PowerUsageData usageData = batteryDataMap.get(extractUsageType(sipper));
|
final PowerUsageData usageData = batteryDataMap.get(extractUsageType(sipper));
|
||||||
usageData.totalPowerMah += sipper.totalPowerMah;
|
usageData.totalPowerMah += sipper.totalPowerMah;
|
||||||
if (sipper.drainType == DrainType.APP && sipper.usageTimeMs != 0) {
|
if (sipper.drainType == DrainType.APP && sipper.usageTimeMs != 0) {
|
||||||
sipper.usageTimeMs = BatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL,
|
sipper.usageTimeMs = mBatteryUtils.getProcessTimeMs(
|
||||||
sipper.uidObj, STATUS_TYPE);
|
BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, STATUS_TYPE);
|
||||||
}
|
}
|
||||||
usageData.totalUsageTimeMs += sipper.usageTimeMs;
|
usageData.totalUsageTimeMs += sipper.usageTimeMs;
|
||||||
usageData.usageList.add(sipper);
|
usageData.usageList.add(sipper);
|
||||||
|
@@ -110,6 +110,8 @@ public class PowerUsageSummary extends PowerUsageBase {
|
|||||||
PowerGaugePreference mLastFullChargePref;
|
PowerGaugePreference mLastFullChargePref;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
PowerUsageFeatureProvider mPowerFeatureProvider;
|
PowerUsageFeatureProvider mPowerFeatureProvider;
|
||||||
|
@VisibleForTesting
|
||||||
|
BatteryUtils mBatteryUtils;
|
||||||
|
|
||||||
private LayoutPreference mBatteryLayoutPref;
|
private LayoutPreference mBatteryLayoutPref;
|
||||||
private PreferenceGroup mAppListGroup;
|
private PreferenceGroup mAppListGroup;
|
||||||
@@ -127,6 +129,8 @@ public class PowerUsageSummary extends PowerUsageBase {
|
|||||||
KEY_TIME_SINCE_LAST_FULL_CHARGE);
|
KEY_TIME_SINCE_LAST_FULL_CHARGE);
|
||||||
mFooterPreferenceMixin.createFooterPreference().setTitle(R.string.battery_footer_summary);
|
mFooterPreferenceMixin.createFooterPreference().setTitle(R.string.battery_footer_summary);
|
||||||
|
|
||||||
|
mBatteryUtils = BatteryUtils.getInstance(getContext());
|
||||||
|
|
||||||
initFeatureProvider();
|
initFeatureProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,7 +498,7 @@ public class PowerUsageSummary extends PowerUsageBase {
|
|||||||
pref.setOrder(i + 1);
|
pref.setOrder(i + 1);
|
||||||
pref.setPercent(percentOfTotal);
|
pref.setPercent(percentOfTotal);
|
||||||
if (sipper.usageTimeMs == 0 && sipper.drainType == DrainType.APP) {
|
if (sipper.usageTimeMs == 0 && sipper.drainType == DrainType.APP) {
|
||||||
sipper.usageTimeMs = BatteryUtils.getProcessTimeMs(
|
sipper.usageTimeMs = mBatteryUtils.getProcessTimeMs(
|
||||||
BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, mStatsType);
|
BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, mStatsType);
|
||||||
}
|
}
|
||||||
setUsageSummary(pref, usedTime, sipper.usageTimeMs);
|
setUsageSummary(pref, usedTime, sipper.usageTimeMs);
|
||||||
|
@@ -74,7 +74,7 @@ public final class InstalledAppDetailsTest {
|
|||||||
ApplicationFeatureProvider mApplicationFeatureProvider;
|
ApplicationFeatureProvider mApplicationFeatureProvider;
|
||||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||||
private UserManager mUserManager;
|
private UserManager mUserManager;
|
||||||
@Mock
|
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||||
private SettingsActivity mActivity;
|
private SettingsActivity mActivity;
|
||||||
@Mock
|
@Mock
|
||||||
private DevicePolicyManager mDevicePolicyManager;
|
private DevicePolicyManager mDevicePolicyManager;
|
||||||
|
@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.BatteryStats;
|
import android.os.BatteryStats;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -96,7 +97,8 @@ public class AdvancedPowerUsageDetailTest {
|
|||||||
private BatteryStatsHelper mBatteryStatsHelper;
|
private BatteryStatsHelper mBatteryStatsHelper;
|
||||||
@Mock
|
@Mock
|
||||||
private BatteryStats.Uid mUid;
|
private BatteryStats.Uid mUid;
|
||||||
private Bundle mTestBundle;
|
@Mock
|
||||||
|
private PackageManager mPackageManager;
|
||||||
private AdvancedPowerUsageDetail mFragment;
|
private AdvancedPowerUsageDetail mFragment;
|
||||||
private FakeFeatureFactory mFeatureFactory;
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
private SettingsActivity mTestActivity;
|
private SettingsActivity mTestActivity;
|
||||||
@@ -141,6 +143,7 @@ public class AdvancedPowerUsageDetailTest {
|
|||||||
mAppEntry.info = mock(ApplicationInfo.class);
|
mAppEntry.info = mock(ApplicationInfo.class);
|
||||||
|
|
||||||
mTestActivity = spy(new SettingsActivity());
|
mTestActivity = spy(new SettingsActivity());
|
||||||
|
doReturn(mPackageManager).when(mTestActivity).getPackageManager();
|
||||||
|
|
||||||
final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
|
final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
|
||||||
|
|
||||||
|
@@ -25,6 +25,7 @@ import org.junit.Test;
|
|||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
import static android.os.BatteryStats.Uid.PROCESS_STATE_BACKGROUND;
|
import static android.os.BatteryStats.Uid.PROCESS_STATE_BACKGROUND;
|
||||||
@@ -56,7 +57,8 @@ public class BatteryUtilsTest {
|
|||||||
private static final long TIME_EXPECTED_ALL = 15000;
|
private static final long TIME_EXPECTED_ALL = 15000;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
BatteryStats.Uid mUid;
|
private BatteryStats.Uid mUid;
|
||||||
|
private BatteryUtils mBatteryUtils;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -72,11 +74,13 @@ public class BatteryUtilsTest {
|
|||||||
anyLong(), anyInt());
|
anyLong(), anyInt());
|
||||||
doReturn(TIME_STATE_BACKGROUND).when(mUid).getProcessStateTime(eq(PROCESS_STATE_BACKGROUND),
|
doReturn(TIME_STATE_BACKGROUND).when(mUid).getProcessStateTime(eq(PROCESS_STATE_BACKGROUND),
|
||||||
anyLong(), anyInt());
|
anyLong(), anyInt());
|
||||||
|
|
||||||
|
mBatteryUtils = BatteryUtils.getInstance(RuntimeEnvironment.application);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetProcessTimeMs_typeForeground_timeCorrect() {
|
public void testGetProcessTimeMs_typeForeground_timeCorrect() {
|
||||||
final long time = BatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.FOREGROUND, mUid,
|
final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.FOREGROUND, mUid,
|
||||||
BatteryStats.STATS_SINCE_CHARGED);
|
BatteryStats.STATS_SINCE_CHARGED);
|
||||||
|
|
||||||
assertThat(time).isEqualTo(TIME_EXPECTED_FOREGROUND);
|
assertThat(time).isEqualTo(TIME_EXPECTED_FOREGROUND);
|
||||||
@@ -84,7 +88,7 @@ public class BatteryUtilsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetProcessTimeMs_typeBackground_timeCorrect() {
|
public void testGetProcessTimeMs_typeBackground_timeCorrect() {
|
||||||
final long time = BatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.BACKGROUND, mUid,
|
final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.BACKGROUND, mUid,
|
||||||
BatteryStats.STATS_SINCE_CHARGED);
|
BatteryStats.STATS_SINCE_CHARGED);
|
||||||
|
|
||||||
assertThat(time).isEqualTo(TIME_EXPECTED_BACKGROUND);
|
assertThat(time).isEqualTo(TIME_EXPECTED_BACKGROUND);
|
||||||
@@ -92,7 +96,7 @@ public class BatteryUtilsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetProcessTimeMs_typeAll_timeCorrect() {
|
public void testGetProcessTimeMs_typeAll_timeCorrect() {
|
||||||
final long time = BatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, mUid,
|
final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, mUid,
|
||||||
BatteryStats.STATS_SINCE_CHARGED);
|
BatteryStats.STATS_SINCE_CHARGED);
|
||||||
|
|
||||||
assertThat(time).isEqualTo(TIME_EXPECTED_ALL);
|
assertThat(time).isEqualTo(TIME_EXPECTED_ALL);
|
||||||
@@ -100,7 +104,7 @@ public class BatteryUtilsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetProcessTimeMs_uidNull_returnZero() {
|
public void testGetProcessTimeMs_uidNull_returnZero() {
|
||||||
final long time = BatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, null,
|
final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, null,
|
||||||
BatteryStats.STATS_SINCE_CHARGED);
|
BatteryStats.STATS_SINCE_CHARGED);
|
||||||
|
|
||||||
assertThat(time).isEqualTo(0);
|
assertThat(time).isEqualTo(0);
|
||||||
|
Reference in New Issue
Block a user