chadeltu 2011-07-29
引言
随着3G时代的到来,移动互联网的发展,手机的功能越来越强大,手机里的数据对每个用户来说都非常的重要,特别是通讯录、日程、短信息、邮件等数据,一旦手机丢失、误删或其他意外使得数据无法正常使用,会给用户带来麻烦,数据备份与恢复这个应用可以帮助用户解决这个问题。
本文主要论述了基于Android平台所提供的开发框架和应用组件,并给出了一种数据备份恢复的设计与实现。
回页首
背景知识介绍
当前流行的智能手机操作系统有WindowsMobile,Symbian,iPhoneOS,Android等。本文基于目前最热门的Android系统平台,该平台具有开源、易用、开发方便、与个人电脑有较强的融合性等众多优势。
Android架构
图1.Android架构图
Application:
Android会与一个核心应用程序包一起发布,如通讯录、短信息、浏览器等,所有的应用使用Java语言所开发。
ApplicationFramework:
Android应用程序框架对于开发者也完全可以访问核心应用程序所使用的API框架。该应用程序架构用来简化组件软件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块。该应用程序重用机制使得组建可以被用户替换。
Libraries:
Android程序库包括一个被Android系统中各种不同组件所使用的C/C++库集。该库通过Android应用程序框架为开发者提供服务。
LinuxKernel:
内核Android的核心系统服务依赖于Linux2.6内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。Linux内核也同时作为硬件和软件堆栈之间的硬件抽象层。
回页首
备份恢复的设计与实现
备份的方式有本地备份、网络备份,本地备份是直接将数据备份到SDcard存储介质中;网络备份是将数据备份到网络服务器中。网络服务器系统是基于J2EE架构,通过HTTP(HTTPS)协议对终端提供服务,备份的应用的数目可以大于等于1,这里只备份通讯录。系统体系结构图如下所示:
图2.数据备份与恢复体系结构图
本地备份恢复
本地备份恢复客户端的流程
用户选择本地Backup或Restore,通过向Contacts发送广播信号,如果Contacts准确收到广播信号后,开始执行Backup或Restore操作,完成后反馈操作结果。流程图如下所示:
图3.本地备份恢复流程图
本地备份恢复客户端的序列图:
在序列图中,客户端选择本地备份或本地恢复后,发送广播消息通知Contacts应用开始备份或恢复(ContactsReceiver根据信号类别:执行备份或恢复操作),通过FileInputStream和FileOutputStream对数据库文件进行read/write。
如果是本地备份则将自身的数据库文件写到SDCard;如果是本地恢复将SDCard中对应的文件写到Contacts应用对应的路径下,用以覆盖原始数据库文件。
用Environment.getExternalStorageDirectory()方法获取SD卡的路径,卡存储空间大小及已占用空间获取方法:
/*获取存储卡路径*/FilesdcardDir=Environment.getExternalStorageDirectory();/*StatFs看文件系统空间使用情况*/StatFsstatFs=newStatFs(sdcardDir.getPath());/*Block的size*/LongblockSize=statFs.getBlockSize();/*总Block数量*/LongtotalBlocks=statFs.getBlockCount();/*已使用的Block数量*/LongavailableBlocks=statFs.getAvailableBlocks();
序列图如下所示:
图4.本地备份恢复序列图
本地备份恢复客户端的实现:
如下图给出了BackupRestoreActivity和ContactsReceiver的类图,以及他们工作机制中涉及到的类的结构。
图5.本地备份恢复类图
•Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦.
•此处的IntentFilter起动态注册action,使之用于接收同action的广播消息IntentFiltercommandFilter=newIntentFilter();commandFilter.addAction("signal");registerReceiver(BroadcastReceiver,commandFilter);BroadcastReceiver用来接收和响应广播消息
•Handler主要接受子线程发送的数据,并用此数据配合主线程更新UI.
•ContactsReceiver调用Thread开启一个线程,用以接收由BackupRestoreActivity发出的备份/恢复信号。
•NetToolHandler(用于网络备份恢复)定义了一些用来和服务器进行交互的方法;IHttpResponse是在NetToolHandler中定义的一个内部接口,主要用来回调NetToolHandler中返回的信息,根据返回的信息进行下一步操作。
用户选择本地备份或者本地恢复,ContactsReceiver则收到广播消息后,根据信号判断操作的类别是备份还是恢复,然后启动一个线程,在线程中调用Handler,通过Handler去处理读写数据。
网络备份恢复
服务器端设计与实现
网络备份通过WiFi或者GPRS在手机端与服务器进行连接,服务器提供相应的接口,用于上传或下载文件。
服务器端用例分析
1)备份数据上传:响应客户端的backup功能。文件通过HTTP请求提交到服务器,服务器接收文件并保存,序列图表示如下:
图6.网络备份恢复上传序列图
说明:如果Servlet检查到输入参数不合法,会中断服务并通知客户端。
接口定义:
URL:https://<server>:<port>/upload?uuid=<上传文件的uuid>&name=<真实文件名>&md5=8b1a9fbf5e111296a827abf8c47804d7&offset=<偏移量>&desc=<文件描述信息>&size=<文件大小>&deviceid=<终端的id>,HTTP正文为上传的内容
表1.备份数据上传参数表
提交项关键字作用格式
uuiduuid方便上载失败后断点续传,客户端生成
文件名name上传文件名
MD5校验码md5用于对上载文件作完整性校验。16进制格式,共32位长
偏移量offset断点续传的偏移量。长整数,最小为0,最大为文件字节数。
文件描述信息desc除用户名外的文件描述。不能大于256个字符,否则抛出400错误
文件大小size用于断点续传功能建立文件时使用。长整数
设备iddeviceid用于一个用户多个设备进行网络备份恢复的依据
必须使用POST方式提交,且只允许上传一个文件
offset:客户端应从offset(包含offset)开始上传文件。offset=0时,忽略offset参数。
如果是续传文件,应先用uploadquery接口查询文件已上传部分的大小,以获取offset的值
表2.备份数据上传返回值
成功
HTTP头HTTPBody
200空
失败(包含公共错误)
HTTP头错误码HTTPBody(Xml格式的错误消息)
CodeMessage
400MSG-1001文件上传失败
2)备份数据下载:响应客户端的网络恢复功能。根据文件名将用户请求的文件传递给客户端。序列图表示如下:
图7.网络备份恢复下载序列图
流程描述如下:
•客户端向服务器发送requestDownload请求,请求中包含文件的uuid和断点续传的起始点。
•Servlet调用downloadSavedFile接口,传递文件uuid和range参数。
•数据库存取返回自range开始的字节流,字节流返回给前面的servlet。
接口定义:
URL:https://<server>:<port>/fileDownload?uuid=<文件标识>&range=<偏移量>&deviceid=<终端的id>
参数含义同备份数据上传;客户端应从range(包含range)开始下载,range=0时,忽略range参数。
表3.备份数据下载返回值:
成功
HTTP头HTTPBody
200/201要下载的文件流,新下载返回的是200否则返回201
失败
HTTP头错误码HTTPBody(Xml格式的错误消息)
CodeMessage
400MSG-1002无法下载
3)新建手机备份存储空间:当客户端第一次访问备份服务器时,系统会返回找不到个人网络备份存储空间错误,客户端软件提示用户是否新建备份空间,用户确认建立个人网络备份空间,系统才会为其建立存储空间。服务器会用deviceid为标识为对应的手机的分配固定大小的空间。服务器端使用adapter模式来连接多种不同文件存储媒体。序列图表示如下:
图8.网络备份恢复创建存储空间序列图
接口定义:
URL:https://<server>:<port>/createspace?deviceid=<终端的id>
参数含义同备份数据上传。
表4.创建存储空间返回值:
成功
HTTP头HTTPBody
200空
失败
HTTP头错误码HTTPBody(Xml格式的错误消息)
CodeMessage
400MSG-1003备份空间已建立
400MSG-1004新建备份空间失败
4)查询已上传部分的大小:当文件上传中断时,可以查询已上传部分的大小,然后断点续传余下部分。序列图表示如下:
图9.网络备份恢复查询已上传部分序列图
接口定义:
URL:https://<server>:<port>/uploadquery?uuid=<上传文件的uuid>&deviceid=<终端的id>
参数含义同备份数据上传。
表5.查询文件已上传部分返回值:
成功
HTTP头HTTPBody
200正整数(文件已上传部分的大小)
失败(包含公共错误)
HTTP头错误码HTTPBody(Xml格式的错误消息)
CodeMessage
400MSG-1005文件已上传完成
服务器端的实现:
1)包文件设计如下所示:
图10.网络备份恢复包文件设计图
•com.bakrestore.server.dao下面主要存放DAO接口,DAO主要用来解偶业务方法和数据源,即在业务核心方法和具体数据源之间再增加一层,用来连接业务方法和数据源。
•com.bakrestore.server.model主要存放一些持久化类
•com.bakrestore.server.service主要存放业务逻辑类
•com.bakrestore.server.web主要用来存放接口类,用来响应手机终端。
在spring的配置文件:applicationContext.xml中,该文件中定义了Spring要管理的所有的Beans,用Beans的形式来管理所有的对象以及他们之间的赋值依赖的。在此配置文件中主要定义了dao,model,service下面的类。示例代码如下:
清单1.spring的配置文件
<beanid="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><propertyname="configLocation"value="classpath:com/bakrestore/server/dao/ibatis/sql/sql-map-config.xml"/><propertyname="dataSource"ref="dataSource"/><propertyname="lobHandler"ref="lobHandler"/></bean><beanid="userSpaceDAO"class="com.bakrestore.server.dao.ibatis.UserSpaceDAOImpl"><propertyname="sqlMapClient"ref="sqlMapClient"/></bean><beanid="userFileDAO"class="com.bakrestore.server.dao.ibatis.UserFileDAOImpl"><propertyname="sqlMapClient"ref="sqlMapClient"/></bean><beanid="adddbdao"class="com.bakrestore.server.dao.ibatis.AddDbDAOImpl"><propertyname="sqlMapClient"ref="sqlMapClient"/></bean><beanid="addDbService"class="com.bakrestore.server.service.impl.AddDbServiceImpl"><propertyname="adddbdao"ref="adddbdao"/><propertyname="fileContentService"ref="fileContentService"/></bean><beanid="fileService"class="com.bakrestore.server.service.impl.FileServiceImpl"><propertyname="userSpaceDAO"ref="userSpaceDAO"/><propertyname="userFileDAO"ref="userFileDAO"/><propertyname="fileContentService"ref="fileContentService"/></bean><beanid="spaceService"class="com.bakrestore.server.service.impl.SpaceServiceImpl"><propertyname="userSpaceDAO"ref="userSpaceDAO"/><propertyname="fileContentService"ref="fileContentService"/><propertyname="spaceMaxSize"value="${UserSpaceMaxSize}"/></bean>
在SpringDispatcher-servlet.xml配置一个视图解析器,其次将手机端的请求与相应的进行映射.以便程序在执行过程中可以依据映射找到所需Controller,相应的Controller与applicationContext.xml所定义的beans进行交互。示例代码如下:
清单2.配置一个视图解析器
<beanid="createspace"name="/createspace"parent="pim"class="com.bakrestore.server.web.CreateSpaceController"></bean><beanid="download"name="/download"parent="pim"class="com.bakrestore.server.web.DownloadController"></bean><beanid="uploadquery"name="/uploadquery"parent="pim"class="com.bakrestore.server.web.UploadQueryController"></bean><beanid="upload"name="/upload"parent="pim"class="com.bakrestore.server.web.UploadController"><propertyname="sizeMax"value="${UploadFileSizeMax}"/><propertyname="uploadFileTempFolder"value="${UploadFileTempFolder}"/></bean>
2)持久化类设计如下所示:
在com.bakrestore.server.model文件夹中包含FileNode,FolderNode,UserFile,DatabaseFileContent,FileSystemFileContent,UserFileContent,UserSpace的一些类,他们的作用是:
•DatabaseFileContent:用数据库存储文件内容的文件内容实体类
•FileSystemFileContent:用文件系统的保存文件内容实体类
•FileNode:文件结点,与FolderNode一起构成了文件目录树
•FolderNode:目录节点
•UserFile:用户文件或文件夹实体类
•UserFileContent:用户文件内容实体类,抽象类
•UserSpace:用户备份空间实体类
类图以及他们工作机制如下所示:
图11.网络备份恢复持久化类设计图
3)应用类:
应用类主要用来响应手机发出的HTTP请求信号,在com.bakrestore.server.web文件夹主要包含CreateSpaceController,DownloadController,ErrorCode,BaseController,RequestParamater,UploadController,UploadQueryController等一些控制器,他们的作用分别是:
•CreateSpaceController:创建用户空间
•DownloadController:用以文件下载
•ErrorCode:错误消息封装类
•BaseController:备份恢复系统中Controller的公共类,定义了通用的变量和方法
•RequestParamater:参数解析类
•UploadController:文件上传服务类
•UploadQueryController:查询已上传文件部分的大小
以下是他们之间的工作机制:
图12.网络备份恢复应用类设计图
4)DAO类
在dao文件夹包含PbsDataAccessException,UserFileContentDAO,UserFileDAO,
UserSpaceDAO四个interface,他们的作用分别是:
•PbsDataAccessException:数据库操作异常,所有对数据库的操作都要抛出此异常
•UserFileContentDAO:对文件内容存取的DAO接口
•UserFileDAO:对文件信息存取的DAO接口
•UserSpaceDAO:对备份空间信息存取的DAO接口
以下是他们之间的工作机制:
图13.网络备份恢复DAO类设计图
5)业务逻辑类
在service文件夹包含FileContentService,FileService,SpaceService三个interface,他们的作用分别是:
•FileContentService:对文件内容进行操作的接口
•FileService:对文件进行操作维护的接口
•SpaceService:对手机备份空间进行维护的接口
以下是他们之间的工作机制:
图14.网络备份恢复业务逻辑类设计图
6)数据库层设计
数据库层设计及相互关系表示如下:
图15.数据库关系图
表6.用户存储空间表UserSpace
字段名类型描述备注
idInteger存储空间ID主键,系统生成
userIDInteger用户IDFK(逻辑外键)
deviceIDVarchar(16)设备idFK
rootPathVarchar(256)根文件夹仅当文件存储在文件系统时有效
spaceTypeChar(1)类型0-设备备份空间,1-普通备份空间
maxSizeInteger最大空间大小
usedSizeInteger已使用空间大小
directionStructLONGTEXT目录结构xml
directionStructMD5Char(32)目录结构xml的MD5验证码
createSystemTimeDateTime创建时间系统生成
表7.用户上传的文件表UserFile
字段名类型描述备注
idVarchar(32)文件ID主键,系统生成
userSpaceIDInteger存储空间IDFK,用户存储空间表的主键
fileNameVarchar(128)文件名
createSystemTimeDateTime创建时间系统生成
modifySystemTimeDateTime修改时间
fileTypeChar(1)类型0-文件夹1-文件
MD5Char(32)Md5验证码fileType=1时有效
fileSizeInteger文件大小fileType=1时有效
storageNameVarchar(128)文件在磁盘上的名称
fileDescVarchar(512)文件描述
uploadStateChar(1)上传状态0:未完成1:已完成
fileType=1时有效
uploadedSizeInteger已上传部分大小fileType=1时有效
ContentMEDIUMBLOB文件内容fileType=1时有效
网络备份与恢复客户端设计与实现
1)网络备份恢复客户端的流程
网络备份恢复客户端流程图与图3类似,所不同的是用户选择网络Backup或Restore,让后向Contacts发送广播信号,如果Contacts准确收到广播信号后,开始执行Backup或Restore操作,完成后反馈操作结果。
2)网络备份恢复客户端的序列图:
在序列图中,客户端选择网络备份或恢复后,发送广播消息通知Contacts应用开始备份或恢复(ContactsReceiver根据信号类别:备份/恢复进行操作),如果是网络备份则将自身的数据库文件上传到网络备份服务器;如果是网络恢复将网络服务器中用户对应的文件写到Contacts应用对应的路径下,用以覆盖原始数据库文件。
图16.网络备份恢复客户端时序图
3)网络备份与恢复客户端的实现
网络备份与恢复客户端的实现部分见图5。用户选择网络备份或网络恢复,ContactsReceiver则收到广播消息后,根据信号判断操作的类别是备份还是恢复,然后启动一个线程,在线程中调用Handler,在Handler调用服务端接口,操作完成后根据返回的HTTP头信息,如果等于200提示用户操作成功;如果大于200,根据Code中的MSG转态码(见表2,3,4,5)提示相应的失败信息。
回页首
总结与展望
数据备份恢复的设计与实现,详细讲解了一种备份恢复通讯录中数据库文件的方法,存储方式有两种,一种是直接存储在本地,另一种是通过与服务器的交互,存储在网络服务器中;备份到SDcard或网络服务器中的通讯录文件,由于每次备份时都会自动创建一个以日期时间命名的文件夹,所以可以备份n次而不会覆盖。
但是这些还不够完善。从广度来说,如果能做到随意添加需要备份的android应用;如果数据能以VCARD格式存储,以方便将数据导出到PC中;如果能管理已备份的文件,比如更改备份文件名称、删除已备份文件等。从深度来说如果能实现数据的增量备份,可以有效改善由于存储容量有限所带来的问题;如果能通过加密解密实现网络备份数据共享,从而实现不同手机之间下载数据,例如日程应用在对方允许的情况下获知对方密匙后,下载另一用户的日程,这样就可以更加方便的了解对方,那功能将会更完善。
移动互联网是一个刚刚兴起的市场,越来越多的公司和开发人员把PC时代的互联网产品引入到手持设备上来。嵌入式硬件性能的不断提升,以及软件平台的层出不穷,更是为这个新领域的发展奠定了基础。Android系统就是在这样的条件下出现的,它完全开源免费,允许生产商随意定制自己的操作系统和软件商店,搭建自己的平台,将每个公司自己的交互理念推向用户,力求用极致的用户体验来抢占市场。云计算是当下很流行的一种服务模式,该模式在移动互联网领域将会有很大的发展,因为它彻底解放了手持设备,让手持设备的资源有限、电量有限等特点不再成为阻碍其发展的短板。作者认为Android系统将会在移动互联网有比较广泛的应用。