52 Commits

Author SHA1 Message Date
Christopher Tate
4e3e50cfa7 Clean up the last two literal permission string usages 2009-07-02 12:14:05 -07:00
Christopher Tate
ee0e78af5a Add a "clear backed-up data" method to the backup mechanism
It's now possible to ask that the backup manager wipe the saved data for a given
application from the backing store.  LocalTransport implements this now but the
Google backend does not yet.  When the data is wiped, the on-device backup state
is also wiped to ensure that the next backup pushes all necessary data.

Bmgr has not yet been modified to actually call into this method, but it will
be soon.
2009-07-02 11:30:29 -07:00
Dianne Hackborn
cf098294da Move backup state to settings, change permission checks to use symbol.
This changes the backup service to use the settings provider instead
of system properties, correspondingly making it off by default and
allowing specific devices to define the transport.  Also tweaks
the permission checks to use the permission symbol instead of raw
strings.

This requires some corresponding changes in the vendor projects.
2009-07-01 20:12:36 -07:00
Joe Onorato
9a5e3e115f Less logging in some places. More in others. 2009-07-01 21:04:03 -04:00
Christopher Tate
49401ddb9a Revamp backup scheduling policy
We now schedule a periodic check of pending backups; if any apps have requested
a backup since the last check, we perform all of the pending backups.  The
periodic backup scheduling matches the enable/disable state of the backup
manager; while backups are disabled entirely there are no periodic wakeups.

The period is set here to one hour.  If an external caller (transport, the
'bmgr' command line tool, etc) requests an immediate backup pass, that is
performed and then the periodic backup check is rescheduled using that pass as
the starting point of a new interval.
2009-07-01 12:38:06 -07:00
Christopher Tate
ce0bf069fe Use secure settings for backup enable / transport selection 2009-07-01 11:45:57 -07:00
Christopher Tate
7958834e0e Run backups at background priority 2009-06-30 16:11:49 -07:00
Christopher Tate
6ef58a1509 Implement persistent enable/disable of the backup manager
Backup & restore is still enabled by default, but with the expectation that it
will be enabled during the course of the Setup Wizard or some other privileged
entity that has notified the user about the ramifications.  While disabled,
data-changed notices will still be collected, but no backup pass will be
scheduled.  When the backup manager is later enabled, any pending data-changed
notices will then be processed and the apps invoked for backup.
2009-06-29 15:33:27 -07:00
Christopher Tate
9171749700 Use system properties to track the current transport
This change retools the transport selection mechanism a fair bit.  Transports
are now specified by name rather than by numeric ID, and the name of the
currently selected transport is stored in a persistent system property under the
name "persist.service.bkup.trans".

The name -> IBackupTransport translation is now handled by maintaining a map
from the names to the live IBackupTransport objects that correspond.  The Google
transport service observer now registers and unregisters the transport as the
service goes up and down.

The bmgr command has been expanded to include real transport interrogation and
selection by name, and some documentation has been written for it.
2009-06-26 21:14:41 -07:00
Christopher Tate
f7c886b4fe Respect android:allowClearUserData=false during restore
Ordinarily we wipe the data of apps we are restoring.  This is problematic for
packages that expect that their data can never be wiped back to nothing,
especially system packages, so we now respect the android:allowClearUserData
manifest attribute.
2009-06-26 15:34:09 -07:00
Christopher Tate
466ef345d1 Trim some superfluous imports. 2009-06-26 14:41:57 -07:00
Dan Egnor
156411df46 Use a long for restore token 2009-06-26 13:25:27 -07:00
Christopher Tate
7d562ec393 Add a new IRestoreObserver callback class to the restore process
The observer is told when restore begins how many packages are being restored.
It then gets an onUpdate() call telling it that the Nth package is now
undergoing restore.  Ultimately, its restoreFinished() callback is invoked,
passing a simple success/fail error code, to let it know that the restore
operation has concluded.
2009-06-25 18:09:28 -07:00
Christopher Tate
5cb400bd72 Keep track of backup state independently for each transport
Backup transports now provide the Backup Manager with a suggested name with
which it can disambiguate any transport-specific bookkeeping that it needs to
maintain.  The Manager keeps separate application backup 'state blobs' for each
transport now, preventing things from getting out of step if the device is
switched among multiple transports.

