具体实施方式
下面结合附图1~6,详细说明本发明的具体实施方式。
在以下实施例中,仅以常见的应用安卓(Android)操作***的智能设备上的AndroidPackage(apk)格式的应用软件安装包(以下简称“apk”)为例,来说明本发明中的应用软件安装包差分存储方法与***。在其他的智能设备操作***下的应用软件安装包差分存储方法与此类似,不做赘述。
请参考图1,在本实施方式中,应用软件安装包差分存储***100包括写入服务器(WriteServer)101,元信息服务器(MetaServer)102,数据服务器(DataServer)103,读取服务器(ReadServer)104以及差分处理引擎(DiffEngine)105。
写入服务器101用于接收应用软件元信息和apk文件,并将应用软件元信息提交给元信息服务器102来申请分配全局唯一的文件名字和存储空间。具体的,写入服务器101将接收到应用软件元信息暂存在内存中,然后将应用软件元信息提交给元信息服务器102,并对接收的apk文件的做签名校验。
元信息服务器102根据请求中的应用软件元信息给apk文件分配文件名字以及分配存储空间。元信息服务器102还用于存储该应用软件的元信息。
写入服务器101根据元信息服务器102分配的文件名字以及存储空间,将apk文件存入对应的数据服务器103。
差分处理引擎105用于读取元信息服务器102中存储应用软件的元信息,判断该apk文件是否需要做压缩处理,对需要做压缩处理的apk文件做差分处理,生成补丁(patch)差分包(以下简称“patch差分包”),并将patch差分包存入数据服务器103,删除原apk文件。差分处理引擎105还将patch差分包在数据服务器103中的存储地址提交至元信息服务器102,用于在元信息服务器102中更新差分处理后的patch差分包相应的文件名字与存储地址的新的映射关系。
数据服务器103用于存储apk文件和patch差分包文件。
读取服务器104用于响应用户或者客户端的读取请求,若请求读取的资源文件为apk文件,直接从数据服务器103中读取apk文件并返回给客户端或者用户;若请求读取的资源文件为patch差分包文件,则对patch差分包文件进行还原后,返回还原后的apk文件给客户端或者用户。
请一并结合图2,为本发明一实施方式中的应用软件安装包差分处理方法步骤流程图,根据具体的情况,该流程图步骤的顺序可以改变,某些步骤可以省略。以同一应用软件的不同版本的apk文件:apk1,apk2为例,apk1为基础apk文件,apk2为待压缩处理的apk文件。其中,基础的apk文件,为待压缩apk文件计算差分包所依赖的基础包文件。该差分处理方法包括:
步骤S10,解析基础的apk文件apk1,生成第一文件集files1。具体的,apk文件是zip文件格式,zip文件由三个部分组成,分别是压缩源文件数据区、压缩文件目录区、压缩源文件目录结束标志,其中压缩源文件数据区和压缩源文件目录区分别存储的是apk文件的文件内容和目录。在本实施方式中,对apk1文件进行解析,按顺序提取其中各文件内容和目录,并记录相应数据在apk1文件中的偏移量(offset)、文件大小(size)、文件名或目录名(path)、数据的签名(sign)、数据类型(type)。将apk1包文件解析后,生成的第一文件集files1如下:
files1[0]={offset:0,size:100,path:path001,sign:sign001,type:0}
files1[1]={offset:100,size:200,path:path002,sign:sign002,type:0}
files1[2]={offset:300,size:300,path:path003,sign:sign003,type:0}
files1[3]={offset:600,size:200,path:path004,sign:sign004,type:0}
files1[4]={offset:800,size:100,path:path005,sign:sign005,type:0}
files1[5]={offset:900,size:300,path:path006,sign:sign006,type:0}
files1[6]={offset:1200,size:400,path:path007,sign:sign007,type:0}
files1[7]={offset:1600,size:500,path:path008,sign:sign008,type:0}
files1[8]={offset:2100,size:900,path:path009,sign:sign009,type:0}
步骤S20,解析待压缩的apk文件apk2,生成第二文件集files2。对apk2的解析方法与步骤S1中对apk1的解析方法相同,仅仅是针对处理的数据源不同而已,在此不再赘述。将apk2包文件解析后生成的第二文件集files2如下:
files2[0]={offset:0,size:100,path:path001,sign:sign001,type:0}
files2[1]={offset:100,size:300,path:path010,sign:sign010,type:0}
files2[2]={offset:400,size:300,path:path003,sign:sign003,type:0}
files2[3]={offset:700,size:500,path:path008,sign:sign008,type:0}
files2[4]={offset:1200,size:900,path:path009,sign:sign009,type:0}
步骤S30,对比files1和files2中的记录,生成patch差分包文件。
在本实施方式中,步骤S3包括:
子步骤S301,选取最优的共性文件列表。具体的,可以是选取出的文件列表所包含的文件内容的总长度是最大的,以最大限度的减少写入差分包文件patch的大小,在本实施方式中,所选出的最优共性文件列表如下:
sames[‘0’]={base_offset:0,size:100}
sames[‘2’]={base_offset:300,size:300}
sames[‘3’]={base_offset:1600,size:500}
sames[‘4’]={base_offset:2100,size:900}
子步骤S302,将指令和数据写入patch差分包文件。对在共性文件列表中的数据写入指令,指示从apk1的某位置offset开始复制长度size的数据,不在共性文件列表中的数据,写入一条带数据的指令,并apk2中的数据拷贝至指令之后。具体的,流程如下:
for i=0 to m=files2集合大小;
if i exists in sames共性文件集合;then
将数据在files1中的offset和size,以指令的方式写入patch;
else
首先向patch写入一条指令,表明接下来从patch中拷贝指定长度的数据;
其次从apk2中的files2[i][‘offset’]位置开始拷贝files2[i][‘size’]大小的数据至patch文件中;
fi
输出到patch文件中指令和数据如下:
patch[0]={command_type:0,offset:0,size:100}
patch[1]={command_type:1,size:300,data:300字节数据}
patch[2]={command_type:0,offset:300,size:300}
patch[3]={command_type:0,offset:1600,size:500}
patch[4]={command_type:0,offset:2100,size:900}
请一并结合图3,为本发明一实施方式中的应用软件安装包还原方法步骤流程图,根据具体的情况,该流程图步骤的顺序可以改变,某些步骤可以省略。以同一应用软件的不同版本的apk文件:apk1,apk2为例,apk1为基础apk文件,patch差分包为apk2差分压缩处理后的文件。其中,基础的apk文件,为待压缩apk文件计算差分包所依赖的基础包文件。该应用软件安装包还原方法包括:
步骤S11,读取patch差分包文件。
步骤S21,读取基础的apk文件apk1。
步骤S31,根据patch差分包文件的指令合并生成压缩前的apk文件apk2。具体的文件还原流程如下:
for i=0 to m=patch集合大小;
if patch[i][‘command_type’]==0;then
从apk1文件的位置patch[i][‘offset’]读取大小patch[i][‘size’]的数据;
else
从patch当前位置开始读取大小patch[i][‘size’]的数据;
fi
请一并参考图4,为本发明一实施方式中的应用软件安装包差分存储***中的文件写入方法的步骤流程图,根据具体的情况,该流程图步骤的顺序可以改变,某些步骤可以省略。该应用软件安装包差分存储***的文件写入方法步骤流程包括:
步骤S12,接收应用软件元信息和apk文件。具体的,写入服务器101接收应用软件元信息和apk文件,写入服务器101将接收到应用软件元信息暂存在内存中,然后将应用软件元信息提交给元信息服务器102,并对接收的apk文件的做签名校验。
步骤S22,申请分配全局唯一的文件名字和存储空间。具体的,将应用软件元信息提交给元信息服务器102,申请分配全局唯一的文件名字和存储空间。
步骤S32,根据分配的存储空间存储安装包文件。具体的,写入服务器101根据元信息服务器102分配的文件名字以及存储空间将apk文件存入该分配的数据服务器103,数据服务器103将存储地址返回至元信息服务器102。
步骤S42,存储所述存储地址,应用软件元信息及其映射关系。其中,应用元信息包括:应用名称、包名称、开发者签名、版本号、版本名称等。元信息服务器102存储数据服务器103所返回的存储地址,写入服务器101所提交的应用软件元信息及其映射关系。
步骤S52,反馈所述分配的文件名字。
请一并参考图5,为本发明一实施方式中的应用软件安装包差分存储***中的安装包差分处理方法的步骤流程图,根据具体的情况,该流程图步骤的顺序可以改变,某些步骤可以省略。以同一应用软件的不同版本的apk文件:apk1,apk2为例,apk1为基础apk文件,apk2为待压缩处理的apk文件,patch差分包为apk2差分压缩处理后的文件。该应用软件安装包差分存储***的文件写入方法步骤流程包括:
步骤S13,判断写入的apk文件是否为待压缩apk文件,若否,结束;若是,则进入步骤S23。具体的,在图4中应用软件安装包差分存储***中的文件写入流程执行完成后,apk文件被全量存入数据服务器103中,若数据服务器103存储有与该apk文件对应的应用软件版本号相同的其他apk文件,或者预定时间段内有其他版本的该应用软件apk文件存入,则判断该apk文件为待压缩apk文件包;若数据服务器103没有存储与该apk文件对应的应用软件版本号相同的其他apk文件,或者预定时间段内没有其他版本的该应用软件apk文件存入,则判断该apk文件新的apk文件包。考虑预定时间段内有其他版本的该应用软件apk文件存入的原因,主要是因为相差时间太久发布的版本之间的相同文件大大减少,该预定时间段,可以是查看近一个月,三个月或者半年内同款应用是否有应用存入。
步骤S23,获取待压缩apk文件依赖的基础apk文件。所述基础apk文件为该待压缩apk文件对应的相同的版本号的其他apk文件,或者预定时间段内有其他版本的该应用软件apk文件。
步骤S33,对待压缩apk文件进行差分处理,生成patch差分包,并存储所述patch差分包。具体的,差分处理引擎105对需要做压缩处理的apk文件做差分处理,该差分处理步骤与图2中的apk差分处理方法相同,在此不再赘述。差分处理引擎105对需要做压缩处理的apk文件做差分处理生成补丁patch差分包后,将patch差分包存入数据服务器103,差分处理引擎105还将patch差分包存入数据服务器103的存储地址提交至元信息服务器102。
步骤S43,更新差分处理后的patch差分包相应的文件名字与存储地址的新的映射关系。差分处理引擎105将patch差分包存入数据服务器103的存储地址提交至元信息服务器102,用于在元信息服务器102中更新差分处理后的patch差分包相应的文件名字与存储地址的新的映射关系,同时删除原apk文件,释放原来全量存储所占用的空间。
请一并参考图6,在本实施方式中,应用软件安装包差分存储***还包括安装包的读取方法,图6为本发明一实施方式中的安装包读取方法包括步骤流程图,根据具体的情况,该流程图步骤的顺序可以改变,某些步骤可以省略。以同一应用软件的不同版本的apk文件:apk1,apk2为例,apk1为基础apk文件,apk2为待压缩处理的apk文件,patch差分包为apk2差分压缩处理后的文件。该应用软件安装包差分存储***的安装包读取方法步骤流程包括:
步骤S14,根据用户的读取请求,判断读取的资源文件为apk文件还是patch差分包文件。
步骤S24,若读取的资源文件为apk文件,读取apk文件并返回给客户端或者用户。
步骤S34,若读取的资源文件是patch差分包文件,对patch差分包文件进行还原后,返回还原后的apk文件给客户端或者用户。具体的,读取服务器104对patch差分包文件进行还原处理,还原处理步骤与图3中的apk还原方法相同,在此不再赘述。
在本发明的上述实施方式中,利用同一款应用软件之间的共性部分比较大,应用厂商在发布的同一批次带有不同渠道号的apk文件虽然二进制内容是不一致的,但是apk文件内不一致的数据仅仅是很少的几个,采用差分存储的方案,存储多份apk文件相比存储一份apk所增加的存储空间基本可以忽略不计。因此,相比于常规的全量存储,采用差分存储的方案,在存储时仅保留差异的资源文件,减少了存储开销,并且因为文件还原采用顺序的合并方式,整个合并过程基本不增加任何运算开销,能基本保持与原来全量存储时的读取效率。
本技术领域的普通技术人员应当认识到,以上的实施方式仅是用来说明本发明,而并非用作为对本发明的限定,只要在本发明的实质精神范围之内,对以上实施例所作的适当改变和变化都落在本发明要求保护的范围之内。