校验安卓安装包的方法、装置及计算机可读存储介质
文献发布时间:2023-06-19 12:27:31
技术领域
本公开涉及信息技术领域,特别涉及一种校验安卓安装包的方法、装置及计算机可读存储介质。
背景技术
随着APK(Android Package,安卓安装包)开发技术的快速发展,APK的开发门槛正在逐渐降低,这使得市面上的APK总量正在迅速增多。同时,APK迭代周期的缩短,也使得其版本更新加快。另外,由于同一个APK经常会发布在不同的渠道并被以不同的方式再分发,这导致了APK出现较多重复。而收集和分析APK则需要下载大量不同的APK。
目前,判断APK重复的方法主要为:下载APK到本地,并与本地已有APK计算的hash值或包名及签名等信息进行比对;若一致则为重复APK需要删除,否则为新APK需要保留;或者,先保存每次下载的APK的URL(Uniform Resource Locator,统一资源定位符)信息,下载新的APK之前,比对待下载APK的URL与本地的URL库是否存在重复,若重复则跳过该URL不下载新的APK,否则按照该URL下载新的APK。
发明内容
本公开解决的一个技术问题是,如何更加高效的检验目标安卓安装包与本地安卓安装包是否相同。
根据本公开实施例的一个方面,提供了一种校验安卓安装包的方法,包括:获取目标安卓安装包的文件总长度;在文件总长度大于第一阈值的情况下,下载目标安卓安装包的核心目录的结构数据;判断目标安卓安装包的核心目录的结构数据与本地安卓安装包的核心目录的结构数据是否具有相同的哈希值;在具有相同哈希值的情况下,确定目标安装包与本地安卓安装包相同;在具有不同哈希值的情况下,确定目标安装包与本地安卓安装包不同。
在一些实施例中,下载目标安卓安装包的核心目录的结构数据包括:下载目标安装包的包尾数据,包尾数据的文件长度为第二阈值,第二阈值小于第一阈值;从包尾数据中确定核心目录结束标记,并根据核心目录结束标记确定目标安卓安装包的核心目录相对于目标安卓安装包的起始偏移量;根据起始偏移量,得到目标安卓安装包的核心目录起始标记;根据核心目录起始标记及核心目录结束标记,获取目标安卓安装包的核心目录的结构数据。
在一些实施例中,根据核心目录起始标记及核心目录结束标记,获取目标安卓安装包的核心目录的结构数据包括:在起始偏移量不小于文件总长度与第二阈值之差的情况下,根据核心目录起始标记及核心目录结束标记,从包尾数据中获取目标安卓安装包的核心目录的结构数据;在起始偏移量小于文件总长度与第二阈值之差的情况下,继续从目标安装包下载文件数据,并根据核心目录起始标记及核心目录结束标记,从文件数据及包尾数据中获取目标安卓安装包的核心目录的结构数据;其中,文件数据从核心目录起始标记开始,至包尾数据的起始位置终止。
在一些实施例中,第二阈值为65558字节。
在一些实施例中,根据核心目录结束标记确定目标安卓安装包的核心目录相对于目标安卓安装包的起始偏移量包括:从核心目录结束标记后的第16字节至第20字节的数据,确定起始偏移量。
在一些实施例中,获取目标安卓安装包的文件总长度包括:向目标安卓安装包所在的服务器发送超文本传输协议HTTP请求;接收服务器返回的HTTP响应,并根据HTTP响应中的内容长度字段确定目标安卓安装包的文件总长度。
在一些实施例中,还包括:在确定目标安卓安装包与本地安卓安装包不同的情况下,将目标安卓安装包完整下载至本地,并将目标安卓安装包的核心目录的结构数据的哈希值存储至本地。
在一些实施例中,还包括:在文件总长度不大于第一阈值的情况下,将目标安卓安装包下载至本地,并根据目标安卓安装包的哈希值、包名或签名检验目标安装包与本地安卓安装包是否相同。
根据本公开实施例的另一个方面,提供了一种校验安卓安装包的装置,包括:文件长度获取模块,被配置为获取目标安卓安装包的文件总长度;结构数据下载模块,被配置为在文件总长度大于第一阈值的情况下,下载目标安卓安装包的核心目录的结构数据;哈希值判断模块,被配置为判断目标安卓安装包的核心目录的结构数据与本地安卓安装包的核心目录的结构数据是否具有相同的哈希值;在具有相同哈希值的情况下,确定目标安装包与本地安卓安装包相同;在具有不同哈希值的情况下,确定目标安装包与本地安卓安装包不同。
在一些实施例中,结构数据下载模块被配置为:下载目标安装包的包尾数据,包尾数据的文件长度为第二阈值,第二阈值小于第一阈值;从包尾数据中确定核心目录结束标记,并根据核心目录结束标记确定目标安卓安装包的核心目录相对于目标安卓安装包的起始偏移量;根据起始偏移量,得到目标安卓安装包的核心目录起始标记;根据核心目录起始标记及核心目录结束标记,获取目标安卓安装包的核心目录的结构数据。
在一些实施例中,结构数据下载模块被配置为:在起始偏移量不小于文件总长度与第二阈值之差的情况下,根据核心目录起始标记及核心目录结束标记,从包尾数据中获取目标安卓安装包的核心目录的结构数据;在起始偏移量小于文件总长度与第二阈值之差的情况下,继续从目标安装包下载文件数据,并根据核心目录起始标记及核心目录结束标记,从文件数据及包尾数据中获取目标安卓安装包的核心目录的结构数据;其中,文件数据从核心目录起始标记开始,至包尾数据的起始位置终止。
在一些实施例中,结构数据下载模块被配置为:从核心目录结束标记后的第16字节至第20字节的数据,确定起始偏移量。
在一些实施例中,第二阈值为65558字节。
在一些实施例中,文件长度获取模块被配置为:向目标安卓安装包所在的服务器发送HTTP请求;接收服务器返回的HTTP响应,并根据HTTP响应中的内容长度字段确定目标安卓安装包的文件总长度。
在一些实施例中,结构数据下载模块还被配置为:在确定目标安卓安装包与本地安卓安装包不同的情况下,将目标安卓安装包完整下载至本地,并将目标安卓安装包的核心目录的结构数据的哈希值存储至本地。
在一些实施例中,结构数据下载模块还被配置为:在文件总长度不大于第一阈值的情况下,将目标安卓安装包下载至本地;哈希值判断模块还被配置为:根据目标安卓安装包的哈希值、包名或签名,检验目标安装包与本地安卓安装包是否相同。
根据本公开实施例的又一个方面,提供了一种校验安卓安装包的装置,包括:存储器;以及耦接至存储器的处理器,处理器被配置为基于存储在存储器中的指令,执行前述的校验安卓安装包的方法。
根据本公开实施例的再一个方面,提供了一种计算机可读存储介质,其中,计算机可读存储介质存储有计算机指令,指令被处理器执行时实现前述的校验安卓安装包的方法。
本公开能够更加高效的检验目标安卓安装包与本地安卓安装包是否相同,节省了下载时间、下载带宽及计算资源。
通过以下参照附图对本公开的示例性实施例的详细描述,本公开的其它特征及其优点将会变得清楚。
附图说明
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1示出了本公开一些实施例的校验安卓安装包的方法的流程示意图。
图2示出了下载目标安卓安装包的核心目录的结构数据的一些实施例的流程示意图。
图3示出了本公开一些实施例的校验安卓安装包的装置的结构示意图。
图4示出了本公开另一些实施例的校验安卓安装包的装置的结构示意图。
具体实施方式
下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。以下对至少一个示例性实施例的描述实际上仅仅是说明性的,决不作为对本公开及其应用或使用的任何限制。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本公开保护的范围。
目前APK总量庞大且存在重复。而现有的校验APK的方式存在浪费带宽和时间的问题,且现有的校验APK的方式避免重复下载的准确性又不高。有鉴于此,本公开提出了一种校验安卓安装包的方法。
首先结合图1描述本公开校验安卓安装包的方法的一些实施例。
图1示出了本公开一些实施例的校验安卓安装包的方法的流程示意图。如图1所示,本实施例包括步骤S101~步骤S107。
在步骤S101中,获取目标安卓安装包的文件总长度。
在一些实施例中,可以向目标安卓安装包所在的服务器发送超文本传输协议HTTP请求。然后,接收服务器返回的HTTP响应,并根据HTTP响应中的内容长度Content-Length字段确定目标安卓安装包的文件总长度。
在步骤S102中,判断目标安卓安装包的文件总长度是否大于第一阈值。其中,第一阈值可以设置为不小于65558字节。
在文件总长度不大于第一阈值的情况下,执行步骤S103;在文件总长度大于第一阈值的情况下,执行步骤S104。
在步骤S103中,将目标安卓安装包下载至本地,并根据目标安卓安装包的哈希值、包名或签名检验目标安装包与本地安卓安装包是否相同。
在步骤S104中,下载目标安卓安装包的核心目录的结构数据。
核心目录的结构数据包括最后修改时间、文件最后修改日期和CRC-32校验码等等。
在步骤S105中,判断目标安卓安装包的核心目录的结构数据与本地安卓安装包的核心目录的结构数据是否具有相同的哈希值。
例如,对本地已存在的APK,从文件尾向前查找其核心目录结束标记(0x06054b50),以该标记为开始,查询从第16字节处往后的4个字节,可以得到本地APK的核心目录相对于整个APK文件开始的偏移量。根据该偏移量能够找到本地APK的核心目录起始标记(0x02014b50)和核心目录结束标记(0x06054b50),从而得到本地APK的核心目录的结构数据。对本地APK的核心目录的结构数据计算hash值后,将hash值保存至本地的数据库用于步骤S105的判断过程。
在具有相同哈希值的情况下,执行步骤S106;在具有不同哈希值的情况下,执行步骤S107。
在步骤S106中,确定目标安装包与本地安卓安装包相同。
在步骤S107中,确定目标安装包与本地安卓安装包不同。
在一些实施例中,本实施例还包括步骤S108。
在步骤S108中,将目标安卓安装包完整下载至本地,并将目标安卓安装包的核心目录的结构数据的哈希值存储至本地。
本领域技术人员应理解,若有其他待下载的目标APK,可以返回步骤S101;若没有其他待下载的目标APK,可以结束流程。
本实施例能够在仅传输目标安卓安装包的部分数据的情况下(不需要下载完整APK文件),更加快速高效的校验目标安卓安装包与本地安卓安装包是否相同,避免重复下载安卓安装包,从而节省了下载时间、下载带宽及计算资源。通过精确使用APK文件的额外信息,本实施例还能够提升校验的准确率,降低误判率。
下面结合图2描述如何下载目标安卓安装包的核心目录的结构数据。
图2示出了下载目标安卓安装包的核心目录的结构数据的一些实施例的流程示意图。如图2所示,本实施例包括步骤S2041~步骤S2044。
在步骤S2041中,下载目标安装包的包尾数据,包尾数据的文件长度为第二阈值,第二阈值小于第一阈值。
在一些实施例中,第二阈值为65558字节。通过HTTP请求报头中携带的Range参数(Bytes:APK总长度减65558字节)来下载目标APK文件的最后65558字节数据。
在步骤S2042中,从包尾数据中确定核心目录结束标记,并根据核心目录结束标记确定目标安卓安装包的核心目录相对于目标安卓安装包的起始偏移量。
在一些实施例中,从核心目录结束标记后的第16字节至第20字节的数据,确定起始偏移量。
在步骤S2043中,根据起始偏移量,得到目标安卓安装包的核心目录起始标记。
在步骤S2044中,根据核心目录起始标记及核心目录结束标记,获取目标安卓安装包的核心目录的结构数据。
在起始偏移量不小于文件总长度与第二阈值之差的情况下,可以根据核心目录起始标记及核心目录结束标记,从包尾数据中获取目标安卓安装包的核心目录的结构数据。
在起始偏移量小于文件总长度与第二阈值之差的情况下,继续从目标安装包下载文件数据,并根据核心目录起始标记及核心目录结束标记,从文件数据及包尾数据中获取目标安卓安装包的核心目录的结构数据。其中,文件数据从核心目录起始标记开始,至包尾数据的起始位置终止。
本实施例中,发明人考虑到APK修改会导致最后修改时间、文件最后修改日期和CRC-32校验码等核心目录的结构数据发生变化,从而使整个核心目录的结构数据的hash值发生变化。因此,本实施例可以仅下载部分数据,通过部分数据包含的目标安卓安装包的核心目录的结构数据的hash值区分APK是否相同。
下面结合图3描述本公开校验安卓安装包的装置的一些实施例。
图3示出了本公开一些实施例的校验安卓安装包的装置的结构示意图。如图3所示,本实施例中的校验安卓安装包的装置30包括:
文件长度获取模块301,被配置为获取目标安卓安装包的文件总长度;结构数据下载模块302,被配置为在文件总长度大于第一阈值的情况下,下载目标安卓安装包的核心目录的结构数据;哈希值判断模块303,被配置为判断目标安卓安装包的核心目录的结构数据与本地安卓安装包的核心目录的结构数据是否具有相同的哈希值;在具有相同哈希值的情况下,确定目标安装包与本地安卓安装包相同;在具有不同哈希值的情况下,确定目标安装包与本地安卓安装包不同。
本实施例能够在仅传输目标安卓安装包的部分数据的情况下(不需要下载完整APK文件),更加快速高效的校验目标安卓安装包与本地安卓安装包是否相同,避免重复下载安卓安装包,从而节省了下载时间、下载带宽及计算资源。通过精确使用APK文件的额外信息,本实施例还能够提升校验的准确率,降低误判率。
在一些实施例中,结构数据下载模块302被配置为:下载目标安装包的包尾数据,包尾数据的文件长度为第二阈值,第二阈值小于第一阈值;从包尾数据中确定核心目录结束标记,并根据核心目录结束标记确定目标安卓安装包的核心目录相对于目标安卓安装包的起始偏移量;根据起始偏移量,得到目标安卓安装包的核心目录起始标记;根据核心目录起始标记及核心目录结束标记,获取目标安卓安装包的核心目录的结构数据。
在一些实施例中,结构数据下载模块302被配置为:在起始偏移量不小于文件总长度与第二阈值之差的情况下,根据核心目录起始标记及核心目录结束标记,从包尾数据中获取目标安卓安装包的核心目录的结构数据;在起始偏移量小于文件总长度与第二阈值之差的情况下,继续从目标安装包下载文件数据,并根据核心目录起始标记及核心目录结束标记,从文件数据及包尾数据中获取目标安卓安装包的核心目录的结构数据;其中,文件数据从核心目录起始标记开始,至包尾数据的起始位置终止。
在一些实施例中,结构数据下载模块302被配置为:从核心目录结束标记后的第16字节至第20字节的数据,确定起始偏移量。
在一些实施例中,第二阈值为65558字节。
在一些实施例中,文件长度获取模块301被配置为:向目标安卓安装包所在的服务器发送HTTP请求;接收服务器返回的HTTP响应,并根据HTTP响应中的内容长度字段确定目标安卓安装包的文件总长度。
在一些实施例中,结构数据下载模块302还被配置为:在确定目标安卓安装包与本地安卓安装包不同的情况下,将目标安卓安装包完整下载至本地,并将目标安卓安装包的核心目录的结构数据的哈希值存储至本地。
在一些实施例中,结构数据下载模块302还被配置为:在文件总长度不大于第一阈值的情况下,将目标安卓安装包下载至本地;哈希值判断模块303还被配置为:根据目标安卓安装包的哈希值、包名或签名,检验目标安装包与本地安卓安装包是否相同。
上述实施例中,发明人考虑到APK修改会导致最后修改时间、文件最后修改日期和CRC-32校验码等核心目录的结构数据发生变化,从而使整个核心目录的结构数据的hash值发生变化。因此,本实施例可以仅下载部分数据,通过部分数据包含的目标安卓安装包的核心目录的结构数据的hash值区分APK是否相同。
下面结合图4描述本公开校验安卓安装包的装置的另一些实施例。
图4示出了本公开另一些实施例的校验安卓安装包的装置的结构示意图。如图4所示,该实施例的校验安卓安装包的装置40包括:存储器410以及耦接至该存储器410的处理器420,处理器420被配置为基于存储在存储器410中的指令,执行前述任意一些实施例中的校验安卓安装包的方法。
其中,存储器410例如可以包括系统存储器、固定非易失性存储介质等。系统存储器例如存储有操作系统、应用程序、引导装载程序(Boot Loader)以及其他程序等。
校验安卓安装包的装置40还可以包括输入输出接口430、网络接口440、存储接口450等。这些接口430、440、450以及存储器410和处理器420之间例如可以通过总线460连接。其中,输入输出接口430为显示器、鼠标、键盘、触摸屏等输入输出设备提供连接接口。网络接口440为各种联网设备提供连接接口。存储接口450为SD卡、U盘等外置存储设备提供连接接口。
本公开还包括一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现前述任意一些实施例中的校验安卓安装包的方法。
本公开是参照根据本公开实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅为本公开的较佳实施例,并不用以限制本公开,凡在本公开的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。
- 校验安卓安装包的方法、装置及计算机可读存储介质
- 安卓安装包压缩方法、装置、计算机设备及存储介质