Also, the metadata backup agent is always invoked now on each backup pass.  This
is cheap when there is nothing to do, but also strongly ensures that we never
wind up in a situation where a given transport destination has not been given
all of the metadata necessary for the backup set.
2009-06-25 16:09:03 -07:00
Dan Egnor
6f21128d1f Switch the default transport to GOOGLE. 2009-06-25 12:07:58 -07:00
Christopher Tate
111bd4acdb Start backing up wallpaper
This CL does the following:
   + adds an AbsoluteFileBackupHelper class for managing backup of files
     known by absolute path, not based off of the app's getFilesDir() root
   + bumps up the collection interval from its testing-only default of 1 second
     to 3 minutes
   + adds a SystemBackupAgent class to the main system package and names it as
     the android:backupAgent for the main OS package.  Right now this agent
     only backs up & restores the wallpaper file.
   + amend the Wallpaper Service to inform the Backup Manager when the wallpaper
     changes.

On the subject of the 3-minute collection interval before the backup actually
occurs:  this can be short-circuited from an adb shell.  Running the command
'bmgr run' will cause the Backup Manager to kick off any pending backup
operations immediately.
2009-06-24 18:45:56 -07:00
Dan Egnor
efe52647f6 Modify the IBackupTransport API to support bulk restore operations.
Change the BackupManagerService and LocalTransport to support the new API.
2009-06-24 16:49:44 -07:00
Christopher Tate
5cbbf5652a Pass the originating app's versionCode along with a restore set
This change amends the doRestore() / onRestore() interface to backup agents to
provide the integer android:versionCode of the app that stored the backup set.
This should help agents figure out how to handle whatever historical data set
they're handed at restore time.
2009-06-22 16:44:51 -07:00
Christopher Tate
3a31a93b8a Add some global metadata to the restore set
In addition to the signatures of each participating application, we now also
store the versionCode of each backed-up package, plus the OS version running on
the device that contributed the backup set.  We also refuse to process a backup
from a later OS revision to an earlier one, or from a later app version to an
earlier.

LocalTransport has been modified as well to be more resilient to changes in the
system's use of metadata pseudopackages.
2009-06-22 15:14:04 -07:00
Joe Onorato
06290a4bb9 Helper API cleanup. Allows multiple helpers to function,
because they'll always go in the same order, and this lets
us not have to write headers to keep them paired.
2009-06-22 13:02:24 -07:00
Christopher Tate
6aa41f4c57 Add app version to the backup metadata
We now record the version number of the app (drawn from its manifest versionCode
attribute) along with its signatures.  At restore time, we compare the version
associated with the restore set with the version present on the device.  If the
restore set is from a newer version of the app than is present on device, we do
not perform the restore operation.

Also fix the pending-backup iteration in 'dumpsys backup'.
2009-06-19 15:24:51 -07:00
Christopher Tate
20efdf6b56 Make signature checks on restore work with unsigned apps 2009-06-18 19:42:24 -07:00
Joe Onorato
5d605dc56b backup stuff 2009-06-18 18:41:11 -07:00
Christopher Tate
abce4e8714 Use signatures on restore
On restore now, the backup manager gets the signature blocks corresponding to
the restore set from the transport.  It then validates those signatures against
the on-device app signatures, and refuses to restore data to an app whose
on-device sig block does not match the backup image's.

Also actually implement 'bmgr transport N' so that we can select the local
transport easily during runtime.
2009-06-18 18:38:02 -07:00
Christopher Tate
6785dd8420 Store the app signatures as part of the backup set
Under a pseudo-app for the Package Manager, we store the app signatures for all
participating applications installed on the device.  At restore time we will
restore this first, then ensure that the current on-device signature chain is
compatible with the one in the backup set.  If there's a mismatch, this may be a
spoof attempt and we will refuse to restore that app's data.

