Add log for AnomalyDetectionJobService

When anomaly is detected, also log it in AnomalyDetectionJobService

Bug: 73888115
Test: RunSettingsRoboTests
Change-Id: I0a42f8935d9a83eb763dd1f9dedfb71301853104
This commit is contained in:
Lei Yu
2018-03-20 11:33:13 -07:00
parent baf8a0cf9e
commit 2246ea9e89
2 changed files with 48 additions and 17 deletions

View File

@@ -38,13 +38,16 @@ import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
import android.support.annotation.VisibleForTesting; import android.support.annotation.VisibleForTesting;
import android.util.Log; import android.util.Log;
import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.os.BatteryStatsHelper; 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.BatteryUtils; import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.fuelgauge.PowerWhitelistBackend; import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.utils.ThreadUtils;
@@ -78,6 +81,7 @@ public class AnomalyDetectionJobService extends JobService {
@Override @Override
public boolean onStartJob(JobParameters params) { public boolean onStartJob(JobParameters params) {
ThreadUtils.postOnBackgroundThread(() -> { ThreadUtils.postOnBackgroundThread(() -> {
final Context context = AnomalyDetectionJobService.this;
final BatteryDatabaseManager batteryDatabaseManager = final BatteryDatabaseManager batteryDatabaseManager =
BatteryDatabaseManager.getInstance(this); BatteryDatabaseManager.getInstance(this);
final BatteryTipPolicy policy = new BatteryTipPolicy(this); final BatteryTipPolicy policy = new BatteryTipPolicy(this);
@@ -89,12 +93,14 @@ public class AnomalyDetectionJobService extends JobService {
final PowerWhitelistBackend powerWhitelistBackend = PowerWhitelistBackend.getInstance(); final PowerWhitelistBackend powerWhitelistBackend = PowerWhitelistBackend.getInstance();
final PowerUsageFeatureProvider powerUsageFeatureProvider = FeatureFactory final PowerUsageFeatureProvider powerUsageFeatureProvider = FeatureFactory
.getFactory(this).getPowerUsageFeatureProvider(this); .getFactory(this).getPowerUsageFeatureProvider(this);
final MetricsFeatureProvider metricsFeatureProvider = FeatureFactory
.getFactory(this).getMetricsFeatureProvider();
for (JobWorkItem item = params.dequeueWork(); item != null; for (JobWorkItem item = params.dequeueWork(); item != null;
item = params.dequeueWork()) { item = params.dequeueWork()) {
saveAnomalyToDatabase(batteryStatsHelper, userManager, batteryDatabaseManager, saveAnomalyToDatabase(context, batteryStatsHelper, userManager,
batteryUtils, policy, powerWhitelistBackend, contentResolver, batteryDatabaseManager, batteryUtils, policy, powerWhitelistBackend,
powerUsageFeatureProvider, contentResolver, powerUsageFeatureProvider, metricsFeatureProvider,
item.getIntent().getExtras()); item.getIntent().getExtras());
} }
jobFinished(params, false /* wantsReschedule */); jobFinished(params, false /* wantsReschedule */);
@@ -109,11 +115,12 @@ public class AnomalyDetectionJobService extends JobService {
} }
@VisibleForTesting @VisibleForTesting
void saveAnomalyToDatabase(BatteryStatsHelper batteryStatsHelper, UserManager userManager, void saveAnomalyToDatabase(Context context, BatteryStatsHelper batteryStatsHelper,
UserManager userManager,
BatteryDatabaseManager databaseManager, BatteryUtils batteryUtils, BatteryDatabaseManager databaseManager, BatteryUtils batteryUtils,
BatteryTipPolicy policy, PowerWhitelistBackend powerWhitelistBackend, BatteryTipPolicy policy, PowerWhitelistBackend powerWhitelistBackend,
ContentResolver contentResolver, PowerUsageFeatureProvider powerUsageFeatureProvider, ContentResolver contentResolver, PowerUsageFeatureProvider powerUsageFeatureProvider,
Bundle bundle) { MetricsFeatureProvider metricsFeatureProvider, Bundle bundle) {
// The Example of intentDimsValue is: 35:{1:{1:{1:10013|}|}|} // The Example of intentDimsValue is: 35:{1:{1:{1:10013|}|}|}
final StatsDimensionsValue intentDimsValue = final StatsDimensionsValue intentDimsValue =
bundle.getParcelable(StatsManager.EXTRA_STATS_DIMENSIONS_VALUE); bundle.getParcelable(StatsManager.EXTRA_STATS_DIMENSIONS_VALUE);
@@ -158,6 +165,11 @@ public class AnomalyDetectionJobService extends JobService {
AnomalyDatabaseHelper.State.NEW, AnomalyDatabaseHelper.State.NEW,
timeMs); timeMs);
} }
metricsFeatureProvider.action(context,
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
packageName,
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT,
anomalyInfo.anomalyType));
} }
} }
} catch (NullPointerException | IndexOutOfBoundsException e) { } catch (NullPointerException | IndexOutOfBoundsException e) {

View File

@@ -38,7 +38,9 @@ import android.os.Bundle;
import android.os.Process; import android.os.Process;
import android.os.StatsDimensionsValue; import android.os.StatsDimensionsValue;
import android.os.UserManager; import android.os.UserManager;
import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto;
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.BatteryUtils; import com.android.settings.fuelgauge.BatteryUtils;
@@ -67,6 +69,7 @@ public class AnomalyDetectionJobServiceTest {
"anomaly_type=6,auto_restriction=true"; "anomaly_type=6,auto_restriction=true";
private static final String SUBSCRIBER_COOKIES_NOT_AUTO_RESTRICTION = private static final String SUBSCRIBER_COOKIES_NOT_AUTO_RESTRICTION =
"anomaly_type=6,auto_restriction=false"; "anomaly_type=6,auto_restriction=false";
private static final int ANOMALY_TYPE = 6;
@Mock @Mock
private BatteryStatsHelper mBatteryStatsHelper; private BatteryStatsHelper mBatteryStatsHelper;
@Mock @Mock
@@ -119,9 +122,11 @@ public class AnomalyDetectionJobServiceTest {
doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt()); doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt());
doReturn(true).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE); doReturn(true).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE);
mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager, mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend, mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
mContext.getContentResolver(), mFeatureFactory.powerUsageFeatureProvider, mBundle); mPowerWhitelistBackend, mContext.getContentResolver(),
mFeatureFactory.powerUsageFeatureProvider,
mFeatureFactory.metricsFeatureProvider, mBundle);
verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(), verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
anyInt(), anyLong()); anyInt(), anyLong());
@@ -132,9 +137,11 @@ public class AnomalyDetectionJobServiceTest {
doReturn(Process.SYSTEM_UID).when( doReturn(Process.SYSTEM_UID).when(
mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any()); mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager, mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend, mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
mContext.getContentResolver(), mFeatureFactory.powerUsageFeatureProvider, mBundle); mPowerWhitelistBackend, mContext.getContentResolver(),
mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
mBundle);
verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(), verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
anyInt(), anyLong()); anyInt(), anyLong());
@@ -149,12 +156,18 @@ public class AnomalyDetectionJobServiceTest {
doReturn(Process.FIRST_APPLICATION_UID).when( doReturn(Process.FIRST_APPLICATION_UID).when(
mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any()); mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager, mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend, mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
mContext.getContentResolver(), mFeatureFactory.powerUsageFeatureProvider, mBundle); mPowerWhitelistBackend, mContext.getContentResolver(),
mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
mBundle);
verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6), verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6),
eq(AnomalyDatabaseHelper.State.AUTO_HANDLED), anyLong()); eq(AnomalyDatabaseHelper.State.AUTO_HANDLED), anyLong());
verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
SYSTEM_PACKAGE,
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, ANOMALY_TYPE));
} }
@@ -167,11 +180,17 @@ public class AnomalyDetectionJobServiceTest {
doReturn(Process.FIRST_APPLICATION_UID).when( doReturn(Process.FIRST_APPLICATION_UID).when(
mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any()); mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager, mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend, mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
mContext.getContentResolver(), mFeatureFactory.powerUsageFeatureProvider, mBundle); mPowerWhitelistBackend, mContext.getContentResolver(),
mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
mBundle);
verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6), verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6),
eq(AnomalyDatabaseHelper.State.NEW), anyLong()); eq(AnomalyDatabaseHelper.State.NEW), anyLong());
verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
SYSTEM_PACKAGE,
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, ANOMALY_TYPE));
} }
} }