diff --git a/protos/fuelgauge_log.proto b/protos/fuelgauge_log.proto index cf87dc7b7b0..8512cb82506 100644 --- a/protos/fuelgauge_log.proto +++ b/protos/fuelgauge_log.proto @@ -19,10 +19,11 @@ message BatteryOptimizeHistoricalLogEntry { APPLY = 2; RESET = 3; RESTORE = 4; + BACKUP = 5; } optional string package_name = 1; optional Action action = 2; optional string action_description = 3; optional int64 timestamp = 4; -} \ No newline at end of file +} diff --git a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java index 0558d46c3b8..79df57ab08d 100644 --- a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java +++ b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java @@ -22,6 +22,7 @@ import android.app.backup.BackupDataInputStream; import android.app.backup.BackupDataOutput; import android.app.backup.BackupHelper; import android.content.Context; +import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.os.IDeviceIdleController; @@ -34,9 +35,11 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; +import com.android.settings.fuelgauge.BatteryOptimizeHistoricalLogEntry.Action; import com.android.settingslib.fuelgauge.PowerAllowlistBackend; import java.io.IOException; +import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; @@ -47,6 +50,8 @@ public final class BatteryBackupHelper implements BackupHelper { /** An inditifier for {@link BackupHelper}. */ public static final String TAG = "BatteryBackupHelper"; private static final String DEVICE_IDLE_SERVICE = "deviceidle"; + private static final String BATTERY_OPTIMIZE_BACKUP_FILE_NAME = + "battery_optimize_backup_historical_logs"; static final String DELIMITER = ","; static final String DELIMITER_MODE = ":"; @@ -141,6 +146,7 @@ public final class BatteryBackupHelper implements BackupHelper { int backupCount = 0; final StringBuilder builder = new StringBuilder(); final AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class); + final SharedPreferences sharedPreferences = getSharedPreferences(mContext); // Converts application into the AppUsageState. for (ApplicationInfo info : applications) { final int mode = BatteryOptimizeUtils.getMode(appOps, info.uid, info.packageName); @@ -157,6 +163,9 @@ public final class BatteryBackupHelper implements BackupHelper { info.packageName + DELIMITER_MODE + optimizationMode; builder.append(packageOptimizeMode + DELIMITER); Log.d(TAG, "backupOptimizationMode: " + packageOptimizeMode); + BatteryHistoricalLogUtil.writeLog( + sharedPreferences, Action.BACKUP, info.packageName, + /* actionDescription */ "mode: " + optimizationMode); backupCount++; } @@ -210,6 +219,18 @@ public final class BatteryBackupHelper implements BackupHelper { restoreCount, (System.currentTimeMillis() - timestamp))); } + /** Dump the app optimization mode backup history data. */ + public static void dumpHistoricalData(Context context, PrintWriter writer) { + BatteryHistoricalLogUtil.printBatteryOptimizeHistoricalLog( + getSharedPreferences(context), writer); + } + + @VisibleForTesting + static SharedPreferences getSharedPreferences(Context context) { + return context.getSharedPreferences( + BATTERY_OPTIMIZE_BACKUP_FILE_NAME, Context.MODE_PRIVATE); + } + private void restoreOptimizationMode( String packageName, @BatteryOptimizeUtils.OptimizationMode int mode) { final int uid = BatteryUtils.getInstance(mContext).getPackageUid(packageName); diff --git a/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java b/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java index a827e6df74a..f82b7031749 100644 --- a/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java +++ b/src/com/android/settings/fuelgauge/BatteryHistoricalLogUtil.java @@ -37,40 +37,40 @@ public final class BatteryHistoricalLogUtil { @VisibleForTesting static final int MAX_ENTRIES = 40; - /** - * Writes a log entry. - * - *
Keeps up to {@link #MAX_ENTRIES} in the log, once that number is exceeded, it prunes the
- * oldest one.
- */
- static void writeLog(Context context, Action action, String pkg, String actionDescription) {
+ /** Writes a log entry for battery optimization mode. */
+ static void writeLog(
+ Context context, Action action, String packageName, String actionDescription) {
+ writeLog(getSharedPreferences(context), action, packageName, actionDescription);
+ }
+
+ static void writeLog(SharedPreferences sharedPreferences, Action action,
+ String packageName, String actionDescription) {
writeLog(
- context,
+ sharedPreferences,
BatteryOptimizeHistoricalLogEntry.newBuilder()
- .setPackageName(pkg)
+ .setPackageName(packageName)
.setAction(action)
.setActionDescription(actionDescription)
.setTimestamp(System.currentTimeMillis())
.build());
}
- private static void writeLog(Context context, BatteryOptimizeHistoricalLogEntry logEntry) {
- SharedPreferences sharedPreferences = getSharedPreferences(context);
-
+ private static void writeLog(
+ SharedPreferences sharedPreferences, BatteryOptimizeHistoricalLogEntry logEntry) {
BatteryOptimizeHistoricalLog existingLog =
parseLogFromString(sharedPreferences.getString(LOGS_KEY, ""));
BatteryOptimizeHistoricalLog.Builder newLogBuilder = existingLog.toBuilder();
- // Prune old entries
+ // Prune old entries to limit the max logging data count.
if (existingLog.getLogEntryCount() >= MAX_ENTRIES) {
newLogBuilder.removeLogEntry(0);
}
newLogBuilder.addLogEntry(logEntry);
+ String loggingContent =
+ Base64.encodeToString(newLogBuilder.build().toByteArray(), Base64.DEFAULT);
sharedPreferences
.edit()
- .putString(
- LOGS_KEY,
- Base64.encodeToString(newLogBuilder.build().toByteArray(), Base64.DEFAULT))
+ .putString(LOGS_KEY, loggingContent)
.apply();
}
@@ -79,34 +79,36 @@ public final class BatteryHistoricalLogUtil {
storedLogs, BatteryOptimizeHistoricalLog.getDefaultInstance());
}
- /**
- * Prints the historical log that has previously been stored by this utility.
- */
+ /** Prints the historical log that has previously been stored by this utility. */
public static void printBatteryOptimizeHistoricalLog(Context context, PrintWriter writer) {
+ printBatteryOptimizeHistoricalLog(getSharedPreferences(context), writer);
+ }
+
+ /** Prints the historical log that has previously been stored by this utility. */
+ public static void printBatteryOptimizeHistoricalLog(
+ SharedPreferences sharedPreferences, PrintWriter writer) {
writer.println("Battery optimize state history:");
- SharedPreferences sharedPreferences = getSharedPreferences(context);
BatteryOptimizeHistoricalLog existingLog =
parseLogFromString(sharedPreferences.getString(LOGS_KEY, ""));
List