Merge changes from topic "backup-eligibility"

* changes:
  Update robolectric tetst for BackupEligibilityRules refactor
  Migrate usages of AppBackupUtils to BackupEligibilityRules
  Refactor AppBackupUtils into BackupEligibilityRules
This commit is contained in:
Ruslan Tkhakokhov
2020-07-16 15:46:45 +00:00
committed by Android (Google) Code Review
19 changed files with 348 additions and 297 deletions

View File

@@ -33,7 +33,7 @@ import android.os.ParcelFileDescriptor;
import android.util.Slog;
import com.android.server.LocalServices;
import com.android.server.backup.utils.AppBackupUtils;
import com.android.server.backup.utils.BackupEligibilityRules;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@@ -134,10 +134,11 @@ public class PackageManagerBackupAgent extends BackupAgent {
init(packageMgr, packages, userId);
}
public PackageManagerBackupAgent(PackageManager packageMgr, int userId) {
public PackageManagerBackupAgent(PackageManager packageMgr, int userId,
BackupEligibilityRules backupEligibilityRules) {
init(packageMgr, null, userId);
evaluateStorablePackages();
evaluateStorablePackages(backupEligibilityRules);
}
private void init(PackageManager packageMgr, List<PackageInfo> packages, int userId) {
@@ -153,18 +154,19 @@ public class PackageManagerBackupAgent extends BackupAgent {
// We will need to refresh our understanding of what is eligible for
// backup periodically; this entry point serves that purpose.
public void evaluateStorablePackages() {
mAllPackages = getStorableApplications(mPackageManager, mUserId);
public void evaluateStorablePackages(BackupEligibilityRules backupEligibilityRules) {
mAllPackages = getStorableApplications(mPackageManager, mUserId, backupEligibilityRules);
}
/** Gets all packages installed on user {@code userId} eligible for backup. */
public static List<PackageInfo> getStorableApplications(PackageManager pm, int userId) {
public static List<PackageInfo> getStorableApplications(PackageManager pm, int userId,
BackupEligibilityRules backupEligibilityRules) {
List<PackageInfo> pkgs =
pm.getInstalledPackagesAsUser(PackageManager.GET_SIGNING_CERTIFICATES, userId);
int N = pkgs.size();
for (int a = N-1; a >= 0; a--) {
PackageInfo pkg = pkgs.get(a);
if (!AppBackupUtils.appIsEligibleForBackup(pkg.applicationInfo, userId)) {
if (!backupEligibilityRules.appIsEligibleForBackup(pkg.applicationInfo)) {
pkgs.remove(a);
}
}

View File

@@ -68,6 +68,7 @@ import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Binder;
@@ -127,7 +128,7 @@ import com.android.server.backup.restore.ActiveRestoreSession;
import com.android.server.backup.restore.PerformUnifiedRestoreTask;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.transport.TransportNotRegisteredException;
import com.android.server.backup.utils.AppBackupUtils;
import com.android.server.backup.utils.BackupEligibilityRules;
import com.android.server.backup.utils.BackupManagerMonitorUtils;
import com.android.server.backup.utils.BackupObserverUtils;
import com.android.server.backup.utils.SparseArrayUtils;
@@ -336,6 +337,7 @@ public class UserBackupManagerService {
private final BackupManagerConstants mConstants;
private final BackupWakeLock mWakelock;
private final BackupHandler mBackupHandler;
private final BackupEligibilityRules mScheduledBackupEligibility;
private final IBackupManager mBackupManagerBinder;
@@ -563,6 +565,7 @@ public class UserBackupManagerService {
mActivityManager = null;
mStorageManager = null;
mBackupManagerBinder = null;
mScheduledBackupEligibility = null;
}
private UserBackupManagerService(
@@ -579,6 +582,8 @@ public class UserBackupManagerService {
mPackageManagerBinder = AppGlobals.getPackageManager();
mActivityManager = ActivityManager.getService();
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
mScheduledBackupEligibility = getEligibilityRules(mPackageManager, userId,
OperationType.BACKUP);
mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
@@ -914,7 +919,13 @@ public class UserBackupManagerService {
* non-lifecycle agent instance, so we manually set up the context topology for it.
*/
public BackupAgent makeMetadataAgent() {
PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent(mPackageManager, mUserId);
return makeMetadataAgentWithEligibilityRules(mScheduledBackupEligibility);
}
public BackupAgent makeMetadataAgentWithEligibilityRules(
BackupEligibilityRules backupEligibilityRules) {
PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent(mPackageManager, mUserId,
backupEligibilityRules);
pmAgent.attach(mContext);
pmAgent.onCreate(UserHandle.of(mUserId));
return pmAgent;
@@ -996,7 +1007,8 @@ public class UserBackupManagerService {
boolean changed = false;
ArrayList<FullBackupEntry> schedule = null;
List<PackageInfo> apps =
PackageManagerBackupAgent.getStorableApplications(mPackageManager, mUserId);
PackageManagerBackupAgent.getStorableApplications(mPackageManager, mUserId,
mScheduledBackupEligibility);
if (mFullBackupScheduleFile.exists()) {
try (FileInputStream fstream = new FileInputStream(mFullBackupScheduleFile);
@@ -1026,9 +1038,9 @@ public class UserBackupManagerService {
foundApps.add(pkgName); // all apps that we've addressed already
try {
PackageInfo pkg = mPackageManager.getPackageInfoAsUser(pkgName, 0, mUserId);
if (AppBackupUtils.appGetsFullBackup(pkg)
&& AppBackupUtils.appIsEligibleForBackup(pkg.applicationInfo,
mUserId)) {
if (mScheduledBackupEligibility.appGetsFullBackup(pkg)
&& mScheduledBackupEligibility.appIsEligibleForBackup(
pkg.applicationInfo)) {
schedule.add(new FullBackupEntry(pkgName, lastBackup));
} else {
if (DEBUG) {
@@ -1047,9 +1059,9 @@ public class UserBackupManagerService {
// New apps can arrive "out of band" via OTA and similar, so we also need to
// scan to make sure that we're tracking all full-backup candidates properly
for (PackageInfo app : apps) {
if (AppBackupUtils.appGetsFullBackup(app)
&& AppBackupUtils.appIsEligibleForBackup(app.applicationInfo,
mUserId)) {
if (mScheduledBackupEligibility.appGetsFullBackup(app)
&& mScheduledBackupEligibility.appIsEligibleForBackup(
app.applicationInfo)) {
if (!foundApps.contains(app.packageName)) {
if (MORE_DEBUG) {
Slog.i(
@@ -1080,8 +1092,9 @@ public class UserBackupManagerService {
changed = true;
schedule = new ArrayList<>(apps.size());
for (PackageInfo info : apps) {
if (AppBackupUtils.appGetsFullBackup(info) && AppBackupUtils.appIsEligibleForBackup(
info.applicationInfo, mUserId)) {
if (mScheduledBackupEligibility.appGetsFullBackup(info)
&& mScheduledBackupEligibility.appIsEligibleForBackup(
info.applicationInfo)) {
schedule.add(new FullBackupEntry(info.packageName, 0));
}
}
@@ -1381,9 +1394,9 @@ public class UserBackupManagerService {
PackageInfo app =
mPackageManager.getPackageInfoAsUser(
packageName, /* flags */ 0, mUserId);
if (AppBackupUtils.appGetsFullBackup(app)
&& AppBackupUtils.appIsEligibleForBackup(
app.applicationInfo, mUserId)) {
if (mScheduledBackupEligibility.appGetsFullBackup(app)
&& mScheduledBackupEligibility.appIsEligibleForBackup(
app.applicationInfo)) {
enqueueFullBackup(packageName, now);
scheduleNextFullBackupJob(0);
} else {
@@ -1881,9 +1894,11 @@ public class UserBackupManagerService {
OnTaskFinishedListener listener =
caller -> mTransportManager.disposeOfTransportClient(transportClient, caller);
BackupEligibilityRules backupEligibilityRules = getEligibilityRulesForOperation(
operationType);
Message msg = mBackupHandler.obtainMessage(MSG_REQUEST_BACKUP);
msg.obj = getRequestBackupParams(packages, observer, monitor, flags, operationType,
msg.obj = getRequestBackupParams(packages, observer, monitor, flags, backupEligibilityRules,
transportClient, transportDirName, listener);
mBackupHandler.sendMessage(msg);
return BackupManager.SUCCESS;
@@ -1891,7 +1906,7 @@ public class UserBackupManagerService {
@VisibleForTesting
BackupParams getRequestBackupParams(String[] packages, IBackupObserver observer,
IBackupManagerMonitor monitor, int flags, @OperationType int operationType,
IBackupManagerMonitor monitor, int flags, BackupEligibilityRules backupEligibilityRules,
TransportClient transportClient, String transportDirName,
OnTaskFinishedListener listener) {
ArrayList<String> fullBackupList = new ArrayList<>();
@@ -1904,13 +1919,12 @@ public class UserBackupManagerService {
try {
PackageInfo packageInfo = mPackageManager.getPackageInfoAsUser(packageName,
PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
if (!appIsEligibleForBackup(packageInfo.applicationInfo, mUserId,
operationType)) {
if (!backupEligibilityRules.appIsEligibleForBackup(packageInfo.applicationInfo)) {
BackupObserverUtils.sendBackupOnPackageResult(observer, packageName,
BackupManager.ERROR_BACKUP_NOT_ALLOWED);
continue;
}
if (appGetsFullBackup(packageInfo, operationType)) {
if (backupEligibilityRules.appGetsFullBackup(packageInfo)) {
fullBackupList.add(packageInfo.packageName);
} else {
kvBackupList.add(packageInfo.packageName);
@@ -1941,18 +1955,7 @@ public class UserBackupManagerService {
return new BackupParams(transportClient, transportDirName, kvBackupList, fullBackupList,
observer, monitor, listener, /* userInitiated */ true, nonIncrementalBackup,
operationType);
}
@VisibleForTesting
boolean appIsEligibleForBackup(ApplicationInfo applicationInfo, int userId,
@OperationType int operationType) {
return AppBackupUtils.appIsEligibleForBackup(applicationInfo, userId, operationType);
}
@VisibleForTesting
boolean appGetsFullBackup(PackageInfo packageInfo, @OperationType int operationType) {
return AppBackupUtils.appGetsFullBackup(packageInfo, operationType);
backupEligibilityRules);
}
/** Cancel all running backups. */
@@ -2481,7 +2484,7 @@ public class UserBackupManagerService {
try {
PackageInfo appInfo = mPackageManager.getPackageInfoAsUser(
entry.packageName, 0, mUserId);
if (!AppBackupUtils.appGetsFullBackup(appInfo)) {
if (!mScheduledBackupEligibility.appGetsFullBackup(appInfo)) {
// The head app isn't supposed to get full-data backups [any more];
// so we cull it and force a loop around to consider the new head
// app.
@@ -2562,7 +2565,8 @@ public class UserBackupManagerService {
/* backupObserver */ null,
/* monitor */ null,
/* userInitiated */ false,
"BMS.beginFullBackup()");
"BMS.beginFullBackup()",
getEligibilityRulesForOperation(OperationType.BACKUP));
// Acquiring wakelock for PerformFullTransportBackupTask before its start.
mWakelock.acquire();
(new Thread(mRunningFullBackupTask)).start();
@@ -3001,7 +3005,7 @@ public class UserBackupManagerService {
AdbBackupParams params = new AdbBackupParams(fd, includeApks, includeObbs,
includeShared, doWidgets, doAllApps, includeSystem, compress, doKeyValue,
pkgList);
pkgList, mScheduledBackupEligibility);
final int token = generateRandomIntegerToken();
synchronized (mAdbBackupRestoreConfirmations) {
mAdbBackupRestoreConfirmations.put(token, params);
@@ -3086,7 +3090,8 @@ public class UserBackupManagerService {
/* backupObserver */ null,
/* monitor */ null,
/* userInitiated */ false,
"BMS.fullTransportBackup()");
"BMS.fullTransportBackup()",
getEligibilityRulesForOperation(OperationType.BACKUP));
// Acquiring wakelock for PerformFullTransportBackupTask before its start.
mWakelock.acquire();
(new Thread(task, "full-transport-master")).start();
@@ -4137,8 +4142,8 @@ public class UserBackupManagerService {
TransportClient transportClient =
mTransportManager.getCurrentTransportClient(callerLogString);
boolean eligible =
AppBackupUtils.appIsRunningAndEligibleForBackupWithTransport(
transportClient, packageName, mPackageManager, mUserId);
mScheduledBackupEligibility.appIsRunningAndEligibleForBackupWithTransport(
transportClient, packageName);
if (transportClient != null) {
mTransportManager.disposeOfTransportClient(transportClient, callerLogString);
}
@@ -4160,9 +4165,8 @@ public class UserBackupManagerService {
mTransportManager.getCurrentTransportClient(callerLogString);
List<String> eligibleApps = new LinkedList<>();
for (String packageName : packages) {
if (AppBackupUtils
.appIsRunningAndEligibleForBackupWithTransport(
transportClient, packageName, mPackageManager, mUserId)) {
if (mScheduledBackupEligibility.appIsRunningAndEligibleForBackupWithTransport(
transportClient, packageName)) {
eligibleApps.add(packageName);
}
}
@@ -4175,6 +4179,17 @@ public class UserBackupManagerService {
}
}
public BackupEligibilityRules getEligibilityRulesForOperation(
@OperationType int operationType) {
return getEligibilityRules(mPackageManager, mUserId, operationType);
}
private static BackupEligibilityRules getEligibilityRules(PackageManager packageManager,
int userId, @OperationType int operationType) {
return new BackupEligibilityRules(packageManager,
LocalServices.getService(PackageManagerInternal.class), userId, operationType);
}
/** Prints service state for 'dumpsys backup'. */
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
long identityToken = Binder.clearCallingIdentity();

View File

@@ -24,6 +24,8 @@ import static com.android.server.backup.UserBackupManagerService.BACKUP_FILE_HEA
import static com.android.server.backup.UserBackupManagerService.BACKUP_FILE_VERSION;
import static com.android.server.backup.UserBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import android.app.backup.BackupManager;
import android.app.backup.BackupManager.OperationType;
import android.app.backup.IFullBackupRestoreObserver;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
@@ -38,7 +40,7 @@ import com.android.server.AppWidgetBackupBridge;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.KeyValueAdbBackupEngine;
import com.android.server.backup.UserBackupManagerService;
import com.android.server.backup.utils.AppBackupUtils;
import com.android.server.backup.utils.BackupEligibilityRules;
import com.android.server.backup.utils.PasswordUtils;
import java.io.ByteArrayOutputStream;
@@ -83,12 +85,14 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
private final String mCurrentPassword;
private final String mEncryptPassword;
private final int mCurrentOpToken;
private final BackupEligibilityRules mBackupEligibilityRules;
public PerformAdbBackupTask(UserBackupManagerService backupManagerService,
ParcelFileDescriptor fd, IFullBackupRestoreObserver observer,
boolean includeApks, boolean includeObbs, boolean includeShared, boolean doWidgets,
String curPassword, String encryptPassword, boolean doAllApps, boolean doSystem,
boolean doCompress, boolean doKeyValue, String[] packages, AtomicBoolean latch) {
boolean doCompress, boolean doKeyValue, String[] packages, AtomicBoolean latch,
BackupEligibilityRules backupEligibilityRules) {
super(observer);
mUserBackupManagerService = backupManagerService;
mCurrentOpToken = backupManagerService.generateRandomIntegerToken();
@@ -119,6 +123,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
}
mCompress = doCompress;
mKeyValue = doKeyValue;
mBackupEligibilityRules = backupEligibilityRules;
}
private void addPackagesToSet(TreeMap<String, PackageInfo> set, List<String> pkgNames) {
@@ -286,15 +291,14 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
Iterator<Entry<String, PackageInfo>> iter = packagesToBackup.entrySet().iterator();
while (iter.hasNext()) {
PackageInfo pkg = iter.next().getValue();
if (!AppBackupUtils.appIsEligibleForBackup(pkg.applicationInfo,
mUserBackupManagerService.getUserId())
|| AppBackupUtils.appIsStopped(pkg.applicationInfo)) {
if (!mBackupEligibilityRules.appIsEligibleForBackup(pkg.applicationInfo)
|| mBackupEligibilityRules.appIsStopped(pkg.applicationInfo)) {
iter.remove();
if (DEBUG) {
Slog.i(TAG, "Package " + pkg.packageName
+ " is not eligible for backup, removing.");
}
} else if (AppBackupUtils.appIsKeyValueOnly(pkg)) {
} else if (mBackupEligibilityRules.appIsKeyValueOnly(pkg)) {
iter.remove();
if (DEBUG) {
Slog.i(TAG, "Package " + pkg.packageName

View File

@@ -53,7 +53,7 @@ import com.android.server.backup.internal.Operation;
import com.android.server.backup.remote.RemoteCall;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.transport.TransportNotAvailableException;
import com.android.server.backup.utils.AppBackupUtils;
import com.android.server.backup.utils.BackupEligibilityRules;
import com.android.server.backup.utils.BackupManagerMonitorUtils;
import com.android.server.backup.utils.BackupObserverUtils;
@@ -107,7 +107,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
IBackupObserver backupObserver,
IBackupManagerMonitor monitor,
boolean userInitiated,
String caller) {
String caller,
BackupEligibilityRules backupEligibilityRules) {
TransportManager transportManager = backupManagerService.getTransportManager();
TransportClient transportClient = transportManager.getCurrentTransportClient(caller);
OnTaskFinishedListener listener =
@@ -124,7 +125,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
backupObserver,
monitor,
listener,
userInitiated);
userInitiated,
backupEligibilityRules);
}
private static final String TAG = "PFTBT";
@@ -151,6 +153,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
private volatile boolean mCancelAll;
private final int mCurrentOpToken;
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
private final BackupEligibilityRules mBackupEligibilityRules;
public PerformFullTransportBackupTask(UserBackupManagerService backupManagerService,
TransportClient transportClient,
@@ -158,7 +161,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
String[] whichPackages, boolean updateSchedule,
FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver,
@Nullable IBackupManagerMonitor monitor, @Nullable OnTaskFinishedListener listener,
boolean userInitiated) {
boolean userInitiated, BackupEligibilityRules backupEligibilityRules) {
super(observer);
this.mUserBackupManagerService = backupManagerService;
mTransportClient = transportClient;
@@ -176,6 +179,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
backupManagerService.getAgentTimeoutParameters(),
"Timeout parameters cannot be null");
mUserId = backupManagerService.getUserId();
mBackupEligibilityRules = backupEligibilityRules;
if (backupManagerService.isBackupOperationInProgress()) {
if (DEBUG) {
@@ -193,7 +197,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
PackageInfo info = pm.getPackageInfoAsUser(pkg,
PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
mCurrentPackage = info;
if (!AppBackupUtils.appIsEligibleForBackup(info.applicationInfo, mUserId)) {
if (!mBackupEligibilityRules.appIsEligibleForBackup(info.applicationInfo)) {
// Cull any packages that have indicated that backups are not permitted,
// that run as system-domain uids but do not define their own backup agents,
// as well as any explicit mention of the 'special' shared-storage agent
@@ -209,7 +213,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
BackupObserverUtils.sendBackupOnPackageResult(mBackupObserver, pkg,
BackupManager.ERROR_BACKUP_NOT_ALLOWED);
continue;
} else if (!AppBackupUtils.appGetsFullBackup(info)) {
} else if (!mBackupEligibilityRules.appGetsFullBackup(info)) {
// Cull any packages that are found in the queue but now aren't supposed
// to get full-data backup operations.
if (MORE_DEBUG) {
@@ -224,7 +228,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
BackupObserverUtils.sendBackupOnPackageResult(mBackupObserver, pkg,
BackupManager.ERROR_BACKUP_NOT_ALLOWED);
continue;
} else if (AppBackupUtils.appIsStopped(info.applicationInfo)) {
} else if (mBackupEligibilityRules.appIsStopped(info.applicationInfo)) {
// Cull any packages in the 'stopped' state: they've either just been
// installed or have explicitly been force-stopped by the user. In both
// cases we do not want to launch them for backup.

View File

@@ -20,6 +20,8 @@ import static com.android.server.backup.BackupManagerService.DEBUG;
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
import static com.android.server.backup.BackupManagerService.TAG;
import android.app.backup.BackupManager;
import android.app.backup.BackupManager.OperationType;
import android.app.backup.RestoreSet;
import android.os.Handler;
import android.os.HandlerThread;
@@ -222,7 +224,9 @@ public class BackupHandler extends Handler {
listener,
Collections.emptyList(),
/* userInitiated */ false,
/* nonIncremental */ false);
/* nonIncremental */ false,
backupManagerService.getEligibilityRulesForOperation(
OperationType.BACKUP));
} catch (Exception e) {
// unable to ask the transport its dir name -- transient failure, since
// the above check succeeded. Try again next time.
@@ -279,7 +283,8 @@ public class BackupHandler extends Handler {
params.observer, params.includeApks, params.includeObbs,
params.includeShared, params.doWidgets, params.curPassword,
params.encryptPassword, params.allApps, params.includeSystem,
params.doCompress, params.includeKeyValue, params.packages, params.latch);
params.doCompress, params.includeKeyValue, params.packages, params.latch,
params.backupEligibilityRules);
(new Thread(task, "adb-backup")).start();
break;
}
@@ -299,7 +304,9 @@ public class BackupHandler extends Handler {
params.pmToken,
params.isSystemRestore,
params.filterSet,
params.listener);
params.listener,
backupManagerService.getEligibilityRulesForOperation(
OperationType.BACKUP));
synchronized (backupManagerService.getPendingRestores()) {
if (backupManagerService.isRestoreInProgress()) {
@@ -462,7 +469,8 @@ public class BackupHandler extends Handler {
params.listener,
params.fullPackages,
/* userInitiated */ true,
params.nonIncrementalBackup);
params.nonIncrementalBackup,
params.mBackupEligibilityRules);
break;
}

View File

@@ -67,7 +67,7 @@ import com.android.server.backup.remote.RemoteCallable;
import com.android.server.backup.remote.RemoteResult;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.transport.TransportNotAvailableException;
import com.android.server.backup.utils.AppBackupUtils;
import com.android.server.backup.utils.BackupEligibilityRules;
import libcore.io.IoUtils;
@@ -220,7 +220,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
OnTaskFinishedListener listener,
List<String> pendingFullBackups,
boolean userInitiated,
boolean nonIncremental) {
boolean nonIncremental,
BackupEligibilityRules backupEligibilityRules) {
KeyValueBackupReporter reporter =
new KeyValueBackupReporter(backupManagerService, observer, monitor);
KeyValueBackupTask task =
@@ -234,7 +235,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
listener,
pendingFullBackups,
userInitiated,
nonIncremental);
nonIncremental,
backupEligibilityRules);
Thread thread = new Thread(task, "key-value-backup-" + THREAD_COUNT.incrementAndGet());
thread.start();
KeyValueBackupReporter.onNewThread(thread.getName());
@@ -258,6 +260,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
private final List<String> mPendingFullBackups;
private final Object mQueueLock;
@Nullable private final DataChangedJournal mJournal;
private final BackupEligibilityRules mBackupEligibilityRules;
@Nullable private PerformFullTransportBackupTask mFullBackupTask;
@Nullable private IBackupAgent mAgent;
@@ -307,7 +310,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
OnTaskFinishedListener taskFinishedListener,
List<String> pendingFullBackups,
boolean userInitiated,
boolean nonIncremental) {
boolean nonIncremental,
BackupEligibilityRules backupEligibilityRules) {
mBackupManagerService = backupManagerService;
mPackageManager = backupManagerService.getPackageManager();
mTransportClient = transportClient;
@@ -330,6 +334,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
mQueueLock = mBackupManagerService.getQueueLock();
mBlankStateFile = new File(mStateDirectory, BLANK_STATE_FILE_NAME);
mUserId = backupManagerService.getUserId();
mBackupEligibilityRules = backupEligibilityRules;
}
private void registerTask() {
@@ -456,9 +461,9 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
/** Determine if a package is eligible to be backed up to the transport */
private boolean isEligibleForNoDataCall(PackageInfo packageInfo) {
return AppBackupUtils.appIsKeyValueOnly(packageInfo)
&& AppBackupUtils.appIsRunningAndEligibleForBackupWithTransport(mTransportClient,
packageInfo.packageName, mPackageManager, mUserId);
return mBackupEligibilityRules.appIsKeyValueOnly(packageInfo)
&& mBackupEligibilityRules.appIsRunningAndEligibleForBackupWithTransport(
mTransportClient, packageInfo.packageName);
}
/** Send the "no data changed" message to a transport for a specific package */
@@ -642,7 +647,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
mReporter.getObserver(),
mReporter.getMonitor(),
mTaskFinishedListener,
mUserInitiated);
mUserInitiated,
mBackupEligibilityRules);
}
private void backupPm() throws TaskException {
@@ -704,15 +710,15 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
throw AgentException.permanent(e);
}
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
if (!AppBackupUtils.appIsEligibleForBackup(applicationInfo, mUserId)) {
if (!mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo)) {
mReporter.onPackageNotEligibleForBackup(packageName);
throw AgentException.permanent();
}
if (AppBackupUtils.appGetsFullBackup(packageInfo)) {
if (mBackupEligibilityRules.appGetsFullBackup(packageInfo)) {
mReporter.onPackageEligibleForFullBackup(packageName);
throw AgentException.permanent();
}
if (AppBackupUtils.appIsStopped(applicationInfo)) {
if (mBackupEligibilityRules.appIsStopped(applicationInfo)) {
mReporter.onPackageStopped(packageName);
throw AgentException.permanent();
}
@@ -843,7 +849,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
/** Same as {@link #extractAgentData(PackageInfo)}, but only for PM package. */
private void extractPmAgentData(PackageInfo packageInfo) throws AgentException, TaskException {
Preconditions.checkArgument(packageInfo.packageName.equals(PM_PACKAGE));
BackupAgent pmAgent = mBackupManagerService.makeMetadataAgent();
BackupAgent pmAgent = mBackupManagerService.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
mAgent = IBackupAgent.Stub.asInterface(pmAgent.onBind());
extractAgentData(packageInfo, mAgent);
}

View File

@@ -18,6 +18,8 @@ package com.android.server.backup.params;
import android.os.ParcelFileDescriptor;
import com.android.server.backup.utils.BackupEligibilityRules;
public class AdbBackupParams extends AdbParams {
public boolean includeApks;
@@ -29,10 +31,12 @@ public class AdbBackupParams extends AdbParams {
public boolean doCompress;
public boolean includeKeyValue;
public String[] packages;
public BackupEligibilityRules backupEligibilityRules;
public AdbBackupParams(ParcelFileDescriptor output, boolean saveApks, boolean saveObbs,
boolean saveShared, boolean alsoWidgets, boolean doAllApps, boolean doSystem,
boolean compress, boolean doKeyValue, String[] pkgList) {
boolean compress, boolean doKeyValue, String[] pkgList,
BackupEligibilityRules eligibilityRules) {
fd = output;
includeApks = saveApks;
includeObbs = saveObbs;
@@ -43,5 +47,6 @@ public class AdbBackupParams extends AdbParams {
doCompress = compress;
includeKeyValue = doKeyValue;
packages = pkgList;
backupEligibilityRules = eligibilityRules;
}
}

View File

@@ -16,12 +16,12 @@
package com.android.server.backup.params;
import android.app.backup.BackupManager.OperationType;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
import com.android.server.backup.internal.OnTaskFinishedListener;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.utils.BackupEligibilityRules;
import java.util.ArrayList;
@@ -36,12 +36,12 @@ public class BackupParams {
public OnTaskFinishedListener listener;
public boolean userInitiated;
public boolean nonIncrementalBackup;
@OperationType public int operationType;
public BackupEligibilityRules mBackupEligibilityRules;
public BackupParams(TransportClient transportClient, String dirName,
ArrayList<String> kvPackages, ArrayList<String> fullPackages, IBackupObserver observer,
IBackupManagerMonitor monitor, OnTaskFinishedListener listener, boolean userInitiated,
boolean nonIncrementalBackup, int operationType) {
boolean nonIncrementalBackup, BackupEligibilityRules backupEligibilityRules) {
this.transportClient = transportClient;
this.dirName = dirName;
this.kvPackages = kvPackages;
@@ -51,6 +51,6 @@ public class BackupParams {
this.listener = listener;
this.userInitiated = userInitiated;
this.nonIncrementalBackup = nonIncrementalBackup;
this.operationType = operationType;
this.mBackupEligibilityRules = backupEligibilityRules;
}
}

View File

@@ -66,7 +66,7 @@ import com.android.server.backup.TransportManager;
import com.android.server.backup.UserBackupManagerService;
import com.android.server.backup.internal.OnTaskFinishedListener;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.utils.AppBackupUtils;
import com.android.server.backup.utils.BackupEligibilityRules;
import com.android.server.backup.utils.BackupManagerMonitorUtils;
import libcore.io.IoUtils;
@@ -186,7 +186,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
int pmToken,
boolean isFullSystemRestore,
@Nullable String[] filterSet,
OnTaskFinishedListener listener) {
OnTaskFinishedListener listener,
BackupEligibilityRules backupEligibilityRules) {
this.backupManagerService = backupManagerService;
mUserId = backupManagerService.getUserId();
mTransportManager = backupManagerService.getTransportManager();
@@ -218,7 +219,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// We want everything and a pony
List<PackageInfo> apps =
PackageManagerBackupAgent.getStorableApplications(
backupManagerService.getPackageManager(), mUserId);
backupManagerService.getPackageManager(), mUserId,
backupEligibilityRules);
filterSet = packagesToNames(apps);
if (DEBUG) {
Slog.i(TAG, "Full restore; asking about " + filterSet.length + " apps");
@@ -245,7 +247,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
continue;
}
if (AppBackupUtils.appIsEligibleForBackup(info.applicationInfo, mUserId)) {
if (backupEligibilityRules.appIsEligibleForBackup(info.applicationInfo)) {
mAcceptSet.add(info);
}
} catch (NameNotFoundException e) {

View File

@@ -47,12 +47,34 @@ import java.util.Set;
/**
* Utility methods wrapping operations on ApplicationInfo and PackageInfo.
*/
public class AppBackupUtils {
public class BackupEligibilityRules {
private static final boolean DEBUG = false;
// Whitelist of system packages that are eligible for backup in non-system users.
private static final Set<String> systemPackagesWhitelistedForAllUsers =
Sets.newArraySet(PACKAGE_MANAGER_SENTINEL, PLATFORM_PACKAGE_NAME);
private final PackageManager mPackageManager;
private final PackageManagerInternal mPackageManagerInternal;
private final int mUserId;
@OperationType private final int mOperationType;
public static BackupEligibilityRules forBackup(PackageManager packageManager,
PackageManagerInternal packageManagerInternal,
int userId) {
return new BackupEligibilityRules(packageManager, packageManagerInternal, userId,
OperationType.BACKUP);
}
public BackupEligibilityRules(PackageManager packageManager,
PackageManagerInternal packageManagerInternal,
int userId,
@OperationType int operationType) {
mPackageManager = packageManager;
mPackageManagerInternal = packageManagerInternal;
mUserId = userId;
mOperationType = operationType;
}
/**
* Returns whether app is eligible for backup.
*
@@ -65,32 +87,18 @@ public class AppBackupUtils {
* <li>it is the special shared-storage backup package used for 'adb backup'
* </ol>
*/
public static boolean appIsEligibleForBackup(ApplicationInfo app, int userId) {
return appIsEligibleForBackup(
app, LocalServices.getService(PackageManagerInternal.class), userId,
OperationType.BACKUP);
}
public static boolean appIsEligibleForBackup(ApplicationInfo app, int userId,
@OperationType int operationType) {
return appIsEligibleForBackup(
app, LocalServices.getService(PackageManagerInternal.class), userId, operationType);
}
@VisibleForTesting
static boolean appIsEligibleForBackup(
ApplicationInfo app, PackageManagerInternal packageManager, int userId,
@OperationType int operationType) {
public boolean appIsEligibleForBackup(ApplicationInfo app) {
// 1. their manifest states android:allowBackup="false"
boolean appAllowsBackup = (app.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0;
if (!appAllowsBackup && !forceFullBackup(app.uid, operationType)) {
if (!appAllowsBackup && !forceFullBackup(app.uid, mOperationType)) {
return false;
}
// 2. they run as a system-level uid
if (UserHandle.isCore(app.uid)) {
// and the backup is happening for non-system user on a non-whitelisted package.
if (userId != UserHandle.USER_SYSTEM
if (mUserId != UserHandle.USER_SYSTEM
&& !systemPackagesWhitelistedForAllUsers.contains(app.packageName)) {
return false;
}
@@ -111,7 +119,7 @@ public class AppBackupUtils {
return false;
}
return !appIsDisabled(app, packageManager, userId);
return !appIsDisabled(app);
}
/**
@@ -124,18 +132,16 @@ public class AppBackupUtils {
* {@link BackupTransport#isAppEligibleForBackup(PackageInfo, boolean)}
* </ol>
*/
public static boolean appIsRunningAndEligibleForBackupWithTransport(
public boolean appIsRunningAndEligibleForBackupWithTransport(
@Nullable TransportClient transportClient,
String packageName,
PackageManager pm,
int userId) {
String packageName) {
try {
PackageInfo packageInfo = pm.getPackageInfoAsUser(packageName,
PackageManager.GET_SIGNING_CERTIFICATES, userId);
PackageInfo packageInfo = mPackageManager.getPackageInfoAsUser(packageName,
PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
if (!appIsEligibleForBackup(applicationInfo, userId)
if (!appIsEligibleForBackup(applicationInfo)
|| appIsStopped(applicationInfo)
|| appIsDisabled(applicationInfo, userId)) {
|| appIsDisabled(applicationInfo)) {
return false;
}
if (transportClient != null) {
@@ -144,7 +150,7 @@ public class AppBackupUtils {
transportClient.connectOrThrow(
"AppBackupUtils.appIsRunningAndEligibleForBackupWithTransport");
return transport.isAppEligibleForBackup(
packageInfo, AppBackupUtils.appGetsFullBackup(packageInfo));
packageInfo, appGetsFullBackup(packageInfo));
} catch (Exception e) {
Slog.e(TAG, "Unable to ask about eligibility: " + e.getMessage());
}
@@ -157,14 +163,11 @@ public class AppBackupUtils {
}
/** Avoid backups of 'disabled' apps. */
static boolean appIsDisabled(ApplicationInfo app, int userId) {
return appIsDisabled(app, LocalServices.getService(PackageManagerInternal.class), userId);
}
@VisibleForTesting
static boolean appIsDisabled(
ApplicationInfo app, PackageManagerInternal packageManager, int userId) {
int enabledSetting = packageManager.getApplicationEnabledState(app.packageName, userId);
boolean appIsDisabled(
ApplicationInfo app) {
int enabledSetting = mPackageManagerInternal.getApplicationEnabledState(app.packageName,
mUserId);
switch (enabledSetting) {
case PackageManager.COMPONENT_ENABLED_STATE_DISABLED:
@@ -190,7 +193,7 @@ public class AppBackupUtils {
* <li>The app has just been installed.
* </ul>
*/
public static boolean appIsStopped(ApplicationInfo app) {
public boolean appIsStopped(ApplicationInfo app) {
return ((app.flags & ApplicationInfo.FLAG_STOPPED) != 0);
}
@@ -198,13 +201,9 @@ public class AppBackupUtils {
* Returns whether the app can get full backup. Does *not* check overall backup eligibility
* policy!
*/
public static boolean appGetsFullBackup(PackageInfo pkg) {
return appGetsFullBackup(pkg, OperationType.BACKUP);
}
@VisibleForTesting
public static boolean appGetsFullBackup(PackageInfo pkg, @OperationType int operationType) {
if (forceFullBackup(pkg.applicationInfo.uid, operationType)) {
public boolean appGetsFullBackup(PackageInfo pkg) {
if (forceFullBackup(pkg.applicationInfo.uid, mOperationType)) {
// If this is a migration, all non-system packages get full backup.
return true;
}
@@ -218,12 +217,11 @@ public class AppBackupUtils {
return true;
}
public static boolean appIgnoresIncludeExcludeRules(ApplicationInfo app,
@OperationType int operationType) {
return forceFullBackup(app.uid, operationType);
public boolean appIgnoresIncludeExcludeRules(ApplicationInfo app) {
return forceFullBackup(app.uid, mOperationType);
}
private static boolean forceFullBackup(int appUid, @OperationType int operationType) {
private boolean forceFullBackup(int appUid, @OperationType int operationType) {
return operationType == OperationType.MIGRATION &&
!UserHandle.isCore(appUid);
}
@@ -232,7 +230,7 @@ public class AppBackupUtils {
* Returns whether the app is only capable of doing key/value. We say it's not if it allows full
* backup, and it is otherwise.
*/
public static boolean appIsKeyValueOnly(PackageInfo pkg) {
public boolean appIsKeyValueOnly(PackageInfo pkg) {
return !appGetsFullBackup(pkg);
}
@@ -254,8 +252,7 @@ public class AppBackupUtils {
*
* Note that if {@param target} is null we return false.
*/
public static boolean signaturesMatch(Signature[] storedSigs, PackageInfo target,
PackageManagerInternal pmi) {
public boolean signaturesMatch(Signature[] storedSigs, PackageInfo target) {
if (target == null || target.packageName == null) {
return false;
}
@@ -296,7 +293,7 @@ public class AppBackupUtils {
// TODO(b/73988180): address the case that app has declared restoreAnyVersion and is
// restoring from higher version to lower after having rotated the key (i.e. higher
// version has different sig than lower version that we want to restore to)
return pmi.isDataRestoreSafe(storedSigs[0], target.packageName);
return mPackageManagerInternal.isDataRestoreSafe(storedSigs[0], target.packageName);
} else {
// the app couldn't have rotated keys, since it was signed with multiple sigs - do
// a check to see if we find a match for all stored sigs

View File

@@ -159,7 +159,9 @@ public class RestoreUtils {
Signature[] sigs = manifestSignatures.get(info.packageName);
PackageManagerInternal pmi = LocalServices.getService(
PackageManagerInternal.class);
if (AppBackupUtils.signaturesMatch(sigs, pkg, pmi)) {
BackupEligibilityRules eligibilityRules =
BackupEligibilityRules.forBackup(packageManager, pmi, userId);
if (eligibilityRules.signaturesMatch(sigs, pkg)) {
// If this is a system-uid app without a declared backup agent,
// don't restore any of the file data.
if (UserHandle.isCore(pkg.applicationInfo.uid)

View File

@@ -394,7 +394,8 @@ public class TarBackupReader {
}
RestorePolicy policy = RestorePolicy.IGNORE;
BackupEligibilityRules eligibilityRules = BackupEligibilityRules.forBackup(packageManager,
pmi, userId);
// Okay, got the manifest info we need...
try {
PackageInfo pkgInfo = packageManager.getPackageInfoAsUser(
@@ -413,7 +414,7 @@ public class TarBackupReader {
// such packages are signed with the platform cert instead of
// the app developer's cert, so they're different on every
// device.
if (AppBackupUtils.signaturesMatch(signatures, pkgInfo, pmi)) {
if (eligibilityRules.signaturesMatch(signatures, pkgInfo)) {
if ((pkgInfo.applicationInfo.flags
& ApplicationInfo.FLAG_RESTORE_ANY_VERSION) != 0) {
Slog.i(TAG, "Package has restoreAnyVersion; taking data");

View File

@@ -61,7 +61,7 @@ import com.android.server.backup.testing.BackupManagerServiceTestUtils;
import com.android.server.backup.testing.TransportData;
import com.android.server.backup.testing.TransportTestUtils.TransportMock;
import com.android.server.backup.transport.TransportNotRegisteredException;
import com.android.server.testing.shadows.ShadowAppBackupUtils;
import com.android.server.testing.shadows.ShadowBackupEligibilityRules;
import com.android.server.testing.shadows.ShadowApplicationPackageManager;
import com.android.server.testing.shadows.ShadowBinder;
import com.android.server.testing.shadows.ShadowKeyValueBackupJob;
@@ -99,7 +99,7 @@ import java.util.List;
@RunWith(RobolectricTestRunner.class)
@Config(
shadows = {
ShadowAppBackupUtils.class,
ShadowBackupEligibilityRules.class,
ShadowApplicationPackageManager.class,
ShadowSystemServiceRegistry.class
})
@@ -159,7 +159,7 @@ public class UserBackupManagerServiceTest {
@After
public void tearDown() throws Exception {
mBackupThread.quit();
ShadowAppBackupUtils.reset();
ShadowBackupEligibilityRules.reset();
ShadowApplicationPackageManager.reset();
}
@@ -236,7 +236,7 @@ public class UserBackupManagerServiceTest {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
TransportMock transportMock = setUpCurrentTransport(mTransportManager, backupTransport());
registerPackages(PACKAGE_1);
ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
ShadowBackupEligibilityRules.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
boolean result = backupManagerService.isAppEligibleForBackup(PACKAGE_1);
@@ -255,7 +255,7 @@ public class UserBackupManagerServiceTest {
mShadowContext.denyPermissions(android.Manifest.permission.BACKUP);
setUpCurrentTransport(mTransportManager, mTransport);
registerPackages(PACKAGE_1);
ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
ShadowBackupEligibilityRules.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
expectThrows(
@@ -273,7 +273,7 @@ public class UserBackupManagerServiceTest {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
TransportMock transportMock = setUpCurrentTransport(mTransportManager, mTransport);
registerPackages(PACKAGE_1, PACKAGE_2);
ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
ShadowBackupEligibilityRules.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks();
String[] filtered =
@@ -801,7 +801,7 @@ public class UserBackupManagerServiceTest {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
for (String packageName : packages) {
registerPackages(packageName);
ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(packageName);
ShadowBackupEligibilityRules.setAppRunningAndEligibleForBackupWithTransport(packageName);
}
setUpCurrentTransport(mTransportManager, mTransport);
}
@@ -962,7 +962,7 @@ public class UserBackupManagerServiceTest {
@Config(shadows = ShadowKeyValueBackupTask.class)
public void testRequestBackup_whenPackageIsFullBackup() throws Exception {
setUpForRequestBackup(PACKAGE_1);
ShadowAppBackupUtils.setAppGetsFullBackup(PACKAGE_1);
ShadowBackupEligibilityRules.setAppGetsFullBackup(PACKAGE_1);
UserBackupManagerService backupManagerService =
createBackupManagerServiceForRequestBackup();

View File

@@ -115,6 +115,7 @@ import com.android.server.backup.testing.TestUtils.ThrowingRunnable;
import com.android.server.backup.testing.TransportData;
import com.android.server.backup.testing.TransportTestUtils;
import com.android.server.backup.testing.TransportTestUtils.TransportMock;
import com.android.server.backup.utils.BackupEligibilityRules;
import com.android.server.testing.shadows.FrameworkShadowLooper;
import com.android.server.testing.shadows.ShadowApplicationPackageManager;
import com.android.server.testing.shadows.ShadowBackupDataInput;
@@ -176,6 +177,7 @@ public class KeyValueBackupTaskTest {
private static final String BACKUP_AGENT_SHARED_PREFS_SYNCHRONIZER_CLASS =
"android.app.backup.BackupAgent$SharedPrefsSynchronizer";
private static final int USER_ID = 10;
private static final int OPERATION_TYPE = BackupManager.OperationType.BACKUP;
@Mock private TransportManager mTransportManager;
@Mock private DataChangedJournal mOldJournal;
@@ -183,6 +185,7 @@ public class KeyValueBackupTaskTest {
@Mock private IBackupManagerMonitor mMonitor;
@Mock private OnTaskFinishedListener mListener;
@Mock private PackageManagerInternal mPackageManagerInternal;
private UserBackupManagerService mBackupManagerService;
private TransportData mTransport;
private ShadowLooper mShadowBackupLooper;
@@ -198,6 +201,7 @@ public class KeyValueBackupTaskTest {
private Looper mMainLooper;
private FrameworkShadowLooper mShadowMainLooper;
private Context mContext;
private BackupEligibilityRules mBackupEligibilityRules;
@Before
public void setUp() throws Exception {
@@ -253,6 +257,8 @@ public class KeyValueBackupTaskTest {
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
LocalServices.removeServiceForTest(PackageManagerInternal.class);
LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
mBackupEligibilityRules = new BackupEligibilityRules(mPackageManager,
LocalServices.getService(PackageManagerInternal.class), USER_ID, OPERATION_TYPE);
}
@After
@@ -479,7 +485,8 @@ public class KeyValueBackupTaskTest {
TransportMock transportMock = setUpInitializedTransport(mTransport);
setUpAgentWithData(PACKAGE_1);
BackupAgent pmAgent = spy(createPmAgent());
doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
doReturn(forward(pmAgent)).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
KeyValueBackupTask task = createKeyValueBackupTask(transportMock, true, PACKAGE_1);
runTask(task);
@@ -492,7 +499,8 @@ public class KeyValueBackupTaskTest {
TransportMock transportMock = setUpInitializedTransport(mTransport);
setUpAgentWithData(PACKAGE_1);
BackupAgent pmAgent = spy(createPmAgent());
doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
doReturn(forward(pmAgent)).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
KeyValueBackupTask task =
createKeyValueBackupTask(transportMock, true, PACKAGE_1, PM_PACKAGE);
@@ -506,7 +514,8 @@ public class KeyValueBackupTaskTest {
TransportMock transportMock = setUpInitializedTransport(mTransport);
setUpAgentWithData(PACKAGE_1);
BackupAgent pmAgent = spy(createPmAgent());
doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
doReturn(forward(pmAgent)).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
KeyValueBackupTask task = createKeyValueBackupTask(transportMock, false, PACKAGE_1);
runTask(task);
@@ -742,7 +751,7 @@ public class KeyValueBackupTaskTest {
verify(mBackupManagerService).setWorkSource(null);
verify(mObserver).onResult(PACKAGE_1.packageName, ERROR_AGENT_FAILURE);
verify(mObserver).backupFinished(BackupManager.SUCCESS);
verify(mObserver).backupFinished(SUCCESS);
assertBackupPendingFor(PACKAGE_1);
}
@@ -775,7 +784,7 @@ public class KeyValueBackupTaskTest {
verify(mBackupManagerService).setWorkSource(null);
verify(mObserver).onResult(PACKAGE_1.packageName, ERROR_AGENT_FAILURE);
verify(mObserver).backupFinished(BackupManager.SUCCESS);
verify(mObserver).backupFinished(SUCCESS);
assertBackupPendingFor(PACKAGE_1);
}
@@ -792,7 +801,7 @@ public class KeyValueBackupTaskTest {
verify(mBackupManagerService).setWorkSource(null);
verify(mObserver).onResult(PACKAGE_1.packageName, ERROR_AGENT_FAILURE);
verify(mObserver).backupFinished(BackupManager.SUCCESS);
verify(mObserver).backupFinished(SUCCESS);
assertBackupPendingFor(PACKAGE_1);
}
@@ -810,7 +819,7 @@ public class KeyValueBackupTaskTest {
verify(mBackupManagerService).setWorkSource(null);
verify(mObserver).onResult(PACKAGE_1.packageName, ERROR_AGENT_FAILURE);
verify(mObserver).backupFinished(BackupManager.SUCCESS);
verify(mObserver).backupFinished(SUCCESS);
assertBackupPendingFor(PACKAGE_1);
}
@@ -1316,7 +1325,8 @@ public class KeyValueBackupTaskTest {
argThat(packageInfo(PM_PACKAGE)), any(), anyInt()))
.then(copyBackupDataTo(backupDataPath));
BackupAgent pmAgent = spy(createPmAgent());
doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
doReturn(forward(pmAgent)).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
agentOnBackupDo(
pmAgent,
(oldState, dataOutput, newState) -> {
@@ -1380,7 +1390,8 @@ public class KeyValueBackupTaskTest {
setUpAgent(PACKAGE_1);
when(transportMock.transport.finishBackup()).thenReturn(BackupTransport.TRANSPORT_OK);
BackupAgent pmAgent = spy(createPmAgent());
doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
doReturn(forward(pmAgent)).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
agentOnBackupDo(
pmAgent,
(oldState, dataOutput, newState) -> {
@@ -1404,7 +1415,8 @@ public class KeyValueBackupTaskTest {
setUpAgent(PACKAGE_1);
when(transportMock.transport.finishBackup()).thenReturn(BackupTransport.TRANSPORT_OK);
BackupAgent pmAgent = spy(createPmAgent());
doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
doReturn(forward(pmAgent)).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
agentOnBackupDo(
pmAgent,
(oldState, dataOutput, newState) -> {
@@ -1669,7 +1681,7 @@ public class KeyValueBackupTaskTest {
verify(mReporter).onPackageBackupTransportFailure(PACKAGE_1.packageName);
verify(mReporter).onTransportNotInitialized(mTransport.transportName);
verify(mReporter).onBackupFinished(BackupManager.ERROR_TRANSPORT_ABORTED);
verify(mReporter).onBackupFinished(ERROR_TRANSPORT_ABORTED);
}
@Test
@@ -1686,7 +1698,7 @@ public class KeyValueBackupTaskTest {
verify(mReporter).onPackageBackupTransportFailure(PM_PACKAGE.packageName);
verify(mReporter).onTransportNotInitialized(mTransport.transportName);
verify(mReporter).onBackupFinished(BackupManager.ERROR_TRANSPORT_ABORTED);
verify(mReporter).onBackupFinished(ERROR_TRANSPORT_ABORTED);
}
@Test
@@ -1983,7 +1995,8 @@ public class KeyValueBackupTaskTest {
public void testRunTask_whenPmAgentFails_reportsCorrectly() throws Exception {
TransportMock transportMock = setUpInitializedTransport(mTransport);
BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException());
when(mBackupManagerService.makeMetadataAgent()).thenReturn(pmAgent);
when(mBackupManagerService.makeMetadataAgentWithEligibilityRules(
mBackupEligibilityRules)).thenReturn(pmAgent);
KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);
runTask(task);
@@ -2001,7 +2014,8 @@ public class KeyValueBackupTaskTest {
TransportMock transportMock = setUpInitializedTransport(mTransport);
setUpAgent(PACKAGE_1);
BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException());
doReturn(pmAgent).when(mBackupManagerService).makeMetadataAgent();
doReturn(pmAgent).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);
runTask(task);
@@ -2014,7 +2028,8 @@ public class KeyValueBackupTaskTest {
TransportMock transportMock = setUpInitializedTransport(mTransport);
setUpAgent(PACKAGE_1);
BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException());
doReturn(pmAgent).when(mBackupManagerService).makeMetadataAgent();
doReturn(pmAgent).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);
runTask(task);
@@ -2027,7 +2042,8 @@ public class KeyValueBackupTaskTest {
TransportMock transportMock = setUpInitializedTransport(mTransport);
setUpAgent(PACKAGE_1);
BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException());
doReturn(pmAgent).when(mBackupManagerService).makeMetadataAgent();
doReturn(pmAgent).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);
runTask(task);
@@ -2040,7 +2056,8 @@ public class KeyValueBackupTaskTest {
TransportMock transportMock = setUpInitializedTransport(mTransport);
setUpAgent(PACKAGE_1);
BackupAgent pmAgent = spy(createPmAgent());
doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
doReturn(forward(pmAgent)).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);
agentOnBackupDo(
pmAgent, (oldState, dataOutput, newState) -> runInWorkerThread(task::markCancel));
@@ -2055,7 +2072,8 @@ public class KeyValueBackupTaskTest {
TransportMock transportMock = setUpInitializedTransport(mTransport);
setUpAgent(PACKAGE_1);
BackupAgent pmAgent = spy(createPmAgent());
doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
doReturn(forward(pmAgent)).when(mBackupManagerService)
.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules);
KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);
agentOnBackupDo(
pmAgent, (oldState, dataOutput, newState) -> runInWorkerThread(task::markCancel));
@@ -2652,14 +2670,16 @@ public class KeyValueBackupTaskTest {
mListener,
emptyList(),
/* userInitiated */ false,
nonIncremental);
nonIncremental,
mBackupEligibilityRules);
mBackupManager.setUp(mBackupHandler, task);
return task;
}
private PackageManagerBackupAgent createPmAgent() {
PackageManagerBackupAgent pmAgent =
new PackageManagerBackupAgent(mApplication.getPackageManager(), USER_ID);
new PackageManagerBackupAgent(mApplication.getPackageManager(), USER_ID,
mBackupEligibilityRules);
pmAgent.attach(mApplication);
pmAgent.onCreate();
return pmAgent;
@@ -2671,7 +2691,8 @@ public class KeyValueBackupTaskTest {
*/
private PackageManagerBackupAgent createThrowingPmAgent(RuntimeException exception) {
PackageManagerBackupAgent pmAgent =
new ThrowingPackageManagerBackupAgent(mApplication.getPackageManager(), exception);
new ThrowingPackageManagerBackupAgent(mApplication.getPackageManager(), exception,
mBackupEligibilityRules);
pmAgent.attach(mApplication);
pmAgent.onCreate();
return pmAgent;
@@ -2985,8 +3006,9 @@ public class KeyValueBackupTaskTest {
private final RuntimeException mException;
ThrowingPackageManagerBackupAgent(
PackageManager packageManager, RuntimeException exception) {
super(packageManager, USER_ID);
PackageManager packageManager, RuntimeException exception,
BackupEligibilityRules backupEligibilityRules) {
super(packageManager, USER_ID, backupEligibilityRules);
mException = exception;
}

View File

@@ -22,7 +22,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.utils.AppBackupUtils;
import com.android.server.backup.utils.BackupEligibilityRules;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@@ -31,8 +31,8 @@ import org.robolectric.annotation.Resetter;
import java.util.HashSet;
import java.util.Set;
@Implements(AppBackupUtils.class)
public class ShadowAppBackupUtils {
@Implements(BackupEligibilityRules.class)
public class ShadowBackupEligibilityRules {
private static final Set<String> sAppsRunningAndEligibleForBackupWithTransport =
new HashSet<>();
private static final Set<String> sAppsEligibleForBackup = new HashSet<>();
@@ -53,22 +53,19 @@ public class ShadowAppBackupUtils {
}
@Implementation
protected static boolean appIsRunningAndEligibleForBackupWithTransport(
protected boolean appIsRunningAndEligibleForBackupWithTransport(
@Nullable TransportClient transportClient,
String packageName,
PackageManager pm,
int userId) {
String packageName) {
return sAppsRunningAndEligibleForBackupWithTransport.contains(packageName);
}
@Implementation
protected static boolean appIsEligibleForBackup(ApplicationInfo app, int userId,
int operationType) {
protected boolean appIsEligibleForBackup(ApplicationInfo app) {
return sAppsEligibleForBackup.contains(app.packageName);
}
@Implementation
protected static boolean appGetsFullBackup(PackageInfo packageInfo, int operationType) {
protected boolean appGetsFullBackup(PackageInfo packageInfo) {
return sAppsGetFullBackup.contains(packageInfo.packageName);
}

View File

@@ -24,6 +24,7 @@ import com.android.server.backup.internal.OnTaskFinishedListener;
import com.android.server.backup.keyvalue.KeyValueBackupReporter;
import com.android.server.backup.keyvalue.KeyValueBackupTask;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.utils.BackupEligibilityRules;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@@ -63,7 +64,8 @@ public class ShadowKeyValueBackupTask {
OnTaskFinishedListener listener,
List<String> pendingFullBackups,
boolean userInitiated,
boolean nonIncremental) {
boolean nonIncremental,
BackupEligibilityRules backupEligibilityRules) {
mListener = listener;
mQueue = queue;
mPendingFullBackups = pendingFullBackups;

View File

@@ -25,6 +25,7 @@ import com.android.server.backup.UserBackupManagerService;
import com.android.server.backup.internal.OnTaskFinishedListener;
import com.android.server.backup.restore.PerformUnifiedRestoreTask;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.utils.BackupEligibilityRules;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@@ -67,7 +68,8 @@ public class ShadowPerformUnifiedRestoreTask {
int pmToken,
boolean isFullSystemRestore,
@Nullable String[] filterSet,
OnTaskFinishedListener listener) {
OnTaskFinishedListener listener,
BackupEligibilityRules backupEligibilityRules) {
mBackupManagerService = backupManagerService;
mPackage = targetPackage;
mIsFullSystemRestore = isFullSystemRestore;

View File

@@ -18,6 +18,7 @@ package com.android.server.backup;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
@@ -36,6 +37,7 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.server.backup.internal.OnTaskFinishedListener;
import com.android.server.backup.params.BackupParams;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.utils.BackupEligibilityRules;
import org.junit.Before;
import org.junit.Test;
@@ -54,6 +56,7 @@ public class UserBackupManagerServiceTest {
@Mock IBackupObserver mBackupObserver;
@Mock PackageManager mPackageManager;
@Mock TransportClient mTransportClient;
@Mock BackupEligibilityRules mBackupEligibilityRules;
private TestBackupService mService;
@@ -82,54 +85,51 @@ public class UserBackupManagerServiceTest {
}
@Test
public void getRequestBackupParams_isMigrationAndAppGetsFullBackup() throws Exception {
public void getRequestBackupParams_appIsEligibleForFullBackup() throws Exception {
when(mPackageManager.getPackageInfoAsUser(anyString(), anyInt(), anyInt())).thenReturn(
getPackageInfo(TEST_PACKAGE));
mService.mAppIsEligibleForBackup = true;
mService.mAppGetsFullBackup = true;
when(mBackupEligibilityRules.appIsEligibleForBackup(any())).thenReturn(true);
when(mBackupEligibilityRules.appGetsFullBackup(any())).thenReturn(true);
BackupParams params = mService.getRequestBackupParams(TEST_PACKAGES, mBackupObserver,
mBackupManagerMonitor, /* flags */ 0, OperationType.MIGRATION,
mBackupManagerMonitor, /* flags */ 0, mBackupEligibilityRules,
mTransportClient, /* transportDirName */ "", OnTaskFinishedListener.NOP);
assertThat(params.kvPackages).isEmpty();
assertThat(params.fullPackages).contains(TEST_PACKAGE);
assertThat(params.operationType).isEqualTo(OperationType.MIGRATION);
assertThat(mService.mOperationType).isEqualTo(OperationType.MIGRATION);
assertThat(params.mBackupEligibilityRules).isEqualTo(mBackupEligibilityRules);
}
@Test
public void getRequestBackupParams_isMigrationAndAppGetsKeyValueBackup() throws Exception {
public void getRequestBackupParams_appIsEligibleForKeyValueBackup() throws Exception {
when(mPackageManager.getPackageInfoAsUser(anyString(), anyInt(), anyInt())).thenReturn(
getPackageInfo(TEST_PACKAGE));
mService.mAppIsEligibleForBackup = true;
mService.mAppGetsFullBackup = false;
when(mBackupEligibilityRules.appIsEligibleForBackup(any())).thenReturn(true);
when(mBackupEligibilityRules.appGetsFullBackup(any())).thenReturn(false);
BackupParams params = mService.getRequestBackupParams(TEST_PACKAGES, mBackupObserver,
mBackupManagerMonitor, /* flags */ 0, OperationType.MIGRATION,
mBackupManagerMonitor, /* flags */ 0, mBackupEligibilityRules,
mTransportClient, /* transportDirName */ "", OnTaskFinishedListener.NOP);
assertThat(params.kvPackages).contains(TEST_PACKAGE);
assertThat(params.fullPackages).isEmpty();
assertThat(params.operationType).isEqualTo(OperationType.MIGRATION);
assertThat(mService.mOperationType).isEqualTo(OperationType.MIGRATION);
assertThat(params.mBackupEligibilityRules).isEqualTo(mBackupEligibilityRules);
}
@Test
public void getRequestBackupParams_isMigrationAndAppNotEligibleForBackup() throws Exception {
public void getRequestBackupParams_appIsNotEligibleForBackup() throws Exception {
when(mPackageManager.getPackageInfoAsUser(anyString(), anyInt(), anyInt())).thenReturn(
getPackageInfo(TEST_PACKAGE));
mService.mAppIsEligibleForBackup = false;
mService.mAppGetsFullBackup = false;
when(mBackupEligibilityRules.appIsEligibleForBackup(any())).thenReturn(false);
when(mBackupEligibilityRules.appGetsFullBackup(any())).thenReturn(false);
BackupParams params = mService.getRequestBackupParams(TEST_PACKAGES, mBackupObserver,
mBackupManagerMonitor, /* flags */ 0, OperationType.MIGRATION,
mBackupManagerMonitor, /* flags */ 0, mBackupEligibilityRules,
mTransportClient, /* transportDirName */ "", OnTaskFinishedListener.NOP);
assertThat(params.kvPackages).isEmpty();
assertThat(params.fullPackages).isEmpty();
assertThat(params.operationType).isEqualTo(OperationType.MIGRATION);
assertThat(mService.mOperationType).isEqualTo(OperationType.MIGRATION);
assertThat(params.mBackupEligibilityRules).isEqualTo(mBackupEligibilityRules);
}
private static PackageInfo getPackageInfo(String packageName) {
@@ -141,9 +141,6 @@ public class UserBackupManagerServiceTest {
private static class TestBackupService extends UserBackupManagerService {
boolean isEnabledStatePersisted = false;
boolean mAppIsEligibleForBackup = false;
boolean mAppGetsFullBackup = false;
int mOperationType = 0;
TestBackupService(Context context, PackageManager packageManager) {
super(context, packageManager);
@@ -161,18 +158,5 @@ public class UserBackupManagerServiceTest {
@Override
void updateStateOnBackupEnabled(boolean wasEnabled, boolean enable) {}
@Override
boolean appIsEligibleForBackup(ApplicationInfo applicationInfo, int userId,
@OperationType int operationType) {
mOperationType = operationType;
return mAppIsEligibleForBackup;
}
@Override
boolean appGetsFullBackup(PackageInfo packageInfo, @OperationType int operationType) {
mOperationType = operationType;
return mAppGetsFullBackup;
}
}
}

View File

@@ -22,7 +22,6 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.app.backup.BackupManager;
import android.app.backup.BackupManager.OperationType;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
@@ -43,11 +42,13 @@ import com.android.server.backup.UserBackupManagerService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@SmallTest
@Presubmit
@RunWith(AndroidJUnit4.class)
public class AppBackupUtilsTest {
public class BackupEligibilityRulesTest {
private static final String CUSTOM_BACKUP_AGENT_NAME = "custom.backup.agent";
private static final String TEST_PACKAGE_NAME = "test_package";
@@ -56,15 +57,18 @@ public class AppBackupUtilsTest {
private static final Signature SIGNATURE_3 = generateSignature((byte) 3);
private static final Signature SIGNATURE_4 = generateSignature((byte) 4);
private PackageManagerInternal mMockPackageManagerInternal;
@Mock private PackageManagerInternal mMockPackageManagerInternal;
@Mock private PackageManager mPackageManager;
private BackupEligibilityRules mBackupEligibilityRules;
private int mUserId;
@Before
public void setUp() throws Exception {
mMockPackageManagerInternal = mock(PackageManagerInternal.class);
MockitoAnnotations.initMocks(this);
mUserId = UserHandle.USER_SYSTEM;
mBackupEligibilityRules = getBackupEligibilityRules(OperationType.BACKUP);
}
@Test
@@ -75,8 +79,7 @@ public class AppBackupUtilsTest {
applicationInfo.backupAgentName = CUSTOM_BACKUP_AGENT_NAME;
applicationInfo.packageName = TEST_PACKAGE_NAME;
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.BACKUP);
boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isFalse();
}
@@ -90,8 +93,7 @@ public class AppBackupUtilsTest {
applicationInfo.backupAgentName = null;
applicationInfo.packageName = TEST_PACKAGE_NAME;
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.BACKUP);
boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isFalse();
}
@@ -104,8 +106,7 @@ public class AppBackupUtilsTest {
applicationInfo.backupAgentName = CUSTOM_BACKUP_AGENT_NAME;
applicationInfo.packageName = UserBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.BACKUP);
boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isFalse();
}
@@ -121,8 +122,7 @@ public class AppBackupUtilsTest {
when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.BACKUP);
boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isTrue();
}
@@ -138,8 +138,7 @@ public class AppBackupUtilsTest {
when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.BACKUP);
boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isTrue();
}
@@ -155,8 +154,7 @@ public class AppBackupUtilsTest {
when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.BACKUP);
boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isTrue();
}
@@ -172,8 +170,7 @@ public class AppBackupUtilsTest {
when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.BACKUP);
boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isFalse();
}
@@ -189,8 +186,7 @@ public class AppBackupUtilsTest {
when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.BACKUP);
boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isFalse();
}
@@ -206,8 +202,7 @@ public class AppBackupUtilsTest {
when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.BACKUP);
boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isFalse();
}
@@ -218,8 +213,9 @@ public class AppBackupUtilsTest {
ApplicationInfo applicationInfo = getApplicationInfo(Process.FIRST_APPLICATION_UID,
/* flags */ 0, CUSTOM_BACKUP_AGENT_NAME);
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.MIGRATION);
BackupEligibilityRules eligibilityRules = getBackupEligibilityRules(
OperationType.MIGRATION);
boolean isEligible = eligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isTrue();
}
@@ -230,8 +226,9 @@ public class AppBackupUtilsTest {
ApplicationInfo applicationInfo = getApplicationInfo(Process.SYSTEM_UID,
/* flags */ 0, CUSTOM_BACKUP_AGENT_NAME);
boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo,
mMockPackageManagerInternal, mUserId, OperationType.MIGRATION);
BackupEligibilityRules eligibilityRules = getBackupEligibilityRules(
OperationType.MIGRATION);
boolean isEligible = eligibilityRules.appIsEligibleForBackup(applicationInfo);
assertThat(isEligible).isFalse();
}
@@ -248,7 +245,7 @@ public class AppBackupUtilsTest {
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
boolean isDisabled =
AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId);
mBackupEligibilityRules.appIsDisabled(applicationInfo);
assertThat(isDisabled).isFalse();
}
@@ -266,7 +263,7 @@ public class AppBackupUtilsTest {
boolean isDisabled =
AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId);
mBackupEligibilityRules.appIsDisabled(applicationInfo);
assertThat(isDisabled).isTrue();
}
@@ -283,7 +280,7 @@ public class AppBackupUtilsTest {
boolean isDisabled =
AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId);
mBackupEligibilityRules.appIsDisabled(applicationInfo);
assertThat(isDisabled).isFalse();
}
@@ -300,7 +297,7 @@ public class AppBackupUtilsTest {
boolean isDisabled =
AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId);
mBackupEligibilityRules.appIsDisabled(applicationInfo);
assertThat(isDisabled).isTrue();
}
@@ -316,7 +313,7 @@ public class AppBackupUtilsTest {
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER);
boolean isDisabled =
AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId);
mBackupEligibilityRules.appIsDisabled(applicationInfo);
assertThat(isDisabled).isTrue();
}
@@ -332,7 +329,7 @@ public class AppBackupUtilsTest {
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
boolean isDisabled =
AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId);
mBackupEligibilityRules.appIsDisabled(applicationInfo);
assertThat(isDisabled).isTrue();
}
@@ -342,7 +339,7 @@ public class AppBackupUtilsTest {
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED;
boolean isStopped = AppBackupUtils.appIsStopped(applicationInfo);
boolean isStopped = mBackupEligibilityRules.appIsStopped(applicationInfo);
assertThat(isStopped).isTrue();
}
@@ -352,7 +349,7 @@ public class AppBackupUtilsTest {
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.flags = ~ApplicationInfo.FLAG_STOPPED;
boolean isStopped = AppBackupUtils.appIsStopped(applicationInfo);
boolean isStopped = mBackupEligibilityRules.appIsStopped(applicationInfo);
assertThat(isStopped).isFalse();
}
@@ -363,7 +360,7 @@ public class AppBackupUtilsTest {
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.backupAgentName = null;
boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.BACKUP);
boolean result = mBackupEligibilityRules.appGetsFullBackup(packageInfo);
assertThat(result).isTrue();
}
@@ -376,7 +373,7 @@ public class AppBackupUtilsTest {
packageInfo.applicationInfo.backupAgentName = "backup.agent";
packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY;
boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.BACKUP);
boolean result = mBackupEligibilityRules.appGetsFullBackup(packageInfo);
assertThat(result).isTrue();
}
@@ -389,7 +386,7 @@ public class AppBackupUtilsTest {
packageInfo.applicationInfo.backupAgentName = "backup.agent";
packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY;
boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.BACKUP);
boolean result = mBackupEligibilityRules.appGetsFullBackup(packageInfo);
assertThat(result).isFalse();
}
@@ -401,7 +398,9 @@ public class AppBackupUtilsTest {
packageInfo.applicationInfo = getApplicationInfo(Process.FIRST_APPLICATION_UID,
~ApplicationInfo.FLAG_FULL_BACKUP_ONLY, CUSTOM_BACKUP_AGENT_NAME);
boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.MIGRATION);
BackupEligibilityRules eligibilityRules = getBackupEligibilityRules(
OperationType.MIGRATION);
boolean result = eligibilityRules.appGetsFullBackup(packageInfo);
assertThat(result).isTrue();
}
@@ -413,7 +412,9 @@ public class AppBackupUtilsTest {
packageInfo.applicationInfo = getApplicationInfo(Process.SYSTEM_UID,
~ApplicationInfo.FLAG_FULL_BACKUP_ONLY, CUSTOM_BACKUP_AGENT_NAME);
boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.MIGRATION);
BackupEligibilityRules eligibilityRules = getBackupEligibilityRules(
OperationType.MIGRATION);
boolean result = eligibilityRules.appGetsFullBackup(packageInfo);
assertThat(result).isFalse();
}
@@ -424,7 +425,7 @@ public class AppBackupUtilsTest {
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.backupAgentName = null;
boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo);
boolean result = mBackupEligibilityRules.appIsKeyValueOnly(packageInfo);
assertThat(result).isFalse();
}
@@ -437,7 +438,7 @@ public class AppBackupUtilsTest {
packageInfo.applicationInfo.backupAgentName = "backup.agent";
packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY;
boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo);
boolean result = mBackupEligibilityRules.appIsKeyValueOnly(packageInfo);
assertThat(result).isFalse();
}
@@ -450,7 +451,7 @@ public class AppBackupUtilsTest {
packageInfo.applicationInfo.backupAgentName = "backup.agent";
packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY;
boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo);
boolean result = mBackupEligibilityRules.appIsKeyValueOnly(packageInfo);
assertThat(result).isTrue();
}
@@ -460,8 +461,9 @@ public class AppBackupUtilsTest {
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.uid = Process.SYSTEM_UID;
boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo,
BackupEligibilityRules eligibilityRules = getBackupEligibilityRules(
OperationType.MIGRATION);
boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo);
assertThat(result).isFalse();
}
@@ -471,8 +473,9 @@ public class AppBackupUtilsTest {
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.uid = Process.SYSTEM_UID;
boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo,
OperationType.BACKUP);
BackupEligibilityRules eligibilityRules = getBackupEligibilityRules(
OperationType.MIGRATION);
boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo);
assertThat(result).isFalse();
}
@@ -482,8 +485,9 @@ public class AppBackupUtilsTest {
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.uid = Process.FIRST_APPLICATION_UID;
boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo,
BackupEligibilityRules eligibilityRules = getBackupEligibilityRules(
OperationType.MIGRATION);
boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo);
assertThat(result).isTrue();
}
@@ -493,16 +497,14 @@ public class AppBackupUtilsTest {
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.uid = Process.FIRST_APPLICATION_UID;
boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo,
OperationType.BACKUP);
boolean result = mBackupEligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo);
assertThat(result).isFalse();
}
@Test
public void signaturesMatch_targetIsNull_returnsFalse() throws Exception {
boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, null,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1}, null);
assertThat(result).isFalse();
}
@@ -514,8 +516,7 @@ public class AppBackupUtilsTest {
packageInfo.applicationInfo = new ApplicationInfo();
packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[0], packageInfo);
assertThat(result).isTrue();
}
@@ -533,8 +534,7 @@ public class AppBackupUtilsTest {
null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(null, packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(null, packageInfo);
assertThat(result).isFalse();
}
@@ -552,8 +552,7 @@ public class AppBackupUtilsTest {
null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[0], packageInfo);
assertThat(result).isFalse();
}
@@ -568,8 +567,8 @@ public class AppBackupUtilsTest {
packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1},
packageInfo);
assertThat(result).isFalse();
}
@@ -583,8 +582,8 @@ public class AppBackupUtilsTest {
packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1},
packageInfo);
assertThat(result).isFalse();
}
@@ -596,8 +595,7 @@ public class AppBackupUtilsTest {
packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(null, packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(null, packageInfo);
assertThat(result).isFalse();
}
@@ -610,8 +608,7 @@ public class AppBackupUtilsTest {
packageInfo.signingInfo = null;
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[0], packageInfo);
assertThat(result).isFalse();
}
@@ -632,9 +629,8 @@ public class AppBackupUtilsTest {
null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
new Signature[] {signature3Copy, signature1Copy, signature2Copy}, packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(
new Signature[] {signature3Copy, signature1Copy, signature2Copy}, packageInfo);
assertThat(result).isTrue();
}
@@ -654,9 +650,8 @@ public class AppBackupUtilsTest {
null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
new Signature[]{signature2Copy, signature1Copy}, packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(
new Signature[]{signature2Copy, signature1Copy}, packageInfo);
assertThat(result).isTrue();
}
@@ -676,9 +671,8 @@ public class AppBackupUtilsTest {
null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}, packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(
new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}, packageInfo);
assertThat(result).isFalse();
}
@@ -698,9 +692,8 @@ public class AppBackupUtilsTest {
null));
packageInfo.applicationInfo = new ApplicationInfo();
boolean result = AppBackupUtils.signaturesMatch(
new Signature[]{signature1Copy, signature2Copy, SIGNATURE_4}, packageInfo,
mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(
new Signature[]{signature1Copy, signature2Copy, SIGNATURE_4}, packageInfo);
assertThat(result).isFalse();
}
@@ -723,8 +716,8 @@ public class AppBackupUtilsTest {
doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy,
packageInfo.packageName);
boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy},
packageInfo, mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {signature1Copy},
packageInfo);
assertThat(result).isTrue();
}
@@ -749,8 +742,8 @@ public class AppBackupUtilsTest {
doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy,
packageInfo.packageName);
boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy},
packageInfo, mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {signature1Copy},
packageInfo);
assertThat(result).isTrue();
}
@@ -776,12 +769,17 @@ public class AppBackupUtilsTest {
doReturn(false).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy,
packageInfo.packageName);
boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy},
packageInfo, mMockPackageManagerInternal);
boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {signature1Copy},
packageInfo);
assertThat(result).isFalse();
}
private BackupEligibilityRules getBackupEligibilityRules(@OperationType int operationType) {
return new BackupEligibilityRules(mPackageManager, mMockPackageManagerInternal, mUserId,
operationType);
}
private static Signature generateSignature(byte i) {
byte[] signatureBytes = new byte[256];
signatureBytes[0] = i;