您的位置:首页 > 运维架构 > 网站架构

Android 的Backup服务管理机制与架构分析

2014-10-08 09:51 639 查看
原文链接:http://blog.csdn.net/goohong/article/details/8026045

 Android2.2以后的备份服务功能可以允许用户备份应用数据到云存储中,即当应用执行了工厂服务或转换到一个新的平台上时,如果备份的应用需要重新安装,系统就自动恢复原先备份的数据,这个过程对用户是完全透明的。

        GOOGLE目前为Android框架系统提供了一个云存储服务BackupTransportService和一个GOOGLE IBackupTransport接口对象,不过要使用这个云存储,需要首先向该服务登记你要备份的应用,获得一个BackupService
Key,并包括在你要备份的应用的manifest工程文件中。当然你也可以实现你自己的云存储服务和一个备份IBackupTransport对象。Android框架系统也提供了一个供测试的本地IBackupTransport接口对象。

<meta-dataandroid:name="com.google.android.backup.api_key" 
           android:value="your_backup_service_key"/>

 

 

 

      

        Android4.0以后版本增加了所有应用(包括系统自带的应用)的完全备份和恢复功能。

       备份和恢复服务功能通过BackupManagerService系统服务完成,下图是备份管理服务BackupManagerService的类图。

       


      

        BackupManagerService服务主要通过六个binder接口对外提供服务或使用外部服务,其中包括两个观察对象接口,并主要包括四个类实现备份和恢复过程。

        BackupManagerService是IBackupManager.Stub的派生对象,实现应用及数据的备份和恢复过程。

        通过IbackupTransport接口通过IPC与IbackupTransport对象交互,实现备份数据的上传和下载。

        应用程序SDK客户端通过BackupManager对象向BackupManagerService服务发出应用数据备份和恢复的请求。

        BackupManager对象在发出发出备份和恢复的请求之前需要先调用checkServiceBinder函数单例化一个BackupManagerService服务的客户端代理对象,通过该对象向BackupManagerService服务发出备份或恢复请求。

        应用数据备份请求通过调用BackupManager对象的dataChanged函数发出。

         dataChanged函数先调用checkServiceBinder函数获得BackupManagerService服务客户端代理对象后,接着调用服务端的dataChanged同名函数发出备份请求。

         应用数据恢复请求通常由系统在应用安装时发现有要恢复的数据时自动触发,如PackageManagerService在应用安装成功后时发现新安装包不是一个更新且应用的工程文件包含backupAgent时自动触发。

         当然用户也可以调用BackupManager对象的requestRestore函数来发出一个恢复请求。requestRestore函数同样先调用checkServiceBinder函数获得BackupManagerService服务的一个客户端代理对象,然后调用服务端的beginRestoreSession函数实例化一个ActiveRestoreSession桩对象,并返回客户端一个IrestoreSession接口对象,并根据IrestoreSession接口实例化一个客户端RestoreSession对象,通过RestoreSession对象使用IrestoreSession接口向服务端的ActiveRestoreSession对象的函数发送恢复请求。

         应用的完全备份和恢复功能目前只能采用命令方式触发,触发时弹出一个用户确认框(一个系统实现的BackupRestoreConfirmation活动)让用户确认,只有用户确认后才能触发应用包的完全备份和恢复功能。

         备份和恢复任务的实现主要采用了模板和代理及助手设计模式。BackupManagerService服务提供了备份和恢复任务的模板,具体备份内容的提供及具体的备份恢复方法通过用户提供的BackupAgent对象提供,备份和恢复任务的模板通过钩子调用BackupAgent对象的回调函数完成具体要备份内容的备份和恢复。

         BackupManagerService中备份和恢复任务的模板通过四个类提供。应用数据的备份和恢复模板通过PerformBackupTask及PerformRestoreTask两个对象(都是BackupRestoreTask接口的实现)提供,两个对象分别包括相应的应用数据备份和恢复请求的处理函数,根据不同的请求以及当前的状态执行不同的过程。如PerformBackupTask对象和PerformRestoreTask对象都提供了一个execute函数用于执行主要的备份和恢复步骤,execute函数根据备份和恢复过程的当前状态执行不同的函数。

        备份和恢复任务都包括几个子过程。备份任务包括启动备份阶段、开始备份阶段、完成备份阶段三个阶段。

        在启动备份阶段使用PackageManagerBackupAgent对象备份所有要备份的应用包的基本信息(包的版本信息和签名信息);

        在开始备份阶段执行每一个备份请求,对于每一个备份请求首先调用应用对应的BackupAgent对象把备份数据保存到缓冲区,操作完成后通知BackupManagerService调用BackupTransport对象的performBackup函数执行实际的备份;

        在完成备份阶段完成备份的后续处理,如写RestoreToken到Token文件,为下一次备份做准备等。

        恢复任务过程包括初始阶段、下载数据阶段、恢复应用包的基本信息阶段、执行恢复请求阶段、完成阶段等五个阶段。

         PerformFullBackupTask对象及PerformFullRestoreTask对象以及两者的内部对象FullBackupRunner和RestoreFileRunnable共同提供了实现应用的完全备份和恢复的模板。四个对象都是Runnable对象,因此运行于独立的线程。FullBackupRunner和RestoreFileRunnable对象执行系统自带应用的备份和恢复任务。     

   BackupManagerService服务还包含两个观察者对象接口IFullBackupRestoreObserver和IRestoreObserve。

   IFullBackupRestoreObserver用于完全备份和恢复过程,IFullBackupRestoreObserver的实现对象FullObserver是BackupRestoreConfirmation活动的内部类,完全备份和恢复过程产生的事件通过IFullBackupRestoreObserver接口调用FullObserver的相关函数向BackupRestoreConfirmation报告备份和恢复过程的事件。

         IRestoreObserver用于单独应用的数据备份和恢复,IRestoreObserver的实现对象位于客户端的RestoreSession类中,是RestoreSession类的一个内部包装类RestoreObserverWrapper(实现RestoreObserver对象的包装),实现通知事件的异步发送。应用数据的备份和恢复产生的事件先调用RestoreObserverWrapper相关函数发给RestoreObserverWrapper,RestoreObserverWrapper的RestoreObserverWrapper相关函数通过消息发送机制把事件转发给客户端的RestoreObserver对象。

           完成应用数据的实际备份和恢复过程及实际备份内容由用户在应用程序中通过一个BackupAgent对象提供,BackupAgent对象在应用的工程文件中的application标签下用android:backupAgent属性指定具体使用的BackupAgent对象。

   <application android:label="MyApplication"
                android:backupAgent="MyBackupAgent">
   </application>

          BackupAgent类是框架提供的一个抽象类,为应用与备份管理服务通讯提供了一个统一接口,BackupAgent类内部包括一个实现IBackupAgent接口的桩对象BackupServiceBinder。BackupAgent类的每个回调函数也都包括一个IBackupManager接口参数,因此应用程序和BackupManagerService服务可以使用BackupAgent的这两种接口实现相互交互。

           BackupManagerService服务调用bindToAgentSynchronous函数借助ActivityManagerService服务实现具体BackupAgent对象与应用进程的绑定和实例化,在BackupAgent对象绑定和实例化后返回BackupAgent对象对应的IBackupAgent接口供BackupManagerService服务使用。BackupManagerService服务使用该IBackupAgent接口与BackupAgent对象通讯。

           如 BackupManagerService服务使用该接口调用BackupAgent对象提供的回调函数完成实际的备份和恢复工作(doBackup、doRestore等),在完成实际备份和恢复工作后使用 IBackupAgent接口传进来的IBackupManager接口参数调用BackupManagerService服务的opComplete函数,通知BackupManagerService本次备份和恢复工作的完成结果。

           用户采用两种方式实现一个Backup Agent:一种方式是扩展BackupAgent类,框架提供了一个BackupAgent抽象类,为应用与备份管理服务通讯提供了一个统一接口。用户可以直接扩展BackupAgent类,并覆盖onBackup()和onRestore()两个回调方法,实现对特定应用数据的备份和恢复操作。

           浏览器应用实现书签备份功能的BrowserBackupAgent对象及系统提供的实现共享目录备份功能的SharedStorageAgent就是采用这种方式。

           更通用的方式是扩展BackupAgentHelper类,BackupAgentHelper类是BackupAgent类的包装类。扩展BackupAgentHelper类可以减少需要实现的代码量, 因为BackupAgentHelper类把备份和恢复操作提交给系统已经提供的实现相应备份和恢复功能的备份助手类来完成,用户不需要自己实现onBackup()
和onRestore()。系统当前提供了如下几个备份助手类来实现某些确定类型的数据的备份和恢复。

           如备份所有Shared Preferences的SharedPreferencesBackupHelper类。备份应用数据目录中所有文件的FileBackupHelper类和AbsoluteFileBackupHelper类。实现Wallpaper备份的WallpaperBackupHelper类。

           助手类和BackupAgent类间的类图之间的关系见下图。IRestoreObserver

          


         几个助手类都实现了BackupHelper接口,实现备份助手接口功能,并都派生自FileBackupHelperBase,实现备份文件的待上传CACAH文件的基本操作(如写文件文件等)。

        BackupAgentHelper类把备份恢复操作通过BackupHelperDispatcher对象提交给相应助手类。BackupHelperDispatcher对象内部维护一个BackupHelper对象集合,因此BackupAgentHelper的派生类可以同时使用几个BackupHelper对象完成实际的备份和恢复操作。

        SystemBackupAgent和SettingsBackupAgent是BackupAgentHelper类的派生类,分别实现系统管理数据(当前仅支持系统墙面)及系统和安全设置的备份和恢复。SystemBackupAgent使用了WallpaperBackupHelper助手类来实现相应功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 备份
相关文章推荐