summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/backup/BackupAgent.java102
-rw-r--r--core/tests/coretests/src/android/app/backup/BackupAgentTest.java104
-rw-r--r--services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java4
-rw-r--r--services/backup/java/com/android/server/backup/UserBackupManagerService.java6
-rw-r--r--services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java9
-rw-r--r--services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java3
-rw-r--r--services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java3
-rw-r--r--services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java3
-rw-r--r--services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java9
-rw-r--r--services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java8
-rw-r--r--services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java9
-rw-r--r--services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java4
-rw-r--r--services/core/java/com/android/server/backup/SystemBackupAgent.java5
-rw-r--r--services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java10
14 files changed, 251 insertions, 28 deletions
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index 20aa0647d261..bba29246c332 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -19,6 +19,7 @@ package android.app.backup;
import android.annotation.Nullable;
import android.app.IBackupAgent;
import android.app.QueuedWork;
+import android.app.backup.BackupManager.OperationType;
import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags;
import android.content.Context;
import android.content.ContextWrapper;
@@ -38,6 +39,8 @@ import android.system.StructStat;
import android.util.ArraySet;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
+
import libcore.io.IoUtils;
import org.xmlpull.v1.XmlPullParserException;
@@ -50,6 +53,7 @@ import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@@ -129,6 +133,7 @@ import java.util.concurrent.CountDownLatch;
public abstract class BackupAgent extends ContextWrapper {
private static final String TAG = "BackupAgent";
private static final boolean DEBUG = false;
+ private static final int DEFAULT_OPERATION_TYPE = OperationType.BACKUP;
/** @hide */
public static final int RESULT_SUCCESS = 0;
@@ -186,6 +191,9 @@ public abstract class BackupAgent extends ContextWrapper {
Handler mHandler = null;
@Nullable private UserHandle mUser;
+ // This field is written from the main thread (in onCreate), and read in a Binder thread (in
+ // onFullBackup that is called from system_server via Binder).
+ @OperationType private volatile int mOperationType = DEFAULT_OPERATION_TYPE;
Handler getHandler() {
if (mHandler == null) {
@@ -229,6 +237,13 @@ public abstract class BackupAgent extends ContextWrapper {
}
/**
+ * @hide
+ */
+ public void onCreate(UserHandle user) {
+ onCreate(user, DEFAULT_OPERATION_TYPE);
+ }
+
+ /**
* Provided as a convenience for agent implementations that need an opportunity
* to do one-time initialization before the actual backup or restore operation
* is begun with information about the calling user.
@@ -236,10 +251,11 @@ public abstract class BackupAgent extends ContextWrapper {
*
* @hide
*/
- public void onCreate(UserHandle user) {
+ public void onCreate(UserHandle user, @OperationType int operationType) {
onCreate();
mUser = user;
+ mOperationType = operationType;
}
/**
@@ -390,12 +406,9 @@ public abstract class BackupAgent extends ContextWrapper {
return;
}
- Map<String, Set<PathWithRequiredFlags>> manifestIncludeMap;
- ArraySet<PathWithRequiredFlags> manifestExcludeSet;
+ IncludeExcludeRules includeExcludeRules;
try {
- manifestIncludeMap =
- backupScheme.maybeParseAndGetCanonicalIncludePaths();
- manifestExcludeSet = backupScheme.maybeParseAndGetCanonicalExcludePaths();
+ includeExcludeRules = getIncludeExcludeRules(backupScheme);
} catch (IOException | XmlPullParserException e) {
if (Log.isLoggable(FullBackup.TAG_XML_PARSER, Log.VERBOSE)) {
Log.v(FullBackup.TAG_XML_PARSER,
@@ -404,6 +417,10 @@ public abstract class BackupAgent extends ContextWrapper {
}
return;
}
+ Map<String, Set<PathWithRequiredFlags>> manifestIncludeMap
+ = includeExcludeRules.getIncludeMap();
+ Set<PathWithRequiredFlags> manifestExcludeSet
+ = includeExcludeRules.getExcludeSet();
final String packageName = getPackageName();
final ApplicationInfo appInfo = getApplicationInfo();
@@ -528,6 +545,24 @@ public abstract class BackupAgent extends ContextWrapper {
}
}
+ /** @hide */
+ @VisibleForTesting
+ public IncludeExcludeRules getIncludeExcludeRules(FullBackup.BackupScheme backupScheme)
+ throws IOException, XmlPullParserException {
+ if (mOperationType == OperationType.MIGRATION) {
+ return IncludeExcludeRules.emptyRules();
+ }
+
+ Map<String, Set<PathWithRequiredFlags>> manifestIncludeMap;
+ ArraySet<PathWithRequiredFlags> manifestExcludeSet;
+
+ manifestIncludeMap =
+ backupScheme.maybeParseAndGetCanonicalIncludePaths();
+ manifestExcludeSet = backupScheme.maybeParseAndGetCanonicalExcludePaths();
+
+ return new IncludeExcludeRules(manifestIncludeMap, manifestExcludeSet);
+ }
+
/**
* Notification that the application's current backup operation causes it to exceed
* the maximum size permitted by the transport. The ongoing backup operation is
@@ -570,7 +605,7 @@ public abstract class BackupAgent extends ContextWrapper {
*/
private void applyXmlFiltersAndDoFullBackupForDomain(String packageName, String domainToken,
Map<String, Set<PathWithRequiredFlags>> includeMap,
- ArraySet<PathWithRequiredFlags> filterSet, ArraySet<String> traversalExcludeSet,
+ Set<PathWithRequiredFlags> filterSet, ArraySet<String> traversalExcludeSet,
FullBackupDataOutput data) throws IOException {
if (includeMap == null || includeMap.size() == 0) {
// Do entire sub-tree for the provided token.
@@ -742,7 +777,7 @@ public abstract class BackupAgent extends ContextWrapper {
* @hide
*/
protected final void fullBackupFileTree(String packageName, String domain, String startingPath,
- ArraySet<PathWithRequiredFlags> manifestExcludes,
+ Set<PathWithRequiredFlags> manifestExcludes,
ArraySet<String> systemExcludes,
FullBackupDataOutput output) {
// Pull out the domain and set it aside to use when making the tarball.
@@ -811,7 +846,7 @@ public abstract class BackupAgent extends ContextWrapper {
}
private boolean manifestExcludesContainFilePath(
- ArraySet<PathWithRequiredFlags> manifestExcludes, String filePath) {
+ Set<PathWithRequiredFlags> manifestExcludes, String filePath) {
for (PathWithRequiredFlags exclude : manifestExcludes) {
String excludePath = exclude.getPath();
if (excludePath != null && excludePath.equals(filePath)) {
@@ -1265,4 +1300,53 @@ public abstract class BackupAgent extends ContextWrapper {
throw new IllegalStateException(mMessage);
}
}
+
+ /** @hide */
+ @VisibleForTesting
+ public static class IncludeExcludeRules {
+ private final Map<String, Set<PathWithRequiredFlags>> mManifestIncludeMap;
+ private final Set<PathWithRequiredFlags> mManifestExcludeSet;
+
+ /** @hide */
+ public IncludeExcludeRules(
+ Map<String, Set<PathWithRequiredFlags>> manifestIncludeMap,
+ Set<PathWithRequiredFlags> manifestExcludeSet) {
+ mManifestIncludeMap = manifestIncludeMap;
+ mManifestExcludeSet = manifestExcludeSet;
+ }
+
+ /** @hide */
+ @VisibleForTesting
+ public static IncludeExcludeRules emptyRules() {
+ return new IncludeExcludeRules(Collections.emptyMap(), new ArraySet<>());
+ }
+
+ private Map<String, Set<PathWithRequiredFlags>> getIncludeMap() {
+ return mManifestIncludeMap;
+ }
+
+ private Set<PathWithRequiredFlags> getExcludeSet() {
+ return mManifestExcludeSet;
+ }
+
+ /** @hide */
+ @Override
+ public int hashCode() {
+ return Objects.hash(mManifestIncludeMap, mManifestExcludeSet);
+ }
+
+ /** @hide */
+ @Override
+ public boolean equals(Object object) {
+ if (this == object) {
+ return true;
+ }
+ if (object == null || getClass() != object.getClass()) {
+ return false;
+ }
+ IncludeExcludeRules that = (IncludeExcludeRules) object;
+ return Objects.equals(mManifestIncludeMap, that.mManifestIncludeMap) &&
+ Objects.equals(mManifestExcludeSet, that.mManifestExcludeSet);
+ }
+ }
}
diff --git a/core/tests/coretests/src/android/app/backup/BackupAgentTest.java b/core/tests/coretests/src/android/app/backup/BackupAgentTest.java
new file mode 100644
index 000000000000..ea903f2b61eb
--- /dev/null
+++ b/core/tests/coretests/src/android/app/backup/BackupAgentTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.backup;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.app.backup.BackupAgent.IncludeExcludeRules;
+import android.app.backup.BackupManager.OperationType;
+import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags;
+import android.os.ParcelFileDescriptor;
+import android.os.UserHandle;
+import android.platform.test.annotations.Presubmit;
+import android.util.ArraySet;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class BackupAgentTest {
+ // An arbitrary user.
+ private static final UserHandle USER_HANDLE = new UserHandle(15);
+
+ @Mock FullBackup.BackupScheme mBackupScheme;
+
+ private BackupAgent mBackupAgent;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testGetIncludeExcludeRules_isMigration_returnsEmptyRules() throws Exception {
+ mBackupAgent = getAgentForOperationType(OperationType.MIGRATION);
+
+ IncludeExcludeRules rules = mBackupAgent.getIncludeExcludeRules(mBackupScheme);
+ assertThat(rules).isEqualTo(IncludeExcludeRules.emptyRules());
+ }
+
+ @Test
+ public void testGetIncludeExcludeRules_isNotMigration_returnsRules() throws Exception {
+ PathWithRequiredFlags path = new PathWithRequiredFlags("path", /* requiredFlags */ 0);
+ Map<String, Set<PathWithRequiredFlags>> includePaths = Collections.singletonMap("test",
+ Collections.singleton(path));
+ ArraySet<PathWithRequiredFlags> excludePaths = new ArraySet<>();
+ excludePaths.add(path);
+ IncludeExcludeRules expectedRules = new IncludeExcludeRules(includePaths, excludePaths);
+
+ mBackupAgent = getAgentForOperationType(OperationType.BACKUP);
+ when(mBackupScheme.maybeParseAndGetCanonicalExcludePaths()).thenReturn(excludePaths);
+ when(mBackupScheme.maybeParseAndGetCanonicalIncludePaths()).thenReturn(includePaths);
+
+ IncludeExcludeRules rules = mBackupAgent.getIncludeExcludeRules(mBackupScheme);
+ assertThat(rules).isEqualTo(expectedRules);
+ }
+
+ private BackupAgent getAgentForOperationType(@OperationType int operationType) {
+ BackupAgent agent = new TestFullBackupAgent();
+ agent.onCreate(USER_HANDLE, operationType);
+ return agent;
+ }
+
+ private static class TestFullBackupAgent extends BackupAgent {
+
+ @Override
+ public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
+ ParcelFileDescriptor newState) throws IOException {
+ // Left empty as this is a full backup agent.
+ }
+
+ @Override
+ public void onRestore(BackupDataInput data, int appVersionCode,
+ ParcelFileDescriptor newState) throws IOException {
+ // Left empty as this is a full backup agent.
+ }
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java b/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java
index c9b09e31f94b..0855b9d8f675 100644
--- a/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java
+++ b/services/backup/java/com/android/server/backup/KeyValueAdbBackupEngine.java
@@ -10,6 +10,7 @@ import static com.android.server.backup.UserBackupManagerService.OP_TYPE_BACKUP_
import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
+import android.app.backup.BackupManager;
import android.app.backup.FullBackup;
import android.app.backup.FullBackupDataOutput;
import android.app.backup.IBackupCallback;
@@ -146,7 +147,8 @@ public class KeyValueAdbBackupEngine {
private IBackupAgent bindToAgent(ApplicationInfo targetApp) {
try {
return mBackupManagerService.bindToAgentSynchronous(targetApp,
- ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL);
+ ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL,
+ BackupManager.OperationType.BACKUP);
} catch (SecurityException e) {
Slog.e(TAG, "error in binding to agent for package " + targetApp.packageName
+ ". " + e);
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index ff21a733223c..ddc3c398242e 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -1643,13 +1643,15 @@ public class UserBackupManagerService {
/** Fires off a backup agent, blocking until it attaches or times out. */
@Nullable
- public IBackupAgent bindToAgentSynchronous(ApplicationInfo app, int mode) {
+ public IBackupAgent bindToAgentSynchronous(ApplicationInfo app, int mode,
+ @OperationType int operationType) {
IBackupAgent agent = null;
synchronized (mAgentConnectLock) {
mConnecting = true;
mConnectedAgent = null;
try {
- if (mActivityManager.bindBackupAgent(app.packageName, mode, mUserId)) {
+ if (mActivityManager.bindBackupAgent(app.packageName, mode, mUserId,
+ operationType)) {
Slog.d(TAG, addUserIdToLogMessage(mUserId, "awaiting agent for " + app));
// success; wait for the agent to arrive
diff --git a/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java b/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
index 846c6a23d394..fe5497f3eb94 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/FullBackupEngine.java
@@ -41,6 +41,7 @@ import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.UserBackupManagerService;
import com.android.server.backup.remote.RemoteCall;
+import com.android.server.backup.utils.BackupEligibilityRules;
import com.android.server.backup.utils.FullBackupUtils;
import java.io.File;
@@ -64,6 +65,7 @@ public class FullBackupEngine {
private final int mOpToken;
private final int mTransportFlags;
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
+ private final BackupEligibilityRules mBackupEligibilityRules;
class FullBackupRunner implements Runnable {
private final @UserIdInt int mUserId;
@@ -190,7 +192,8 @@ public class FullBackupEngine {
BackupRestoreTask timeoutMonitor,
long quota,
int opToken,
- int transportFlags) {
+ int transportFlags,
+ BackupEligibilityRules backupEligibilityRules) {
this.backupManagerService = backupManagerService;
mOutput = output;
mPreflightHook = preflightHook;
@@ -204,6 +207,7 @@ public class FullBackupEngine {
Objects.requireNonNull(
backupManagerService.getAgentTimeoutParameters(),
"Timeout parameters cannot be null");
+ mBackupEligibilityRules = backupEligibilityRules;
}
public int preflightCheck() throws RemoteException {
@@ -302,7 +306,8 @@ public class FullBackupEngine {
}
mAgent =
backupManagerService.bindToAgentSynchronous(
- mPkg.applicationInfo, ApplicationThreadConstants.BACKUP_MODE_FULL);
+ mPkg.applicationInfo, ApplicationThreadConstants.BACKUP_MODE_FULL,
+ mBackupEligibilityRules.getOperationType());
}
return mAgent != null;
}
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
index a69bd6b62264..2f39a4a74746 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
@@ -423,7 +423,8 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
this,
Long.MAX_VALUE,
mCurrentOpToken,
- /*transportFlags=*/ 0);
+ /*transportFlags=*/ 0,
+ mBackupEligibilityRules);
sendOnBackupPackage(isSharedStorage ? "Shared storage" : pkg.packageName);
// Don't need to check preflight result as there is no preflight hook.
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
index 1fa88920ca74..a4d47d492451 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
@@ -860,7 +860,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
this,
mQuota,
mCurrentOpToken,
- mTransportFlags);
+ mTransportFlags,
+ mBackupEligibilityRules);
try {
try {
if (!mIsCancelled) {
diff --git a/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java b/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java
index 6124171c7a0e..7267cdf8539c 100644
--- a/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java
+++ b/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java
@@ -731,7 +731,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
try {
agent =
mBackupManagerService.bindToAgentSynchronous(
- packageInfo.applicationInfo, BACKUP_MODE_INCREMENTAL);
+ packageInfo.applicationInfo, BACKUP_MODE_INCREMENTAL,
+ mBackupEligibilityRules.getOperationType());
if (agent == null) {
mReporter.onAgentError(packageName);
throw AgentException.transitory();
diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
index 82bed3b57f16..dbc895202ebf 100644
--- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
@@ -49,6 +49,7 @@ import com.android.server.backup.FileMetadata;
import com.android.server.backup.KeyValueAdbRestoreEngine;
import com.android.server.backup.UserBackupManagerService;
import com.android.server.backup.fullbackup.FullBackupObbConnection;
+import com.android.server.backup.utils.BackupEligibilityRules;
import com.android.server.backup.utils.BytesReadListener;
import com.android.server.backup.utils.FullBackupRestoreObserverUtils;
import com.android.server.backup.utils.RestoreUtils;
@@ -129,11 +130,13 @@ public class FullRestoreEngine extends RestoreEngine {
private final boolean mIsAdbRestore;
@GuardedBy("mPipesLock")
private boolean mPipesClosed;
+ private final BackupEligibilityRules mBackupEligibilityRules;
public FullRestoreEngine(UserBackupManagerService backupManagerService,
BackupRestoreTask monitorTask, IFullBackupRestoreObserver observer,
IBackupManagerMonitor monitor, PackageInfo onlyPackage, boolean allowApks,
- int ephemeralOpToken, boolean isAdbRestore) {
+ int ephemeralOpToken, boolean isAdbRestore,
+ BackupEligibilityRules backupEligibilityRules) {
mBackupManagerService = backupManagerService;
mEphemeralOpToken = ephemeralOpToken;
mMonitorTask = monitorTask;
@@ -147,6 +150,7 @@ public class FullRestoreEngine extends RestoreEngine {
"Timeout parameters cannot be null");
mIsAdbRestore = isAdbRestore;
mUserId = backupManagerService.getUserId();
+ mBackupEligibilityRules = backupEligibilityRules;
}
public IBackupAgent getAgent() {
@@ -365,7 +369,8 @@ public class FullRestoreEngine extends RestoreEngine {
mAgent = mBackupManagerService.bindToAgentSynchronous(mTargetApp,
FullBackup.KEY_VALUE_DATA_TOKEN.equals(info.domain)
? ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL
- : ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
+ : ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL,
+ mBackupEligibilityRules.getOperationType());
mAgentPackage = pkg;
} catch (IOException | NameNotFoundException e) {
// fall through to error handling
diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
index 01b40fbff201..7ab86224d356 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
@@ -25,12 +25,15 @@ import static com.android.server.backup.UserBackupManagerService.BACKUP_FILE_HEA
import static com.android.server.backup.UserBackupManagerService.BACKUP_FILE_VERSION;
import android.app.backup.IFullBackupRestoreObserver;
+import android.content.pm.PackageManagerInternal;
import android.os.ParcelFileDescriptor;
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.LocalServices;
import com.android.server.backup.UserBackupManagerService;
import com.android.server.backup.fullbackup.FullBackupObbConnection;
+import com.android.server.backup.utils.BackupEligibilityRules;
import com.android.server.backup.utils.FullBackupRestoreObserverUtils;
import com.android.server.backup.utils.PasswordUtils;
@@ -102,7 +105,10 @@ public class PerformAdbRestoreTask implements Runnable {
}
FullRestoreEngine mEngine = new FullRestoreEngine(mBackupManagerService, null,
- mObserver, null, null, true, 0 /*unused*/, true);
+ mObserver, null, null, true, 0 /*unused*/, true,
+ BackupEligibilityRules.forBackup(mBackupManagerService.getPackageManager(),
+ LocalServices.getService(PackageManagerInternal.class),
+ mBackupManagerService.getUserId()));
FullRestoreEngineThread mEngineThread = new FullRestoreEngineThread(mEngine,
tarInputStream);
mEngineThread.run();
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index a7e360403ccc..7baf55992770 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -162,6 +162,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
private final int mEphemeralOpToken;
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
+ private final BackupEligibilityRules mBackupEligibilityRules;
@VisibleForTesting
PerformUnifiedRestoreTask(UserBackupManagerService backupManagerService) {
@@ -171,6 +172,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
mTransportManager = null;
mEphemeralOpToken = 0;
mUserId = 0;
+ mBackupEligibilityRules = null;
this.backupManagerService = backupManagerService;
}
@@ -208,6 +210,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
mAgentTimeoutParameters = Objects.requireNonNull(
backupManagerService.getAgentTimeoutParameters(),
"Timeout parameters cannot be null");
+ mBackupEligibilityRules = backupEligibilityRules;
if (targetPackage != null) {
// Single package restore
@@ -656,7 +659,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// Good to go! Set up and bind the agent...
mAgent = backupManagerService.bindToAgentSynchronous(
mCurrentPackage.applicationInfo,
- ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL);
+ ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL,
+ mBackupEligibilityRules.getOperationType());
if (mAgent == null) {
Slog.w(TAG, "Can't find backup agent for " + packageName);
mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor,
@@ -913,7 +917,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
mCurrentPackage.packageName);
mEngine = new FullRestoreEngine(backupManagerService, this, null,
- mMonitor, mCurrentPackage, false, mEphemeralOpToken, false);
+ mMonitor, mCurrentPackage, false, mEphemeralOpToken, false,
+ mBackupEligibilityRules);
mEngineThread = new FullRestoreEngineThread(mEngine, mEnginePipes[0]);
ParcelFileDescriptor eWriteEnd = mEnginePipes[1];
diff --git a/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java b/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java
index 162921528e95..acf41c709de0 100644
--- a/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java
+++ b/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java
@@ -318,4 +318,8 @@ public class BackupEligibilityRules {
return true;
}
}
+
+ public int getOperationType() {
+ return mOperationType;
+ }
}
diff --git a/services/core/java/com/android/server/backup/SystemBackupAgent.java b/services/core/java/com/android/server/backup/SystemBackupAgent.java
index 0a30b763b8f4..d98298cbef5a 100644
--- a/services/core/java/com/android/server/backup/SystemBackupAgent.java
+++ b/services/core/java/com/android/server/backup/SystemBackupAgent.java
@@ -20,6 +20,7 @@ import android.app.IWallpaperManager;
import android.app.backup.BackupAgentHelper;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupHelper;
+import android.app.backup.BackupManager;
import android.app.backup.FullBackup;
import android.app.backup.FullBackupDataOutput;
import android.app.backup.WallpaperBackupHelper;
@@ -87,8 +88,8 @@ public class SystemBackupAgent extends BackupAgentHelper {
private int mUserId = UserHandle.USER_SYSTEM;
@Override
- public void onCreate(UserHandle user) {
- super.onCreate(user);
+ public void onCreate(UserHandle user, @BackupManager.OperationType int operationType) {
+ super.onCreate(user, operationType);
mUserId = user.getIdentifier();
diff --git a/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java b/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java
index 6184c4ed7f1a..09e3bfe9cf20 100644
--- a/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java
@@ -794,7 +794,7 @@ public class KeyValueBackupTaskTest {
setUpAgent(PACKAGE_1);
doThrow(SecurityException.class)
.when(mBackupManagerService)
- .bindToAgentSynchronous(argThat(applicationInfo(PACKAGE_1)), anyInt());
+ .bindToAgentSynchronous(argThat(applicationInfo(PACKAGE_1)), anyInt(), anyInt());
KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);
runTask(task);
@@ -812,7 +812,7 @@ public class KeyValueBackupTaskTest {
setUpAgent(PACKAGE_1);
doThrow(SecurityException.class)
.when(mBackupManagerService)
- .bindToAgentSynchronous(argThat(applicationInfo(PACKAGE_1)), anyInt());
+ .bindToAgentSynchronous(argThat(applicationInfo(PACKAGE_1)), anyInt(), anyInt());
KeyValueBackupTask task = createKeyValueBackupTask(transportMock, true, PACKAGE_1);
runTask(task);
@@ -2593,11 +2593,13 @@ public class KeyValueBackupTaskTest {
if (packageData.available) {
doReturn(backupAgentBinder)
.when(mBackupManagerService)
- .bindToAgentSynchronous(argThat(applicationInfo(packageData)), anyInt());
+ .bindToAgentSynchronous(argThat(applicationInfo(packageData)), anyInt(),
+ anyInt());
} else {
doReturn(null)
.when(mBackupManagerService)
- .bindToAgentSynchronous(argThat(applicationInfo(packageData)), anyInt());
+ .bindToAgentSynchronous(argThat(applicationInfo(packageData)), anyInt(),
+ anyInt());
}
return new AgentMock(backupAgentBinder, backupAgent);
} catch (RemoteException e) {