Merge "Don't drop log about excessive O anomaly." into pi-dev
am: a866d6bd56
Change-Id: Ic35a5326c2a9be3024ad246a793e05221b2d7aca
This commit is contained in:
@@ -45,6 +45,8 @@ import com.android.internal.os.BatteryStatsHelper;
|
|||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.AnomalyInfo;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.StatsManagerConfig;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
|
|
||||||
import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
|
import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
|
||||||
@@ -511,10 +513,25 @@ public class BatteryUtils {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isPreOApp(final String[] packageNames) {
|
||||||
|
if (ArrayUtils.isEmpty(packageNames)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String packageName : packageNames) {
|
||||||
|
if (isPreOApp(packageName)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return {@code true} if we should hide anomaly app represented by {@code uid}
|
* Return {@code true} if we should hide anomaly app represented by {@code uid}
|
||||||
*/
|
*/
|
||||||
public boolean shouldHideAnomaly(PowerWhitelistBackend powerWhitelistBackend, int uid) {
|
public boolean shouldHideAnomaly(PowerWhitelistBackend powerWhitelistBackend, int uid,
|
||||||
|
AnomalyInfo anomalyInfo) {
|
||||||
final String[] packageNames = mPackageManager.getPackagesForUid(uid);
|
final String[] packageNames = mPackageManager.getPackagesForUid(uid);
|
||||||
if (ArrayUtils.isEmpty(packageNames)) {
|
if (ArrayUtils.isEmpty(packageNames)) {
|
||||||
// Don't show it if app has been uninstalled
|
// Don't show it if app has been uninstalled
|
||||||
@@ -522,7 +539,13 @@ public class BatteryUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return isSystemUid(uid) || powerWhitelistBackend.isWhitelisted(packageNames)
|
return isSystemUid(uid) || powerWhitelistBackend.isWhitelisted(packageNames)
|
||||||
|| (isSystemApp(mPackageManager, packageNames) && !hasLauncherEntry(packageNames));
|
|| (isSystemApp(mPackageManager, packageNames) && !hasLauncherEntry(packageNames))
|
||||||
|
|| (isExcessiveBackgroundAnomaly(anomalyInfo) && !isPreOApp(packageNames));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isExcessiveBackgroundAnomaly(AnomalyInfo anomalyInfo) {
|
||||||
|
return anomalyInfo.anomalyType
|
||||||
|
== StatsManagerConfig.AnomalyType.EXCESSIVE_BACKGROUND_SERVICE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSystemUid(int uid) {
|
private boolean isSystemUid(int uid) {
|
||||||
|
@@ -155,44 +155,36 @@ public class AnomalyDetectionJobService extends JobService {
|
|||||||
final String packageName = batteryUtils.getPackageName(uid);
|
final String packageName = batteryUtils.getPackageName(uid);
|
||||||
final long versionCode = batteryUtils.getAppLongVersionCode(packageName);
|
final long versionCode = batteryUtils.getAppLongVersionCode(packageName);
|
||||||
|
|
||||||
final boolean anomalyDetected;
|
if (batteryUtils.shouldHideAnomaly(powerWhitelistBackend, uid, anomalyInfo)) {
|
||||||
if (isExcessiveBackgroundAnomaly(anomalyInfo)) {
|
metricsFeatureProvider.action(context,
|
||||||
anomalyDetected = batteryUtils.isPreOApp(packageName);
|
MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED,
|
||||||
|
packageName,
|
||||||
|
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT,
|
||||||
|
anomalyInfo.anomalyType),
|
||||||
|
Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
|
||||||
|
versionCode));
|
||||||
} else {
|
} else {
|
||||||
anomalyDetected = true;
|
if (autoFeatureOn && anomalyInfo.autoRestriction) {
|
||||||
|
// Auto restrict this app
|
||||||
|
batteryUtils.setForceAppStandby(uid, packageName,
|
||||||
|
AppOpsManager.MODE_IGNORED);
|
||||||
|
databaseManager.insertAnomaly(uid, packageName, anomalyInfo.anomalyType,
|
||||||
|
AnomalyDatabaseHelper.State.AUTO_HANDLED,
|
||||||
|
timeMs);
|
||||||
|
} else {
|
||||||
|
databaseManager.insertAnomaly(uid, packageName, anomalyInfo.anomalyType,
|
||||||
|
AnomalyDatabaseHelper.State.NEW,
|
||||||
|
timeMs);
|
||||||
|
}
|
||||||
|
metricsFeatureProvider.action(context,
|
||||||
|
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
|
||||||
|
packageName,
|
||||||
|
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE,
|
||||||
|
anomalyInfo.anomalyType),
|
||||||
|
Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
|
||||||
|
versionCode));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anomalyDetected) {
|
|
||||||
if (batteryUtils.shouldHideAnomaly(powerWhitelistBackend, uid)) {
|
|
||||||
metricsFeatureProvider.action(context,
|
|
||||||
MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED,
|
|
||||||
packageName,
|
|
||||||
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT,
|
|
||||||
anomalyInfo.anomalyType),
|
|
||||||
Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
|
|
||||||
versionCode));
|
|
||||||
} else {
|
|
||||||
if (autoFeatureOn && anomalyInfo.autoRestriction) {
|
|
||||||
// Auto restrict this app
|
|
||||||
batteryUtils.setForceAppStandby(uid, packageName,
|
|
||||||
AppOpsManager.MODE_IGNORED);
|
|
||||||
databaseManager.insertAnomaly(uid, packageName, anomalyInfo.anomalyType,
|
|
||||||
AnomalyDatabaseHelper.State.AUTO_HANDLED,
|
|
||||||
timeMs);
|
|
||||||
} else {
|
|
||||||
databaseManager.insertAnomaly(uid, packageName, anomalyInfo.anomalyType,
|
|
||||||
AnomalyDatabaseHelper.State.NEW,
|
|
||||||
timeMs);
|
|
||||||
}
|
|
||||||
metricsFeatureProvider.action(context,
|
|
||||||
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
|
|
||||||
packageName,
|
|
||||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE,
|
|
||||||
anomalyInfo.anomalyType),
|
|
||||||
Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
|
|
||||||
versionCode));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (NullPointerException | IndexOutOfBoundsException e) {
|
} catch (NullPointerException | IndexOutOfBoundsException e) {
|
||||||
Log.e(TAG, "Parse stats dimensions value error.", e);
|
Log.e(TAG, "Parse stats dimensions value error.", e);
|
||||||
}
|
}
|
||||||
@@ -229,11 +221,6 @@ public class AnomalyDetectionJobService extends JobService {
|
|||||||
return UID_NULL;
|
return UID_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isExcessiveBackgroundAnomaly(AnomalyInfo anomalyInfo) {
|
|
||||||
return anomalyInfo.anomalyType
|
|
||||||
== StatsManagerConfig.AnomalyType.EXCESSIVE_BACKGROUND_SERVICE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
JobWorkItem dequeueWork(JobParameters parameters) {
|
JobWorkItem dequeueWork(JobParameters parameters) {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
|
@@ -53,6 +53,8 @@ import com.android.internal.os.BatterySipper;
|
|||||||
import com.android.internal.os.BatteryStatsHelper;
|
import com.android.internal.os.BatteryStatsHelper;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.AnomalyInfo;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.StatsManagerConfig;
|
||||||
import com.android.settings.testutils.FakeFeatureFactory;
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
|
import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
|
||||||
@@ -106,6 +108,9 @@ public class BatteryUtilsTest {
|
|||||||
private static final String HIGH_SDK_PACKAGE = "com.android.package.high";
|
private static final String HIGH_SDK_PACKAGE = "com.android.package.high";
|
||||||
private static final String LOW_SDK_PACKAGE = "com.android.package.low";
|
private static final String LOW_SDK_PACKAGE = "com.android.package.low";
|
||||||
|
|
||||||
|
private static final String INFO_EXCESSIVE = "anomaly_type=4,auto_restriction=false";
|
||||||
|
private static final String INFO_WAKELOCK = "anomaly_type=1,auto_restriction=false";
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private BatteryStats.Uid mUid;
|
private BatteryStats.Uid mUid;
|
||||||
@Mock
|
@Mock
|
||||||
@@ -146,6 +151,7 @@ public class BatteryUtilsTest {
|
|||||||
private ApplicationInfo mLowApplicationInfo;
|
private ApplicationInfo mLowApplicationInfo;
|
||||||
@Mock
|
@Mock
|
||||||
private PowerWhitelistBackend mPowerWhitelistBackend;
|
private PowerWhitelistBackend mPowerWhitelistBackend;
|
||||||
|
private AnomalyInfo mAnomalyInfo;
|
||||||
private BatteryUtils mBatteryUtils;
|
private BatteryUtils mBatteryUtils;
|
||||||
private FakeFeatureFactory mFeatureFactory;
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
private PowerUsageFeatureProvider mProvider;
|
private PowerUsageFeatureProvider mProvider;
|
||||||
@@ -211,6 +217,7 @@ public class BatteryUtilsTest {
|
|||||||
mBatteryUtils.mPowerUsageFeatureProvider = mProvider;
|
mBatteryUtils.mPowerUsageFeatureProvider = mProvider;
|
||||||
doReturn(0L).when(mBatteryUtils)
|
doReturn(0L).when(mBatteryUtils)
|
||||||
.getForegroundServiceTotalTimeUs(any(BatteryStats.Uid.class), anyLong());
|
.getForegroundServiceTotalTimeUs(any(BatteryStats.Uid.class), anyLong());
|
||||||
|
mAnomalyInfo = new AnomalyInfo(INFO_WAKELOCK);
|
||||||
|
|
||||||
mUsageList = new ArrayList<>();
|
mUsageList = new ArrayList<>();
|
||||||
mUsageList.add(mNormalBatterySipper);
|
mUsageList.add(mNormalBatterySipper);
|
||||||
@@ -532,15 +539,26 @@ public class BatteryUtilsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsLegacyApp_SdkLowerThanO_ReturnTrue() {
|
public void testIsPreOApp_SdkLowerThanO_ReturnTrue() {
|
||||||
assertThat(mBatteryUtils.isPreOApp(LOW_SDK_PACKAGE)).isTrue();
|
assertThat(mBatteryUtils.isPreOApp(LOW_SDK_PACKAGE)).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsLegacyApp_SdkLargerOrEqualThanO_ReturnFalse() {
|
public void testIsPreOApp_SdkLargerOrEqualThanO_ReturnFalse() {
|
||||||
assertThat(mBatteryUtils.isPreOApp(HIGH_SDK_PACKAGE)).isFalse();
|
assertThat(mBatteryUtils.isPreOApp(HIGH_SDK_PACKAGE)).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIsPreOApp_containPreOApp_ReturnTrue() {
|
||||||
|
assertThat(
|
||||||
|
mBatteryUtils.isPreOApp(new String[]{HIGH_SDK_PACKAGE, LOW_SDK_PACKAGE})).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIsPreOApp_emptyList_ReturnFalse() {
|
||||||
|
assertThat(mBatteryUtils.isPreOApp(new String[]{})).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetForceAppStandby_forcePreOApp_forceTwoRestrictions() {
|
public void testSetForceAppStandby_forcePreOApp_forceTwoRestrictions() {
|
||||||
mBatteryUtils.setForceAppStandby(UID, LOW_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
|
mBatteryUtils.setForceAppStandby(UID, LOW_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
|
||||||
@@ -591,7 +609,8 @@ public class BatteryUtilsTest {
|
|||||||
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
|
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
|
||||||
mHighApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
|
mHighApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
|
||||||
|
|
||||||
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID)).isTrue();
|
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
|
||||||
|
mAnomalyInfo)).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -600,7 +619,8 @@ public class BatteryUtilsTest {
|
|||||||
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
|
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
|
||||||
mHighApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
|
mHighApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
|
||||||
|
|
||||||
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID)).isTrue();
|
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
|
||||||
|
mAnomalyInfo)).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -608,7 +628,8 @@ public class BatteryUtilsTest {
|
|||||||
final int systemUid = Process.ROOT_UID;
|
final int systemUid = Process.ROOT_UID;
|
||||||
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(systemUid);
|
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(systemUid);
|
||||||
|
|
||||||
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, systemUid)).isTrue();
|
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, systemUid,
|
||||||
|
mAnomalyInfo)).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -616,13 +637,33 @@ public class BatteryUtilsTest {
|
|||||||
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
|
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
|
||||||
doReturn(true).when(mPowerWhitelistBackend).isWhitelisted(new String[]{HIGH_SDK_PACKAGE});
|
doReturn(true).when(mPowerWhitelistBackend).isWhitelisted(new String[]{HIGH_SDK_PACKAGE});
|
||||||
|
|
||||||
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID)).isTrue();
|
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
|
||||||
|
mAnomalyInfo)).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testShouldHideAnomaly_normalApp_returnFalse() {
|
public void testShouldHideAnomaly_normalApp_returnFalse() {
|
||||||
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
|
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
|
||||||
|
|
||||||
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID)).isFalse();
|
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
|
||||||
|
mAnomalyInfo)).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testShouldHideAnomaly_excessivePriorOApp_returnFalse() {
|
||||||
|
doReturn(new String[]{LOW_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
|
||||||
|
mAnomalyInfo = new AnomalyInfo(INFO_EXCESSIVE);
|
||||||
|
|
||||||
|
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
|
||||||
|
mAnomalyInfo)).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testShouldHideAnomaly_excessiveOApp_returnTrue() {
|
||||||
|
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
|
||||||
|
mAnomalyInfo = new AnomalyInfo(INFO_EXCESSIVE);
|
||||||
|
|
||||||
|
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID,
|
||||||
|
mAnomalyInfo)).isTrue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -165,7 +165,7 @@ public class AnomalyDetectionJobServiceTest {
|
|||||||
doReturn(false).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE);
|
doReturn(false).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE);
|
||||||
doReturn(Process.FIRST_APPLICATION_UID).when(
|
doReturn(Process.FIRST_APPLICATION_UID).when(
|
||||||
mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
|
mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
|
||||||
doReturn(true).when(mBatteryUtils).shouldHideAnomaly(any(), anyInt());
|
doReturn(true).when(mBatteryUtils).shouldHideAnomaly(any(), anyInt(), any());
|
||||||
|
|
||||||
mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
|
mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
|
||||||
mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
|
mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
|
||||||
|
Reference in New Issue
Block a user