Merge "Add log for BatteryUtils" into oc-dev

This commit is contained in:
Lei Yu
2017-04-10 17:06:44 +00:00
committed by Android (Google) Code Review
7 changed files with 65 additions and 19 deletions

View File

@@ -104,10 +104,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)) {

View File

@@ -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);
return convertUsToMs(timeUs);
Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid()));
Log.v(TAG, "background time(us): " + 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;
}
} }

View File

@@ -74,6 +74,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() {
@@ -117,6 +118,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
@@ -239,8 +241,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);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);