summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk1
-rw-r--r--api/system-current.txt17
-rw-r--r--cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java4
-rw-r--r--core/java/android/app/backup/BackupManager.java27
-rw-r--r--core/java/android/app/backup/BackupManagerMonitor.java80
-rw-r--r--core/java/android/app/backup/IBackupManager.aidl7
-rw-r--r--core/java/android/app/backup/IBackupManagerMonitor.aidl36
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java86
-rw-r--r--services/backup/java/com/android/server/backup/Trampoline.java7
9 files changed, 237 insertions, 28 deletions
diff --git a/Android.mk b/Android.mk
index 9e8973886320..9ebc276d4a84 100644
--- a/Android.mk
+++ b/Android.mk
@@ -104,6 +104,7 @@ LOCAL_SRC_FILES += \
core/java/android/app/trust/ITrustListener.aidl \
core/java/android/app/backup/IBackupManager.aidl \
core/java/android/app/backup/IBackupObserver.aidl \
+ core/java/android/app/backup/IBackupManagerMonitor.aidl \
core/java/android/app/backup/IFullBackupRestoreObserver.aidl \
core/java/android/app/backup/IRestoreObserver.aidl \
core/java/android/app/backup/IRestoreSession.aidl \
diff --git a/api/system-current.txt b/api/system-current.txt
index 3a58bf4c8d7a..63489a9c33f0 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -6895,7 +6895,7 @@ package android.app.backup {
method public boolean isBackupEnabled();
method public java.lang.String[] listAllTransports();
method public int requestBackup(java.lang.String[], android.app.backup.BackupObserver);
- method public int requestBackup(java.lang.String[], android.app.backup.BackupObserver, int);
+ method public int requestBackup(java.lang.String[], android.app.backup.BackupObserver, android.app.backup.BackupManagerMonitor, int);
method public int requestRestore(android.app.backup.RestoreObserver);
method public deprecated java.lang.String selectBackupTransport(java.lang.String);
method public void selectBackupTransport(android.content.ComponentName, android.app.backup.SelectBackupTransportCallback);
@@ -6914,6 +6914,21 @@ package android.app.backup {
field public static final int SUCCESS = 0; // 0x0
}
+ public class BackupManagerMonitor {
+ ctor public BackupManagerMonitor();
+ method public void onEvent(android.os.Bundle);
+ field public static final java.lang.String EXTRA_LOG_EVENT_CATEGORY = "android.app.backup.extra.LOG_EVENT_CATEGORY";
+ field public static final java.lang.String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID";
+ field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_NAME = "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME";
+ field public static final java.lang.String EXTRA_LOG_EVENT_PACKAGE_VERSION = "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION";
+ field public static final int LOG_EVENT_CATEGORY_AGENT = 2; // 0x2
+ field public static final int LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY = 3; // 0x3
+ field public static final int LOG_EVENT_CATEGORY_TRANSPORT = 1; // 0x1
+ field public static final int LOG_EVENT_ID_FULL_BACKUP_TIMEOUT = 4; // 0x4
+ field public static final int LOG_EVENT_ID_KEY_VALUE_BACKUP_TIMEOUT = 21; // 0x15
+ field public static final int LOG_EVENT_ID_NO_PACKAGES = 49; // 0x31
+ }
+
public abstract class BackupObserver {
ctor public BackupObserver();
method public void backupFinished(int);
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
index 7e913913dfae..3e5c3e8efb88 100644
--- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
+++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
@@ -17,6 +17,7 @@
package com.android.commands.bmgr;
import android.app.backup.BackupManager;
+import android.app.backup.BackupManagerMonitor;
import android.app.backup.BackupProgress;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupObserver;
@@ -312,8 +313,9 @@ public final class Bmgr {
}
try {
BackupObserver observer = new BackupObserver();
+ // TODO: implement monitor here?
int err = mBmgr.requestBackup(packages.toArray(new String[packages.size()]), observer,
- flags);
+ null, flags);
if (err == 0) {
// Off and running -- wait for the backup to complete
observer.waitForCompletion();
diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java
index f0abe33c4df3..f5c223522213 100644
--- a/core/java/android/app/backup/BackupManager.java
+++ b/core/java/android/app/backup/BackupManager.java
@@ -19,6 +19,7 @@ package android.app.backup;
import android.annotation.SystemApi;
import android.content.ComponentName;
import android.content.Context;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
@@ -556,7 +557,7 @@ public class BackupManager {
*/
@SystemApi
public int requestBackup(String[] packages, BackupObserver observer) {
- return requestBackup(packages, observer, 0);
+ return requestBackup(packages, observer, null, 0);
}
/**
@@ -570,20 +571,26 @@ public class BackupManager {
* @param packages List of package names to backup.
* @param observer The {@link BackupObserver} to receive callbacks during the backup
* operation. Could be {@code null}.
+ * @param monitor The {@link BackupManagerMonitorWrapper} to receive callbacks of important
+ * events during the backup operation. Could be {@code null}.
* @param flags {@link #FLAG_NON_INCREMENTAL_BACKUP}.
* @return {@link BackupManager#SUCCESS} on success; nonzero on error.
* @throws IllegalArgumentException on null or empty {@code packages} param.
* @hide
*/
@SystemApi
- public int requestBackup(String[] packages, BackupObserver observer, int flags) {
+ public int requestBackup(String[] packages, BackupObserver observer,
+ BackupManagerMonitor monitor, int flags) {
checkServiceBinder();
if (sService != null) {
try {
BackupObserverWrapper observerWrapper = observer == null
? null
: new BackupObserverWrapper(mContext, observer);
- return sService.requestBackup(packages, observerWrapper, flags);
+ BackupManagerMonitorWrapper monitorWrapper = monitor == null
+ ? null
+ : new BackupManagerMonitorWrapper(monitor);
+ return sService.requestBackup(packages, observerWrapper, monitorWrapper, flags);
} catch (RemoteException e) {
Log.e(TAG, "requestBackup() couldn't connect");
}
@@ -680,4 +687,18 @@ public class BackupManager {
});
}
}
+
+ private class BackupManagerMonitorWrapper extends IBackupManagerMonitor.Stub {
+ final BackupManagerMonitor mMonitor;
+
+ BackupManagerMonitorWrapper(BackupManagerMonitor monitor) {
+ mMonitor = monitor;
+ }
+
+ @Override
+ public void onEvent(final Bundle event) throws RemoteException {
+ mMonitor.onEvent(event);
+ }
+ }
+
}
diff --git a/core/java/android/app/backup/BackupManagerMonitor.java b/core/java/android/app/backup/BackupManagerMonitor.java
new file mode 100644
index 000000000000..b937886e2032
--- /dev/null
+++ b/core/java/android/app/backup/BackupManagerMonitor.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2017 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 android.annotation.SystemApi;
+import android.os.Bundle;
+
+/**
+ * Callback class for receiving important events during backup/restore operations.
+ * Events consist mostly of errors and exceptions, giving detailed reason on why a restore/backup
+ * failed or any time BackupManager makes an important decision.
+ * On the other hand {@link BackupObserver} will give a failure/success view without
+ * getting into details why. This callback runs on the thread it was called on because it can get
+ * a bit spammy.
+ * These callbacks will run on the binder thread.
+ *
+ * @hide
+ */
+@SystemApi
+public class BackupManagerMonitor {
+
+ // Logging constants for BackupManagerMonitor
+ public static final int LOG_EVENT_CATEGORY_TRANSPORT = 1;
+ public static final int LOG_EVENT_CATEGORY_AGENT = 2;
+ public static final int LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY = 3;
+ /** string : the package name */
+ public static final String EXTRA_LOG_EVENT_PACKAGE_NAME =
+ "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME";
+ /** int : the versionCode of the package named by EXTRA_LOG_EVENT_PACKAGE_NAME */
+ public static final String EXTRA_LOG_EVENT_PACKAGE_VERSION =
+ "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION";
+ /** int : the id of the log message, will be a unique identifier */
+ public static final String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID";
+ /**
+ * int : category will be one of
+ * { LOG_EVENT_CATEGORY_TRANSPORT,
+ * LOG_EVENT_CATEGORY_AGENT,
+ * LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY}.
+ */
+ public static final String EXTRA_LOG_EVENT_CATEGORY =
+ "android.app.backup.extra.LOG_EVENT_CATEGORY";
+
+ // TODO complete this list with all log messages. And document properly.
+ public static final int LOG_EVENT_ID_FULL_BACKUP_TIMEOUT = 4;
+ public static final int LOG_EVENT_ID_KEY_VALUE_BACKUP_TIMEOUT = 21;
+ public static final int LOG_EVENT_ID_NO_PACKAGES = 49;
+
+
+
+ /**
+ * This method will be called each time something important happens on BackupManager.
+ *
+ * @param event bundle will contain data about event:
+ * - event id, not optional, a unique identifier for each event.
+ * - package name, optional, the current package we're backing up/restoring if applicable.
+ * - package version, optional, the current package version we're backing up/restoring
+ * if applicable.
+ * - category of event, not optional, one of
+ * { LOG_EVENT_CATEGORY_TRANSPORT,
+ * LOG_EVENT_CATEGORY_AGENT,
+ * LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY}
+ *
+ */
+ public void onEvent(Bundle event) {
+ }
+}
diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl
index 1657e2e98698..393667d7ff2d 100644
--- a/core/java/android/app/backup/IBackupManager.aidl
+++ b/core/java/android/app/backup/IBackupManager.aidl
@@ -17,6 +17,7 @@
package android.app.backup;
import android.app.backup.IBackupObserver;
+import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IFullBackupRestoreObserver;
import android.app.backup.IRestoreSession;
import android.app.backup.ISelectBackupTransportCallback;
@@ -376,9 +377,13 @@ interface IBackupManager {
* @param observer The {@link BackupObserver} to receive callbacks during the backup
* operation.
*
+ * @param monitor the {@link BackupManagerMonitor} to receive callbacks about important events
+ * during the backup operation.
+ *
* @param flags {@link BackupManager#FLAG_NON_INCREMENTAL_BACKUP}.
*
* @return Zero on success; nonzero on error.
*/
- int requestBackup(in String[] packages, IBackupObserver observer, int flags);
+ int requestBackup(in String[] packages, IBackupObserver observer, IBackupManagerMonitor monitor,
+ int flags);
}
diff --git a/core/java/android/app/backup/IBackupManagerMonitor.aidl b/core/java/android/app/backup/IBackupManagerMonitor.aidl
new file mode 100644
index 000000000000..cf1d9f80718f
--- /dev/null
+++ b/core/java/android/app/backup/IBackupManagerMonitor.aidl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2017 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 android.os.Bundle;
+
+/**
+ * Callback class for receiving important events during backup/restore operations.
+ * These callbacks will run on the binder thread.
+ *
+ * @hide
+ */
+oneway interface IBackupManagerMonitor {
+
+ /**
+ * This method will be called each time something important happens on BackupManager.
+ *
+ * @param event bundle will contain data about event, like package name, package version etc.
+ */
+ void onEvent(in Bundle event);
+
+} \ No newline at end of file
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 2eab813c01e9..043c8ad91eb6 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -30,18 +30,20 @@ import android.app.backup.BackupAgent;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.BackupManager;
+import android.app.backup.BackupManagerMonitor;
import android.app.backup.BackupProgress;
import android.app.backup.BackupTransport;
import android.app.backup.FullBackup;
import android.app.backup.FullBackupDataOutput;
-import android.app.backup.IBackupManager;
import android.app.backup.IBackupObserver;
+import android.app.backup.IBackupManagerMonitor;
+import android.app.backup.RestoreDescription;
+import android.app.backup.RestoreSet;
+import android.app.backup.IBackupManager;
import android.app.backup.IFullBackupRestoreObserver;
import android.app.backup.IRestoreObserver;
import android.app.backup.IRestoreSession;
import android.app.backup.ISelectBackupTransportCallback;
-import android.app.backup.RestoreDescription;
-import android.app.backup.RestoreSet;
import android.app.backup.SelectBackupTransportCallback;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
@@ -427,6 +429,7 @@ public class BackupManagerService {
public IBackupTransport transport;
public String dirName;
public IRestoreObserver observer;
+ public IBackupManagerMonitor monitor;
public long token;
public PackageInfo pkgInfo;
public int pmToken; // in post-install restore, the PM's token for this transaction
@@ -565,17 +568,19 @@ public class BackupManagerService {
public ArrayList<String> kvPackages;
public ArrayList<String> fullPackages;
public IBackupObserver observer;
+ public IBackupManagerMonitor monitor;
public boolean userInitiated;
public boolean nonIncrementalBackup;
BackupParams(IBackupTransport transport, String dirName, ArrayList<String> kvPackages,
- ArrayList<String> fullPackages, IBackupObserver observer, boolean userInitiated,
- boolean nonIncrementalBackup) {
+ ArrayList<String> fullPackages, IBackupObserver observer,
+ IBackupManagerMonitor monitor,boolean userInitiated, boolean nonIncrementalBackup) {
this.transport = transport;
this.dirName = dirName;
this.kvPackages = kvPackages;
this.fullPackages = fullPackages;
this.observer = observer;
+ this.monitor = monitor;
this.userInitiated = userInitiated;
this.nonIncrementalBackup = nonIncrementalBackup;
}
@@ -785,8 +790,8 @@ public class BackupManagerService {
// Spin up a backup state sequence and set it running
try {
String dirName = transport.transportDirName();
- PerformBackupTask pbt = new PerformBackupTask(transport, dirName,
- queue, oldJournal, null, null, false, false /* nonIncremental */);
+ PerformBackupTask pbt = new PerformBackupTask(transport, dirName, queue,
+ oldJournal, null, null, null, false, false /* nonIncremental */);
Message pbtMessage = obtainMessage(MSG_BACKUP_RESTORE_STEP, pbt);
sendMessage(pbtMessage);
} catch (Exception e) {
@@ -861,8 +866,8 @@ public class BackupManagerService {
RestoreParams params = (RestoreParams)msg.obj;
Slog.d(TAG, "MSG_RUN_RESTORE observer=" + params.observer);
BackupRestoreTask task = new PerformUnifiedRestoreTask(params.transport,
- params.observer, params.token, params.pkgInfo, params.pmToken,
- params.isSystemRestore, params.filterSet);
+ params.observer, params.monitor, params.token, params.pkgInfo,
+ params.pmToken, params.isSystemRestore, params.filterSet);
Message restoreMsg = obtainMessage(MSG_BACKUP_RESTORE_STEP, task);
sendMessage(restoreMsg);
break;
@@ -1025,7 +1030,7 @@ public class BackupManagerService {
mWakelock.acquire();
PerformBackupTask pbt = new PerformBackupTask(params.transport, params.dirName,
- kvQueue, null, params.observer, params.fullPackages, true,
+ kvQueue, null, params.observer, params.monitor, params.fullPackages, true,
params.nonIncrementalBackup);
Message pbtMessage = obtainMessage(MSG_BACKUP_RESTORE_STEP, pbt);
sendMessage(pbtMessage);
@@ -2281,11 +2286,18 @@ public class BackupManagerService {
}
public int requestBackup(String[] packages, IBackupObserver observer, int flags) {
+ return requestBackup(packages, observer, null, flags);
+ }
+
+ public int requestBackup(String[] packages, IBackupObserver observer,
+ IBackupManagerMonitor monitor, int flags) {
mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "requestBackup");
if (packages == null || packages.length < 1) {
Slog.e(TAG, "No packages named for backup request");
sendBackupFinished(observer, BackupManager.ERROR_TRANSPORT_ABORTED);
+ monitor = monitorEvent(monitor, BackupManagerMonitor.LOG_EVENT_ID_NO_PACKAGES,
+ null, BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT);
throw new IllegalArgumentException("No packages are provided for backup");
}
@@ -2340,7 +2352,7 @@ public class BackupManagerService {
Message msg = mBackupHandler.obtainMessage(MSG_REQUEST_BACKUP);
msg.obj = new BackupParams(transport, dirName, kvBackupList, fullBackupList, observer,
- true, nonIncrementalBackup);
+ monitor, true, nonIncrementalBackup);
mBackupHandler.sendMessage(msg);
return BackupManager.SUCCESS;
}
@@ -2456,6 +2468,7 @@ public class BackupManagerService {
BackupState mCurrentState;
ArrayList<String> mPendingFullBackups;
IBackupObserver mObserver;
+ IBackupManagerMonitor mMonitor;
// carried information about the current in-flight operation
IBackupAgent mAgentBinder;
@@ -2473,12 +2486,13 @@ public class BackupManagerService {
public PerformBackupTask(IBackupTransport transport, String dirName,
ArrayList<BackupRequest> queue, File journal, IBackupObserver observer,
- ArrayList<String> pendingFullBackups, boolean userInitiated,
- boolean nonIncremental) {
+ IBackupManagerMonitor monitor, ArrayList<String> pendingFullBackups,
+ boolean userInitiated, boolean nonIncremental) {
mTransport = transport;
mOriginalQueue = queue;
mJournal = journal;
mObserver = observer;
+ mMonitor = monitor;
mPendingFullBackups = pendingFullBackups;
mUserInitiated = userInitiated;
mNonIncremental = nonIncremental;
@@ -2838,7 +2852,7 @@ public class BackupManagerService {
PerformFullTransportBackupTask task =
new PerformFullTransportBackupTask(/*fullBackupRestoreObserver*/ null,
fullBackups, /*updateSchedule*/ false, /*runningJob*/ null, latch,
- mObserver, mUserInitiated);
+ mObserver, mMonitor, mUserInitiated);
// Acquiring wakelock for PerformFullTransportBackupTask before its start.
mWakelock.acquire();
(new Thread(task, "full-transport-requested")).start();
@@ -3215,6 +3229,9 @@ public class BackupManagerService {
Slog.e(TAG, "Timeout backing up " + mCurrentPackage.packageName);
EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, mCurrentPackage.packageName,
"timeout");
+ mMonitor = monitorEvent(mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_BACKUP_TIMEOUT,
+ mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT);
addBackupTrace("timeout of " + mCurrentPackage.packageName);
agentErrorCleanup();
dataChangedImpl(mCurrentPackage.packageName);
@@ -4197,17 +4214,19 @@ public class BackupManagerService {
class PerformFullTransportBackupTask extends FullBackupTask {
static final String TAG = "PFTBT";
ArrayList<PackageInfo> mPackages;
+ PackageInfo mCurrentPackage;
boolean mUpdateSchedule;
CountDownLatch mLatch;
AtomicBoolean mKeepRunning; // signal from job scheduler
FullBackupJob mJob; // if a scheduled job needs to be finished afterwards
IBackupObserver mBackupObserver;
+ IBackupManagerMonitor mMonitor;
boolean mUserInitiated;
PerformFullTransportBackupTask(IFullBackupRestoreObserver observer,
String[] whichPackages, boolean updateSchedule,
FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver,
- boolean userInitiated) {
+ IBackupManagerMonitor monitor, boolean userInitiated) {
super(observer);
mUpdateSchedule = updateSchedule;
mLatch = latch;
@@ -4215,12 +4234,14 @@ public class BackupManagerService {
mJob = runningJob;
mPackages = new ArrayList<PackageInfo>(whichPackages.length);
mBackupObserver = backupObserver;
+ mMonitor = monitor;
mUserInitiated = userInitiated;
for (String pkg : whichPackages) {
try {
PackageInfo info = mPackageManager.getPackageInfo(pkg,
PackageManager.GET_SIGNATURES);
+ mCurrentPackage = info;
if (!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,
@@ -4732,6 +4753,9 @@ public class BackupManagerService {
if (DEBUG) {
Slog.w(TAG, "Full backup timeout of " + mTarget.packageName);
}
+ mMonitor = monitorEvent(mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_FULL_BACKUP_TIMEOUT,
+ mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT);
tearDownAgentAndKill(mTarget.applicationInfo);
}
}
@@ -4993,7 +5017,7 @@ public class BackupManagerService {
CountDownLatch latch = new CountDownLatch(1);
String[] pkg = new String[] {entry.packageName};
mRunningFullBackupTask = new PerformFullTransportBackupTask(null, pkg, true,
- scheduledJob, latch, null, false /* userInitiated */);
+ scheduledJob, latch, null, null, false /* userInitiated */);
// Acquiring wakelock for PerformFullTransportBackupTask before its start.
mWakelock.acquire();
(new Thread(mRunningFullBackupTask)).start();
@@ -7825,8 +7849,8 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
// Invariant: mWakelock is already held, and this task is responsible for
// releasing it at the end of the restore operation.
PerformUnifiedRestoreTask(IBackupTransport transport, IRestoreObserver observer,
- long restoreSetToken, PackageInfo targetPackage, int pmToken,
- boolean isFullSystemRestore, String[] filterSet) {
+ IBackupManagerMonitor monitor, long restoreSetToken, PackageInfo targetPackage,
+ int pmToken, boolean isFullSystemRestore, String[] filterSet) {
mState = UnifiedRestoreState.INITIAL;
mStartRealtime = SystemClock.elapsedRealtime();
@@ -9247,7 +9271,7 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
try {
CountDownLatch latch = new CountDownLatch(1);
PerformFullTransportBackupTask task = new PerformFullTransportBackupTask(null,
- pkgNames, false, null, latch, null, false /* userInitiated */);
+ pkgNames, false, null, latch, null, null, false /* userInitiated */);
// Acquiring wakelock for PerformFullTransportBackupTask before its start.
mWakelock.acquire();
(new Thread(task, "full-transport-master")).start();
@@ -10436,4 +10460,28 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
}
}
}
+
+ private static IBackupManagerMonitor monitorEvent(IBackupManagerMonitor monitor, int id,
+ PackageInfo pkg, int category) {
+ if (monitor != null) {
+ try {
+ Bundle bundle = new Bundle();
+ bundle.putInt(BackupManagerMonitor.EXTRA_LOG_EVENT_ID, id);
+ bundle.putInt(BackupManagerMonitor.EXTRA_LOG_EVENT_CATEGORY, category);
+ if (pkg != null) {
+ bundle.putString(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_NAME,
+ pkg.packageName);
+ bundle.putInt(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_VERSION,
+ pkg.versionCode);
+ }
+ monitor.onEvent(bundle);
+ return monitor;
+ } catch(RemoteException e) {
+ if (DEBUG) {
+ Slog.w(TAG, "backup manager monitor went away");
+ }
+ }
+ }
+ return null;
+ }
}
diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java
index a1a2c95e1eac..da0cee5aa4fa 100644
--- a/services/backup/java/com/android/server/backup/Trampoline.java
+++ b/services/backup/java/com/android/server/backup/Trampoline.java
@@ -18,6 +18,7 @@ package com.android.server.backup;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupObserver;
+import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IFullBackupRestoreObserver;
import android.app.backup.IRestoreSession;
import android.app.backup.ISelectBackupTransportCallback;
@@ -355,10 +356,10 @@ public class Trampoline extends IBackupManager.Stub {
}
@Override
- public int requestBackup(String[] packages, IBackupObserver observer, int flags)
- throws RemoteException {
+ public int requestBackup(String[] packages, IBackupObserver observer,
+ IBackupManagerMonitor monitor, int flags) throws RemoteException {
BackupManagerService svc = mService;
- return (svc != null) ? svc.requestBackup(packages, observer, flags) : null;
+ return (svc != null) ? svc.requestBackup(packages, observer, monitor, flags) : null;
}
@Override