The restore side of this is not implemented, but the Package Manager agent is
here as well as the backup side theoretically pushing the data now.
2009-06-18 15:58:25 -07:00
Dan Egnor
87a02bcf68 Replace the stub GoogleTransport with callout to the
GoogleTransportService (which lives in vendor/google).
Use the Google transport by default.
Also, fix a bug: Thread.run() != Thread.start()
2009-06-17 18:23:05 -07:00
Christopher Tate
aa088447ba Hold the current transport instantiated all the time.
We no longer instantiate the transport just for the duration of handling a
backup or restore operation.  Instead, we hold the object forever (replacing it
if instructed to do so).  This makes it easier for transports to watch system
state and help set backup timing policy.

Also fixes up the IBackupTransport documentation a bit.
2009-06-16 18:25:46 -07:00
Christopher Tate
63d2700036 Allow privileged callers to schedule a backup pass for any app. 2009-06-16 17:18:05 -07:00
Christopher Tate
f68eb500f9 More bmgr work; fix clear-data signalling
The 'list sets' and 'restore token#' commands from bmgr now do what they are
supposed to.  At this point we see the restore target's data being cleared
properly and its agent being launched and invoked for restore.
2009-06-16 13:58:17 -07:00
Christopher Tate
ace7f094bf Sketch out a 'bmgr' command line tool
Not finished, but eventually will allow adb shell access to the Backup Manager
for testing purposes etc.
2009-06-15 18:07:25 -07:00
Christopher Tate
cde87f45e0 Journal backup requests so that they won't be lost in a crash
When an application requests a backup via dataChanged(), we now journal that
fact on disk.  The journal persists and is only removed following a successful
backup pass.  When the backup manager is started at boot time, it looks for any
existing journal files and schedules a backup for the apps listed in them, on
the expectation that the device shut down or crashed before a backup could be
performed.
2009-06-12 13:57:39 -07:00
Christopher Tate
9bbc21a773 Flesh out restore interface on manager; work up most of LocalTransport 2009-06-10 20:38:54 -07:00
Christopher Tate
c7b31e3c3c The rest of the basic flow for restore
Also moved the processOneBackup() implementation into the Thread class that runs
the backup sequence.
2009-06-10 16:43:50 -07:00
Christopher Tate
df01deaacf More restore plumbing, plus add suggested-backoff to transport API
Adds most of the code for a background-thread restore process, structured much
like the backup thread.  Broke some common functionality out into a helper
function for doing a synchronous wait for a requested agent to attach.

Added a method to IBackupTransport whereby the transport will be asked for
an opinion on whether this is a good time for a backup to happen.  It will
reply with the results of its policymaking around backoff intervals, time-of-day
selection, etc.
2009-06-10 10:53:24 -07:00
Christopher Tate
9b3905c4a2 Revamp IRestoreSession a bit
We now supply an array of RestoreSet objects instead of wacky Bundle
shenanigans.  Also, pushed beginRestoreSession() out to the BackupManager
concrete interface class so that SetupWizard can use it.

(beginRestoreSession() is @hide, non-privileged apps cannot use it.  It's
also guarded by android.permission.BACKUP enforcement.)
2009-06-08 16:01:24 -07:00
Christopher Tate
8c850b792f Add IRestoreSession interface for the restore flow
Restore is a fairly complicated, somewhat stateful process, so we introduce
a new interface to encapsulate the various bits and pieces into a nicely
separable component.  In particular, this will make it much cleaner to
open and interrogate an expensive-to-construct transport and then reuse it
for the actual restore process itself.
2009-06-07 19:33:20 -07:00
Christopher Tate
7b88128e08 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.
2009-06-07 13:55:42 -07:00
Christopher Tate
cd4ff2e72d Fix tracking of backup participants across package remove/update 2009-06-05 14:03:25 -07:00
Christopher Tate
1885b37913 Fix backup agent unbind
The handwritten binder transaction passing wasn't propagating the agent-destroy
transaction to the client side.  Oops.

