From 7b88128e08ba45b071cd714dad9681ce66920d32 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Sun, 7 Jun 2009 13:52:37 -0700 Subject: Adjust IBackupTransport interface Instead of just passing a package name to performBackup, pass the whole PackageInfo struct, explicitly including the list of signatures for the package. No need to make each transport look this up individually when it's a necessary part of the backup payload for each app. --- core/java/com/android/internal/backup/AdbTransport.java | 4 +++- .../java/com/android/internal/backup/GoogleTransport.java | 9 +++++---- .../com/android/internal/backup/IBackupTransport.aidl | 15 ++++++++------- .../java/com/android/server/BackupManagerService.java | 14 ++++++++++---- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/core/java/com/android/internal/backup/AdbTransport.java b/core/java/com/android/internal/backup/AdbTransport.java index acb3273..6e72b7b 100644 --- a/core/java/com/android/internal/backup/AdbTransport.java +++ b/core/java/com/android/internal/backup/AdbTransport.java @@ -1,5 +1,6 @@ package com.android.internal.backup; +import android.content.pm.PackageInfo; import android.os.ParcelFileDescriptor; import android.os.RemoteException; @@ -12,6 +13,7 @@ import android.os.RemoteException; public class AdbTransport extends IBackupTransport.Stub { public int startSession() throws RemoteException { + // TODO Auto-generated method stub return 0; } @@ -20,7 +22,7 @@ public class AdbTransport extends IBackupTransport.Stub { return 0; } - public int performBackup(String packageName, ParcelFileDescriptor data) + public int performBackup(PackageInfo packageInfo, ParcelFileDescriptor data) throws RemoteException { // TODO Auto-generated method stub return 0; diff --git a/core/java/com/android/internal/backup/GoogleTransport.java b/core/java/com/android/internal/backup/GoogleTransport.java index 85ab21e..7d1d269 100644 --- a/core/java/com/android/internal/backup/GoogleTransport.java +++ b/core/java/com/android/internal/backup/GoogleTransport.java @@ -1,5 +1,6 @@ package com.android.internal.backup; +import android.content.pm.PackageInfo; import android.os.ParcelFileDescriptor; import android.os.RemoteException; @@ -9,18 +10,18 @@ import android.os.RemoteException; public class GoogleTransport extends IBackupTransport.Stub { - public int endSession() throws RemoteException { + public int startSession() throws RemoteException { // TODO Auto-generated method stub return 0; } - public int performBackup(String packageName, ParcelFileDescriptor data) - throws RemoteException { + public int endSession() throws RemoteException { // TODO Auto-generated method stub return 0; } - public int startSession() throws RemoteException { + public int performBackup(PackageInfo packageInfo, ParcelFileDescriptor data) + throws RemoteException { // TODO Auto-generated method stub return 0; } diff --git a/core/java/com/android/internal/backup/IBackupTransport.aidl b/core/java/com/android/internal/backup/IBackupTransport.aidl index 2b44fe7..6f9df65 100644 --- a/core/java/com/android/internal/backup/IBackupTransport.aidl +++ b/core/java/com/android/internal/backup/IBackupTransport.aidl @@ -16,7 +16,7 @@ package com.android.internal.backup; -import android.os.Bundle; +import android.content.pm.PackageInfo; import android.os.ParcelFileDescriptor; /** {@hide} */ @@ -26,7 +26,7 @@ interface IBackupTransport { 1. set up the connection to the destination - set up encryption - for Google cloud, log in using the user's gaia credential or whatever - - for sd, spin off the backup transport and establish communication with it + - for adb, just set up the all-in-one destination file 2. send each app's backup transaction - parse the data file for key/value pointers etc - send key/blobsize set to the Google cloud, get back quota ok/rejected response @@ -37,7 +37,7 @@ interface IBackupTransport { - sd target streams raw data into encryption envelope then to sd? 3. shut down connection to destination - cloud: tear down connection etc - - sd: close the file and shut down the writer proxy + - adb: close the file */ /** * Establish a connection to the back-end data repository, if necessary. If the transport @@ -51,13 +51,14 @@ interface IBackupTransport { /** * Send one application's data to the backup destination. * - * @param packageName The identity of the application whose data is being backed up. + * @param package The identity of the application whose data is being backed up. This + * specifically includes the signature list for the package. * @param data The data stream that resulted from invoking the application's - * BackupService.doBackup() method. This may be a pipe rather than a - * file on persistent media, so it may not be seekable. + * BackupService.doBackup() method. This may be a pipe rather than a file on + * persistent media, so it may not be seekable. * @return Zero on success; a nonzero error code on failure. */ - int performBackup(String packageName, in ParcelFileDescriptor data); + int performBackup(in PackageInfo packageInfo, in ParcelFileDescriptor data); /** * Terminate the backup session, closing files, freeing memory, and cleaning up whatever diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index 5b70c2c..6c5953f 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; @@ -149,8 +150,6 @@ class BackupManagerService extends IBackupManager.Stub { return; } - // !!! TODO: this is buggy right now; we wind up with duplicate participant entries - // after using 'adb install -r' of a participating app String action = intent.getAction(); if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { synchronized (mBackupParticipants) { @@ -211,6 +210,11 @@ class BackupManagerService extends IBackupManager.Stub { Log.d(TAG, "processOneBackup doBackup() on " + packageName); try { + // Look up the package info & signatures. This is first so that if it + // throws an exception, there's no file setup yet that would need to + // be unraveled. + PackageInfo packInfo = mPackageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); + // !!! TODO: get the state file dir from the transport File savedStateName = new File(mStateDir, packageName); File backupDataName = new File(mDataDir, packageName + ".data"); @@ -253,15 +257,17 @@ class BackupManagerService extends IBackupManager.Stub { if (DEBUG) Log.v(TAG, "doBackup() success; calling transport"); backupData = ParcelFileDescriptor.open(backupDataName, ParcelFileDescriptor.MODE_READ_ONLY); - int error = transport.performBackup(packageName, backupData); + int error = transport.performBackup(packInfo, backupData); // !!! TODO: After successful transport, delete the now-stale data // and juggle the files so that next time the new state is passed //backupDataName.delete(); newStateName.renameTo(savedStateName); } + } catch (NameNotFoundException e) { + Log.e(TAG, "Package not found on backup: " + packageName); } catch (FileNotFoundException fnf) { - Log.d(TAG, "File not found on backup: "); + Log.w(TAG, "File not found on backup: "); fnf.printStackTrace(); } catch (RemoteException e) { Log.d(TAG, "Remote target " + request.appInfo.packageName + " threw during backup:"); -- cgit v1.1