1, 概述
bmgr主要是和BackupManagerService进行交互,主要是备份和恢复数据。
2, bmgr命令
命令格式:
bmgr <command>
命令列表:
命令 | 功能 | 实现方法 |
backup 包名 | 备份apk | BMS. dataChanged |
run | 立即备份 | backupNow |
resote包名 | 恢复apk | beginRestoreSession/ endRestoreSession |
wipe 包名 | 擦除 apk数据 | clearBackupData |
enabled | 启用备份 | isBackupEnabled |
enable | 允许/禁用备份 | setBackupEnabled |
3, 详细流程
所有adb命令的bmgr方法最后都会通过Bmgr.java执行,然后通过跨进程调用BackupManagerService的方法完成。
Bmgr的main方法如下,
public static void main(String[] args) {
try {
new Bmgr().run(args);
} catch (Exception e) {
System.err.println("Exception caught:");
e.printStackTrace();
}
直接调用run方法,
public void run(String[] args) {
if (args.length < 1) {
showUsage();
return;
}
mBmgr = IBackupManager.Stub.asInterface(ServiceManager.getService("backup"));
if (mBmgr == null) {
System.err.println(BMGR_NOT_RUNNING_ERR);
return;
}
mArgs = args;
String op = args[0];
mNextArg = 1;
if ("enabled".equals(op)) {
doEnabled();
return;
}
if ("enable".equals(op)) {
doEnable();
return;
}
if ("run".equals(op)) {
doRun();
return;
}
if ("backup".equals(op)) {
doBackup();
return;
}
if ("list".equals(op)) {
doList();
return;
}
if ("restore".equals(op)) {
doRestore();
return;
}
if ("transport".equals(op)) {
doTransport();
return;
}
if ("wipe".equals(op)) {
doWipe();
return;
}
if ("fullbackup".equals(op)) {
doFullTransportBackup();
return;
}
System.err.println("Unknown command");
showUsage();
}
不同的指令分别对应不同的方法, restore指令调用的doRestore方法如下,
private void doRestore() {
String arg = nextArg();
if (arg == null) {
showUsage();
return;
}
if (arg.indexOf('.') >= 0 || arg.equals("android")) {
// it's a package name
doRestorePackage(arg);
} else {
try {
long token = Long.parseLong(arg, 16);
HashSet<String> filter = null;
while ((arg = nextArg()) != null) {
if (filter == null) filter = new HashSet<String>();
filter.add(arg);
}
doRestoreAll(token, filter);
} catch (NumberFormatException e) {
showUsage();
return;
}
}
System.out.println("done");
}
如果是一个包名,则调用doRestorePackage方法;
否则调用doRestoreAll方法完成恢复数据的过程。
doRestorePackage方法如下,
private void doRestorePackage(String pkg) {
try {
mRestore = mBmgr.beginRestoreSession(pkg, null);
if (mRestore == null) {
System.err.println(BMGR_NOT_RUNNING_ERR);
return;
}
RestoreObserver observer = new RestoreObserver();
int err = mRestore.restorePackage(pkg, observer);
if (err == 0) {
// Off and running -- wait for the restore to complete
observer.waitForCompletion();
} else {
System.err.println("Unable to restore package " + pkg);
}
// And finally shut down the session
mRestore.endRestoreSession();
} catch (RemoteException e) {
System.err.println(e.toString());
System.err.println(BMGR_NOT_RUNNING_ERR);
}
}
调用beginRestoreSession 方法开始恢复,完成之后,调用endRestoreSession 方法结束。