diff options
| -rw-r--r-- | core/java/android/app/backup/BackupAgent.java | 14 | ||||
| -rw-r--r-- | core/java/android/app/backup/FullBackup.java | 56 |
2 files changed, 57 insertions, 13 deletions
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java index 7e232acbdcdd..85cfe835c28d 100644 --- a/core/java/android/app/backup/BackupAgent.java +++ b/core/java/android/app/backup/BackupAgent.java @@ -401,7 +401,8 @@ public abstract class BackupAgent extends ContextWrapper { * @see #onRestoreFile(ParcelFileDescriptor, long, File, int, long, long) */ public void onFullBackup(FullBackupDataOutput data) throws IOException { - FullBackup.BackupScheme backupScheme = FullBackup.getBackupScheme(this); + FullBackup.BackupScheme backupScheme = FullBackup.getBackupScheme(this, + mOperationType); if (!isDeviceToDeviceMigration() && !backupScheme.isFullBackupContentEnabled()) { return; } @@ -624,7 +625,8 @@ public abstract class BackupAgent extends ContextWrapper { if (includeMap == null || includeMap.size() == 0) { // Do entire sub-tree for the provided token. fullBackupFileTree(packageName, domainToken, - FullBackup.getBackupScheme(this).tokenToDirectoryPath(domainToken), + FullBackup.getBackupScheme(this, mOperationType) + .tokenToDirectoryPath(domainToken), filterSet, traversalExcludeSet, data); } else if (includeMap.get(domainToken) != null) { // This will be null if the xml parsing didn't yield any rules for @@ -795,7 +797,8 @@ public abstract class BackupAgent extends ContextWrapper { ArraySet<String> systemExcludes, FullBackupDataOutput output) { // Pull out the domain and set it aside to use when making the tarball. - String domainPath = FullBackup.getBackupScheme(this).tokenToDirectoryPath(domain); + String domainPath = FullBackup.getBackupScheme(this, mOperationType) + .tokenToDirectoryPath(domain); if (domainPath == null) { // Should never happen. return; @@ -911,7 +914,7 @@ public abstract class BackupAgent extends ContextWrapper { return true; } - FullBackup.BackupScheme bs = FullBackup.getBackupScheme(this); + FullBackup.BackupScheme bs = FullBackup.getBackupScheme(this, mOperationType); if (!bs.isFullBackupContentEnabled()) { if (Log.isLoggable(FullBackup.TAG_XML_PARSER, Log.VERBOSE)) { Log.v(FullBackup.TAG_XML_PARSER, @@ -985,7 +988,8 @@ public abstract class BackupAgent extends ContextWrapper { + " domain=" + domain + " relpath=" + path + " mode=" + mode + " mtime=" + mtime); - basePath = FullBackup.getBackupScheme(this).tokenToDirectoryPath(domain); + basePath = FullBackup.getBackupScheme(this, mOperationType).tokenToDirectoryPath( + domain); if (domain.equals(FullBackup.MANAGED_EXTERNAL_TREE_TOKEN)) { mode = -1; // < 0 is a token to skip attempting a chmod() } diff --git a/core/java/android/app/backup/FullBackup.java b/core/java/android/app/backup/FullBackup.java index 742d05c1ffa4..f7ed6f1f2feb 100644 --- a/core/java/android/app/backup/FullBackup.java +++ b/core/java/android/app/backup/FullBackup.java @@ -16,6 +16,9 @@ package android.app.backup; +import static android.app.backup.BackupManager.OperationType; + +import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.pm.PackageManager; @@ -41,6 +44,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -90,27 +94,61 @@ public class FullBackup { "fakeClientSideEncryption"; /** + * Identify {@link BackupScheme} object by package and operation type + * (see {@link OperationType}) it corresponds to. + */ + private static class BackupSchemeId { + final String mPackageName; + @OperationType final int mOperationType; + + BackupSchemeId(String packageName, @OperationType int operationType) { + mPackageName = packageName; + mOperationType = operationType; + } + + @Override + public int hashCode() { + return Objects.hash(mPackageName, mOperationType); + } + + @Override + public boolean equals(@Nullable Object object) { + if (this == object) { + return true; + } + if (object == null || getClass() != object.getClass()) { + return false; + } + BackupSchemeId that = (BackupSchemeId) object; + return Objects.equals(mPackageName, that.mPackageName) && + Objects.equals(mOperationType, that.mOperationType); + } + } + + /** * @hide */ @UnsupportedAppUsage static public native int backupToTar(String packageName, String domain, String linkdomain, String rootpath, String path, FullBackupDataOutput output); - private static final Map<String, BackupScheme> kPackageBackupSchemeMap = - new ArrayMap<String, BackupScheme>(); + private static final Map<BackupSchemeId, BackupScheme> kPackageBackupSchemeMap = + new ArrayMap<>(); - static synchronized BackupScheme getBackupScheme(Context context) { + static synchronized BackupScheme getBackupScheme(Context context, + @OperationType int operationType) { + BackupSchemeId backupSchemeId = new BackupSchemeId(context.getPackageName(), operationType); BackupScheme backupSchemeForPackage = - kPackageBackupSchemeMap.get(context.getPackageName()); + kPackageBackupSchemeMap.get(backupSchemeId); if (backupSchemeForPackage == null) { - backupSchemeForPackage = new BackupScheme(context); - kPackageBackupSchemeMap.put(context.getPackageName(), backupSchemeForPackage); + backupSchemeForPackage = new BackupScheme(context, operationType); + kPackageBackupSchemeMap.put(backupSchemeId, backupSchemeForPackage); } return backupSchemeForPackage; } public static BackupScheme getBackupSchemeForTest(Context context) { - BackupScheme testing = new BackupScheme(context); + BackupScheme testing = new BackupScheme(context, OperationType.BACKUP); testing.mExcludes = new ArraySet(); testing.mIncludes = new ArrayMap(); return testing; @@ -236,6 +274,7 @@ public class FullBackup { private final static String TAG_EXCLUDE = "exclude"; final int mFullBackupContent; + @OperationType final int mOperationType; final PackageManager mPackageManager; final StorageManager mStorageManager; final String mPackageName; @@ -354,8 +393,9 @@ public class FullBackup { */ ArraySet<PathWithRequiredFlags> mExcludes; - BackupScheme(Context context) { + BackupScheme(Context context, @OperationType int operationType) { mFullBackupContent = context.getApplicationInfo().fullBackupContent; + mOperationType = operationType; mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); mPackageManager = context.getPackageManager(); mPackageName = context.getPackageName(); |