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:
committed by
Android (Google) Code Review
commit
25ec4f6855
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user