[B&R] ignore backup system app or default app optimization modes

Avoid backup system app or default app optimization modes, since all of
them are using the MODE_UNRESTRICTED in default, and the system or
default apps may be different in the different devices.

BYPASS_INCLUSIVE_LANGUAGE_REASON=legacy method name

Test command for backup manager:
adb shell bmgr backupnow com.android.settings
adb shell dumpsys backup | grep Current

Bug: 192523697
Test: make SettingsRoboTests
Change-Id: I0862ee31fcfa3bece15c2d4fdef5b0ea70235967
This commit is contained in:
ykhung
2021-08-25 11:57:26 +08:00
committed by YUKAI HUNG
parent 8b3bb01ca8
commit a90496e92e
2 changed files with 72 additions and 10 deletions

View File

@@ -37,6 +37,8 @@ import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -63,6 +65,8 @@ public final class BatteryBackupHelper implements BackupHelper {
static final String KEY_FULL_POWER_LIST = "full_power_list"; static final String KEY_FULL_POWER_LIST = "full_power_list";
static final String KEY_OPTIMIZATION_LIST = "optimization_mode_list"; static final String KEY_OPTIMIZATION_LIST = "optimization_mode_list";
@VisibleForTesting
PowerAllowlistBackend mPowerAllowlistBackend;
@VisibleForTesting @VisibleForTesting
IDeviceIdleController mIDeviceIdleController; IDeviceIdleController mIDeviceIdleController;
@VisibleForTesting @VisibleForTesting
@@ -127,6 +131,7 @@ public final class BatteryBackupHelper implements BackupHelper {
Log.w(TAG, "no data found in the getInstalledApplications()"); Log.w(TAG, "no data found in the getInstalledApplications()");
return; return;
} }
int backupCount = 0;
final StringBuilder builder = new StringBuilder(); final StringBuilder builder = new StringBuilder();
final AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class); final AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class);
// Converts application into the AppUsageState. // Converts application into the AppUsageState.
@@ -136,20 +141,22 @@ public final class BatteryBackupHelper implements BackupHelper {
@BatteryOptimizeUtils.OptimizationMode @BatteryOptimizeUtils.OptimizationMode
final int optimizationMode = BatteryOptimizeUtils.getAppOptimizationMode( final int optimizationMode = BatteryOptimizeUtils.getAppOptimizationMode(
mode, allowlistedApps.contains(info.packageName)); mode, allowlistedApps.contains(info.packageName));
// Ignores default optimized or unknown state. // Ignores default optimized/unknown state or system/default apps.
if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED
|| optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN) { || optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN
|| isSystemOrDefaultApp(info.packageName)) {
continue; continue;
} }
final String packageOptimizeMode = final String packageOptimizeMode =
info.packageName + DELIMITER_MODE + optimizationMode; info.packageName + DELIMITER_MODE + optimizationMode;
builder.append(packageOptimizeMode + DELIMITER); builder.append(packageOptimizeMode + DELIMITER);
debugLog(packageOptimizeMode); debugLog(packageOptimizeMode);
backupCount++;
} }
writeBackupData(data, KEY_OPTIMIZATION_LIST, builder.toString()); writeBackupData(data, KEY_OPTIMIZATION_LIST, builder.toString());
Log.d(TAG, String.format("backup getInstalledApplications() size=%d in %d/ms", Log.d(TAG, String.format("backup getInstalledApplications():%d count=%d in %d/ms",
applications.size(), (System.currentTimeMillis() - timestamp))); applications.size(), backupCount, (System.currentTimeMillis() - timestamp)));
} }
// Provides an opportunity to inject mock IDeviceIdleController for testing. // Provides an opportunity to inject mock IDeviceIdleController for testing.
@@ -170,6 +177,20 @@ public final class BatteryBackupHelper implements BackupHelper {
return mIPackageManager; return mIPackageManager;
} }
private PowerAllowlistBackend getPowerAllowlistBackend() {
if (mPowerAllowlistBackend != null) {
return mPowerAllowlistBackend;
}
mPowerAllowlistBackend = PowerAllowlistBackend.getInstance(mContext);
return mPowerAllowlistBackend;
}
private boolean isSystemOrDefaultApp(String packageName) {
final PowerAllowlistBackend powerAllowlistBackend = getPowerAllowlistBackend();
return powerAllowlistBackend.isSysAllowlisted(packageName)
|| powerAllowlistBackend.isDefaultActiveApp(packageName);
}
private List<ApplicationInfo> getInstalledApplications() { private List<ApplicationInfo> getInstalledApplications() {
final List<ApplicationInfo> applications = new ArrayList<>(); final List<ApplicationInfo> applications = new ArrayList<>();
final UserManager um = mContext.getSystemService(UserManager.class); final UserManager um = mContext.getSystemService(UserManager.class);

View File

@@ -40,6 +40,8 @@ import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -59,6 +61,9 @@ import org.robolectric.annotation.Resetter;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {BatteryBackupHelperTest.ShadowUserHandle.class}) @Config(shadows = {BatteryBackupHelperTest.ShadowUserHandle.class})
public final class BatteryBackupHelperTest { public final class BatteryBackupHelperTest {
private static final String PACKAGE_NAME1 = "com.android.testing.1";
private static final String PACKAGE_NAME2 = "com.android.testing.2";
private static final String PACKAGE_NAME3 = "com.android.testing.3";
private Context mContext; private Context mContext;
private BatteryBackupHelper mBatteryBackupHelper; private BatteryBackupHelper mBatteryBackupHelper;
@@ -73,6 +78,8 @@ public final class BatteryBackupHelperTest {
private AppOpsManager mAppOpsManager; private AppOpsManager mAppOpsManager;
@Mock @Mock
private UserManager mUserManager; private UserManager mUserManager;
@Mock
private PowerAllowlistBackend mPowerAllowlistBackend;
@Before @Before
public void setUp() { public void setUp() {
@@ -84,6 +91,7 @@ public final class BatteryBackupHelperTest {
mBatteryBackupHelper = new BatteryBackupHelper(mContext); mBatteryBackupHelper = new BatteryBackupHelper(mContext);
mBatteryBackupHelper.mIDeviceIdleController = mDeviceController; mBatteryBackupHelper.mIDeviceIdleController = mDeviceController;
mBatteryBackupHelper.mIPackageManager = mIPackageManager; mBatteryBackupHelper.mIPackageManager = mIPackageManager;
mBatteryBackupHelper.mPowerAllowlistBackend = mPowerAllowlistBackend;
} }
@After @After
@@ -172,16 +180,49 @@ public final class BatteryBackupHelperTest {
@Test @Test
public void backupOptimizationMode_backupOptimizationMode() throws Exception { public void backupOptimizationMode_backupOptimizationMode() throws Exception {
final String packageName1 = "com.android.testing.1"; final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
final String packageName2 = "com.android.testing.2"; createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3);
final String packageName3 = "com.android.testing.3";
final List<String> allowlistedApps = Arrays.asList(packageName1);
createTestingData(packageName1, packageName2, packageName3);
mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps); mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
// 2 for UNRESTRICTED mode and 1 for RESTRICTED mode. // 2 for UNRESTRICTED mode and 1 for RESTRICTED mode.
final String expectedResult = packageName1 + "|2," + packageName2 + "|1,"; final String expectedResult = PACKAGE_NAME1 + "|2," + PACKAGE_NAME2 + "|1,";
verifyBackupData(expectedResult);
}
@Test
public void backupOptimizationMode_backupOptimizationModeAndIgnoreSystemApp()
throws Exception {
final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3);
// Sets "com.android.testing.1" as system app.
doReturn(true).when(mPowerAllowlistBackend).isSysAllowlisted(PACKAGE_NAME1);
doReturn(false).when(mPowerAllowlistBackend).isDefaultActiveApp(anyString());
mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
// "com.android.testing.2" for RESTRICTED mode.
final String expectedResult = PACKAGE_NAME2 + "|1,";
verifyBackupData(expectedResult);
}
@Test
public void backupOptimizationMode_backupOptimizationModeAndIgnoreDefaultApp()
throws Exception {
final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3);
// Sets "com.android.testing.1" as device default app.
doReturn(true).when(mPowerAllowlistBackend).isDefaultActiveApp(PACKAGE_NAME1);
doReturn(false).when(mPowerAllowlistBackend).isSysAllowlisted(anyString());
mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
// "com.android.testing.2" for RESTRICTED mode.
final String expectedResult = PACKAGE_NAME2 + "|1,";
verifyBackupData(expectedResult);
}
private void verifyBackupData(String expectedResult) throws Exception {
final byte[] expectedBytes = expectedResult.getBytes(); final byte[] expectedBytes = expectedResult.getBytes();
verify(mBackupDataOutput).writeEntityHeader( verify(mBackupDataOutput).writeEntityHeader(
BatteryBackupHelper.KEY_OPTIMIZATION_LIST, expectedBytes.length); BatteryBackupHelper.KEY_OPTIMIZATION_LIST, expectedBytes.length);