From 1c781baf13d91ed60be2792a81a7667a03b70b71 Mon Sep 17 00:00:00 2001 From: Sarp Misoglu Date: Mon, 17 Oct 2022 13:52:33 +0000 Subject: Retrieve a monitor for backup Tasks when it's missing Currently the monitor is already passed in via the BackupManager#requestBackup API. This CL covers all the other entry points to backups (that are still maintained). Full backups: 1. FullBackupJob -- scheduled by the framework 2. The "bmgr fullbackup" adb command Key-Value backups: 1. KeyValueBackupJob -- scheduled by the framework 2. BackupManager#backupNow API 3. "bmgr run" adb command Requesting the monitor in PFTBT.java covers the full backup cases. Unfortunately we can't request the monitor any earlier since PFTBT only has access to a transport connection at this point. This means sometimes (when KVBackupTask starts PFTBT when requestBackup() is called) we won't need to request the monitor-- hence the null check. Requesting it in BackupHandler when handling the MSG_RUN_BACKUP covers the KV backups. Bug: 252763821 Test: atest CtsBackupHostTestCases Also manually by running the following commands and verifying the correct methods are called with logcat logs. adb shell cmd jobscheduler run -f android {FullBackupJob id} adb shell bmgr fullbackup --all adb shell cmd jobscheduler run -f android {KeyValueBackupJob id} adb shell bmgr run --all Change-Id: I1c49c30e5fa8d174f0974aef8384d1a113fa6c88 --- .../backup/fullbackup/PerformFullTransportBackupTask.java | 10 ++++++++++ .../com/android/server/backup/internal/BackupHandler.java | 11 ++++++++++- .../server/backup/transport/BackupTransportClient.java | 11 +++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) 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 eac98f2b2337..f0492a8b58b4 100644 --- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java +++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java @@ -376,6 +376,16 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba return; } + // In some cases there may not be a monitor passed in when creating this task. So, if we + // don't have one already we ask the transport for a monitor. + if (mMonitor == null) { + try { + mMonitor = transport.getBackupManagerMonitor(); + } catch (RemoteException e) { + Slog.i(TAG, "Failed to retrieve monitor from transport"); + } + } + // Set up to send data to the transport final int N = mPackages.size(); final byte[] buffer = new byte[8192]; diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java index 03796eae3b8e..95cc289d58b7 100644 --- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java +++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java @@ -21,6 +21,7 @@ import static com.android.server.backup.BackupManagerService.MORE_DEBUG; import static com.android.server.backup.BackupManagerService.TAG; import android.app.backup.BackupManager.OperationType; +import android.app.backup.IBackupManagerMonitor; import android.app.backup.RestoreSet; import android.os.Handler; import android.os.HandlerThread; @@ -203,6 +204,14 @@ public class BackupHandler extends Handler { } } + // Ask the transport for a monitor that will be used to relay log events back to it. + IBackupManagerMonitor monitor = null; + try { + monitor = transport.getBackupManagerMonitor(); + } catch (RemoteException e) { + Slog.i(TAG, "Failed to retrieve monitor from transport"); + } + // At this point, we have started a new journal file, and the old // file identity is being passed to the backup processing task. // When it completes successfully, that old journal file will be @@ -225,7 +234,7 @@ public class BackupHandler extends Handler { queue, oldJournal, /* observer */ null, - /* monitor */ null, + monitor, listener, Collections.emptyList(), /* userInitiated */ false, diff --git a/services/backup/java/com/android/server/backup/transport/BackupTransportClient.java b/services/backup/java/com/android/server/backup/transport/BackupTransportClient.java index 237a3faf220e..40d7cad9405a 100644 --- a/services/backup/java/com/android/server/backup/transport/BackupTransportClient.java +++ b/services/backup/java/com/android/server/backup/transport/BackupTransportClient.java @@ -18,10 +18,12 @@ package com.android.server.backup.transport; import android.annotation.Nullable; import android.app.backup.BackupTransport; +import android.app.backup.IBackupManagerMonitor; import android.app.backup.RestoreDescription; import android.app.backup.RestoreSet; import android.content.Intent; import android.content.pm.PackageInfo; +import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.Slog; @@ -362,6 +364,15 @@ public class BackupTransportClient { return result == null ? BackupTransport.TRANSPORT_ERROR : result; } + /** + * See {@link IBackupTransport#getBackupManagerMonitor()} + */ + public IBackupManagerMonitor getBackupManagerMonitor() throws RemoteException { + AndroidFuture resultFuture = mTransportFutures.newFuture(); + mTransportBinder.getBackupManagerMonitor(resultFuture); + return IBackupManagerMonitor.Stub.asInterface((IBinder) getFutureResult(resultFuture)); + } + /** * Allows the {@link TransportConnection} to notify this client * if the underlying transport has become unusable. If that happens -- cgit v1.2.3-59-g8ed1b