Also, remove obsolete run-one-agent code from the backup manager service.
2009-06-04 15:02:37 -07:00
Christopher Tate
043dadc751 More backup work
* Put in some permission enforcement around agent connection notification
  and full-backup scheduling.
* Full backup now applies to any package, not just backup participants who
  have declared their own android:backupAgent
* The process of running the backup operation on the set of apps who have
  been queued for it is now done in a separate thread, with a notification
  mechanism from the main Backup Manager service to pass along new-agent
  binding knowledge.  There's no longer one do-backup message on the primary
  Handler per target application.
* The new backup thread sets up the desired transport now and passes
  along the newly backed-up data to it for each backup target.  Two
  transports have been defined so far, GoogleTransport and AdbTransport;
  both are stubs at present.

Note that at present the backup data output file seems to be properly
created, but after doBackup() is called on the test app's agent it's
still zero size.
2009-06-03 20:42:15 -07:00
Christopher Tate
181fafaf48 Retool the backup process to use a new 'BackupAgent' class
Backups will be handled by launching the application in a special
mode under which no activities or services will be started, only
the BackupAgent subclass named in the app's android:backupAgent
manifest property.  This takes the place of the BackupService class
used earlier during development.

In the cases of *full* backup or restore, an application that does
not supply its own BackupAgent will be launched in a restricted
manner; in particular, it will be using the default Application
class rather than any manifest-declared one.  This ensures that the
app is not running any code that may try to manipulate its data
while the backup system reads/writes its data set.
2009-05-31 13:10:03 -07:00
Joe Onorato
d2110dbce0 Hook up the backup data writer, and add a utility to read the backup data files. 2009-05-20 11:24:20 -07:00
Joe Onorato
290bb011c5 Get the backup calling through to the file backup helper.
This includes some cleanup to make the parameters match
between BackupService.onBackup and FileBackupHelper.performBackup.
2009-05-14 09:39:32 -04:00
Joe Onorato
8ad028117d With this, the BackupService onBackup method is called.
It took a bunch of refactoring inside BackupManagerService,
which is unfortunately all temporary anyway, but it unblocks
a bunch of stuff.
2009-05-13 01:41:44 -04:00
Joe Onorato
b1a7ffef3a More backup tests 2009-05-07 15:32:48 -07:00
Christopher Tate
3799bc241b Track install/removal/update of packages that provide backup services 2009-05-06 16:13:56 -07:00
Christopher Tate
b1d790b63e Pass null as savedState to indicate a full backup is required 2009-05-06 12:38:21 -07:00
Christopher Tate
4675812386 Add a Backup Manager interface to request a full backup
Given a package name, the Backup Manager schedules a *full* (i.e. non-
incremental) backup pass for that package.  Also added the state-file
handling for distinguishing to the target between the full and incremental
backup requests.
2009-05-06 11:24:27 -07:00
Christopher Tate
f417247fa6 Further development of backup file handling
Put backup data in flight into /cache
    Close the files and delete the intermediates after backup pass
2009-05-05 15:50:03 -07:00
Christopher Tate
22b8787ed4 Squashed commit of the following:
Author: Christopher Tate <ctate@google.com>
Date:   Mon May 4 16:38:11 2009 -0700

    IBackupService now passes ParcelFileDescriptors rather than int fds

    The outlines of backup state file / data file handling are now in place as well
    in the BackupManagerService.

Author: Christopher Tate <ctate@google.com>
Date:   Thu Apr 30 12:40:19 2009 -0700

    Hide the backup stuff for now

    Also adjust based on comments:
    + changed service intent string to conform to usage guidelines
    + only publish the IBackupService binder when invoked with the right
      intent action
    + docs tweaks
2009-05-04 20:19:21 -07:00