Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 64efde0b authored by Annie Meng's avatar Annie Meng Committed by Android (Google) Code Review
Browse files

Merge changes If88d9505,I140c4db3,I6d2b375a

* changes:
  [Multi-user] Initialize user state in UserBMS
  [Multi-user] Consolidate BMS creation
  [Multi-user] Stop migrating legacy backup setting
parents e9d3ef15 59f6f7ff
Loading
Loading
Loading
Loading
+7 −87
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import android.app.job.JobParameters;
import android.app.job.JobScheduler;
import android.app.job.JobService;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -38,8 +37,6 @@ import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.Trace;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Slog;

import com.android.internal.annotations.VisibleForTesting;
@@ -82,11 +79,11 @@ public class BackupManagerService {
        return sInstance;
    }

    /** Helper to create the {@link BackupManagerService} instance. */
    public static BackupManagerService create(
            Context context,
            Trampoline parent,
            HandlerThread backupThread) {
    private UserBackupManagerService mUserBackupManagerService;

    /** Instantiate a new instance of {@link BackupManagerService}. */
    public BackupManagerService(
            Context context, Trampoline trampoline, HandlerThread backupThread) {
        // Set up our transport options and initialize the default transport
        SystemConfig systemConfig = SystemConfig.getInstance();
        Set<ComponentName> transportWhitelist = systemConfig.getBackupTransportWhitelist();
@@ -94,50 +91,9 @@ public class BackupManagerService {
            transportWhitelist = Collections.emptySet();
        }

        String transport =
                Settings.Secure.getString(
                        context.getContentResolver(), Settings.Secure.BACKUP_TRANSPORT);
        if (TextUtils.isEmpty(transport)) {
            transport = null;
        }
        if (DEBUG) {
            Slog.v(TAG, "Starting with transport " + transport);
        }
        TransportManager transportManager =
                new TransportManager(
                        context,
                        transportWhitelist,
                        transport);

        // If encrypted file systems is enabled or disabled, this call will return the
        // correct directory.
        File baseStateDir = new File(Environment.getDataDirectory(), "backup");

        // This dir on /cache is managed directly in init.rc
        File dataDir = new File(Environment.getDownloadCacheDirectory(), "backup_stage");

        return new BackupManagerService(
                context,
                parent,
                backupThread,
                baseStateDir,
                dataDir,
                transportManager);
    }

    private UserBackupManagerService mUserBackupManagerService;

    /** Instantiate a new instance of {@link BackupManagerService}. */
    public BackupManagerService(
            Context context,
            Trampoline trampoline,
            HandlerThread backupThread,
            File baseStateDir,
            File dataDir,
            TransportManager transportManager) {
        mUserBackupManagerService =
                new UserBackupManagerService(
                        context, trampoline, backupThread, baseStateDir, dataDir, transportManager);
                UserBackupManagerService.createAndInitializeService(
                        context, trampoline, backupThread, transportWhitelist);
    }

    // TODO(b/118520567): Remove when tests are modified to use per-user instance.
@@ -151,30 +107,6 @@ public class BackupManagerService {
     * a background thread to keep the unlock time down.
     */
    public void unlockSystemUser() {
        // Migrate legacy setting
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup migrate");
        if (!backupSettingMigrated(UserHandle.USER_SYSTEM)) {
            if (DEBUG) {
                Slog.i(TAG, "Backup enable apparently not migrated");
            }
            ContentResolver resolver = sInstance.getContext().getContentResolver();
            int enableState = Settings.Secure.getIntForUser(resolver,
                    Settings.Secure.BACKUP_ENABLED, -1, UserHandle.USER_SYSTEM);
            if (enableState >= 0) {
                if (DEBUG) {
                    Slog.i(TAG, "Migrating enable state " + (enableState != 0));
                }
                writeBackupEnableState(enableState != 0, UserHandle.USER_SYSTEM);
                Settings.Secure.putStringForUser(resolver,
                        Settings.Secure.BACKUP_ENABLED, null, UserHandle.USER_SYSTEM);
            } else {
                if (DEBUG) {
                    Slog.i(TAG, "Backup not yet configured; retaining null enable state");
                }
            }
        }
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup enable");
        try {
            sInstance.setBackupEnabled(readBackupEnableState(UserHandle.USER_SYSTEM));
@@ -572,12 +504,6 @@ public class BackupManagerService {
        mUserBackupManagerService.dump(fd, pw, args);
    }

    private static boolean backupSettingMigrated(int userId) {
        File base = new File(Environment.getDataDirectory(), "backup");
        File enableFile = new File(base, BACKUP_ENABLE_FILE);
        return enableFile.exists();
    }

    private static boolean readBackupEnableState(int userId) {
        File base = new File(Environment.getDataDirectory(), "backup");
        File enableFile = new File(base, BACKUP_ENABLE_FILE);
@@ -607,14 +533,8 @@ public class BackupManagerService {
            stage.renameTo(enableFile);
            // will be synced immediately by the try-with-resources call to close()
        } catch (IOException | RuntimeException e) {
            // Whoops; looks like we're doomed.  Roll everything out, disabled,
            // including the legacy state.
            Slog.e(TAG, "Unable to record backup enable state; reverting to disabled: "
                    + e.getMessage());

            ContentResolver resolver = sInstance.getContext().getContentResolver();
            Settings.Secure.putStringForUser(resolver,
                    Settings.Secure.BACKUP_ENABLED, null, userId);
            enableFile.delete();
            stage.delete();
        }
+1 −1
Original line number Diff line number Diff line
@@ -137,7 +137,7 @@ public class Trampoline extends IBackupManager.Stub {
    }

    protected BackupManagerService createBackupManagerService() {
        return BackupManagerService.create(mContext, this, mHandlerThread);
        return new BackupManagerService(mContext, this, mHandlerThread);
    }

    /**
+70 −6
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.backup;

import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND;

import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.server.backup.BackupManagerService.DEBUG;
import static com.android.server.backup.BackupManagerService.DEBUG_SCHEDULING;
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
@@ -68,6 +69,7 @@ import android.database.ContentObserver;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
@@ -86,6 +88,7 @@ import android.os.WorkSource;
import android.os.storage.IStorageManager;
import android.os.storage.StorageManager;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.EventLog;
@@ -167,6 +170,10 @@ public class UserBackupManagerService {
    // Persistently track the need to do a full init.
    private static final String INIT_SENTINEL_FILE_NAME = "_need_init_";

    // Name of the directories the service stores bookkeeping data under.
    private static final String BACKUP_PERSISTENT_DIR = "backup";
    private static final String BACKUP_STAGING_DIR = "backup_stage";

    // System-private key used for backing up an app's widget state.  Must
    // begin with U+FFxx by convention (we reserve all keys starting
    // with U+FF00 or higher for system use).
@@ -360,15 +367,71 @@ public class UserBackupManagerService {
    private long mAncestralToken = 0;
    private long mCurrentToken = 0;

    /**
     * Creates an instance of {@link UserBackupManagerService} and initializes state for it. This
     * includes setting up the directories where we keep our bookkeeping and transport management.
     *
     * @see #createAndInitializeService(Context, Trampoline, HandlerThread, File, File,
     *     TransportManager)
     */
    static UserBackupManagerService createAndInitializeService(
            Context context,
            Trampoline trampoline,
            HandlerThread backupThread,
            Set<ComponentName> transportWhitelist) {
        String currentTransport =
                Settings.Secure.getString(
                        context.getContentResolver(), Settings.Secure.BACKUP_TRANSPORT);
        if (TextUtils.isEmpty(currentTransport)) {
            currentTransport = null;
        }

        if (DEBUG) {
            Slog.v(TAG, "Starting with transport " + currentTransport);
        }
        TransportManager transportManager =
                new TransportManager(context, transportWhitelist, currentTransport);

        File baseStateDir = new File(Environment.getDataDirectory(), BACKUP_PERSISTENT_DIR);

        // This dir on /cache is managed directly in init.rc
        File dataDir = new File(Environment.getDownloadCacheDirectory(), BACKUP_STAGING_DIR);

        return createAndInitializeService(
                context, trampoline, backupThread, baseStateDir, dataDir, transportManager);
    }

    /**
     * Creates an instance of {@link UserBackupManagerService}.
     *
     * @param context The system server context.
     * @param trampoline A reference to the proxy to {@link BackupManagerService}.
     * @param backupThread The thread running backup/restore operations for the user.
     * @param baseStateDir The directory we store the user's persistent bookkeeping data.
     * @param dataDir The directory we store the user's temporary staging data.
     * @param transportManager The {@link TransportManager} responsible for handling the user's
     *     transports.
     */
    @VisibleForTesting
    public UserBackupManagerService(
    public static UserBackupManagerService createAndInitializeService(
            Context context,
            Trampoline trampoline,
            HandlerThread backupThread,
            File baseStateDir,
            File dataDir,
            TransportManager transportManager) {
        return new UserBackupManagerService(
                context, trampoline, backupThread, baseStateDir, dataDir, transportManager);
    }

    private UserBackupManagerService(
            Context context,
            Trampoline parent,
            HandlerThread backupThread,
            File baseStateDir,
            File dataDir,
            TransportManager transportManager) {
        mContext = context;
        mContext = checkNotNull(context, "context cannot be null");
        mPackageManager = context.getPackageManager();
        mPackageManagerBinder = AppGlobals.getPackageManager();
        mActivityManager = ActivityManager.getService();
@@ -377,6 +440,7 @@ public class UserBackupManagerService {
        mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        mStorageManager = IStorageManager.Stub.asInterface(ServiceManager.getService("mount"));

        checkNotNull(parent, "trampoline cannot be null");
        mBackupManagerBinder = Trampoline.asInterface(parent.asBinder());

        mAgentTimeoutParameters = new
@@ -384,6 +448,7 @@ public class UserBackupManagerService {
        mAgentTimeoutParameters.start();

        // spin up the backup/restore handler thread
        checkNotNull(backupThread, "backupThread cannot be null");
        mBackupHandler = new BackupHandler(this, backupThread.getLooper());

        // Set up our bookkeeping
@@ -398,13 +463,13 @@ public class UserBackupManagerService {
                Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED),
                false, mProvisionedObserver);

        mBaseStateDir = baseStateDir;
        mBaseStateDir = checkNotNull(baseStateDir, "baseStateDir cannot be null");
        mBaseStateDir.mkdirs();
        if (!SELinux.restorecon(mBaseStateDir)) {
            Slog.e(TAG, "SELinux restorecon failed on " + mBaseStateDir);
        }

        mDataDir = dataDir;
        mDataDir = checkNotNull(dataDir, "dataDir cannot be null");

        mBackupPasswordManager = new BackupPasswordManager(mContext, mBaseStateDir, mRng);

@@ -451,7 +516,7 @@ public class UserBackupManagerService {
            addPackageParticipantsLocked(null);
        }

        mTransportManager = transportManager;
        mTransportManager = checkNotNull(transportManager, "transportManager cannot be null");
        mTransportManager.setOnTransportRegisteredListener(this::onTransportRegistered);
        mRegisterTransportsRequestedTime = SystemClock.elapsedRealtime();
        mBackupHandler.postDelayed(
@@ -465,7 +530,6 @@ public class UserBackupManagerService {
        mWakelock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*");
    }


    public BackupManagerConstants getConstants() {
        return mConstants;
    }
+1 −5
Original line number Diff line number Diff line
@@ -57,7 +57,6 @@ public class BackupManagerServiceTest {
    private static final String TEST_TRANSPORT = "transport";

    @Mock private UserBackupManagerService mUserBackupManagerService;
    @Mock private TransportManager mTransportManager;
    private BackupManagerService mBackupManagerService;
    private Context mContext;

@@ -72,10 +71,7 @@ public class BackupManagerServiceTest {
                new BackupManagerService(
                        application,
                        new Trampoline(application),
                        BackupManagerServiceTestUtils.startBackupThread(null),
                        new File(application.getCacheDir(), "base_state"),
                        new File(application.getCacheDir(), "data"),
                        mTransportManager);
                        BackupManagerServiceTestUtils.startBackupThread(null));
        mBackupManagerService.setUserBackupManagerService(mUserBackupManagerService);
    }

+170 −54

File changed.

Preview size limit exceeded, changes collapsed.

Loading