一种重复图片的检测方法和装置与流程

文档序号:11250975阅读:1413来源:国知局
一种重复图片的检测方法和装置与流程

本发明涉及计算机技术领域,具体涉及一种重复图片的检测方法和装置。



背景技术:

安卓系统中,有些应用程序会存在大量的重复图片,即相同图片,而重复的图片会占用系统内存资源,消耗大量的内存资源。

为了减低系统内存资源消耗,需要查找出系统内存中的重复图片,即检测重复图片。目前重复图片的检测方式主要是通过人工的方式在内存中查找重复图片;具体地,技术人员从内存中图片进行检索,比较检索到的图片,以确定是否有相同图片。

然而,目前重复图片的检测方式需要人工参与,人工处理关于比较慢且耗时,因此,会导致检测速度的效率比较低。



技术实现要素:

本发明实施例提供一种重复图片的检测方法和装置,可以提高重复图片的检测效率。

本发明实施例提供一种重复图片的检测方法,包括:

获取应用进程的内存使用文件,所述内存使用文件包括:多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息;

根据所述类的内使用信息获取相应图片类的属性的偏移,得到多个图片类的属性的偏移,其中,所述属性包括图片数据缓存区和图片尺寸;

根据所述多个实例的内存使用信息和所述多个图片类的属性的偏移,获取多个图片对象的属性值,所述属性值包括图片数据缓存区地址值以及图片尺寸值;

根据多个图片对象的图片数据缓存区地址值与多个数组的内存使用信息,获取多个图片对象的图片内容数据;

从所述多个图片对象中确定图片尺寸值相同、且图片内容数据相同的相同图片对象,并确定相同图片对象对应的图片为重复图片。

相应的,本发明实施例还提供一种重复图片的检测装置,包括:

文件获取单元,用于获取应用进程的内存使用文件,所述内存使用文件包括:多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息;

偏移获取单元,用于根据所述类的内使用信息获取相应图片类的属性的偏移,得到多个图片类的属性的偏移,其中,所述属性包括图片数据缓存区和图片尺寸;

属性值获取单元,用于根据所述多个实例的内存使用信息和所述多个图片类的属性的偏移,获取多个图片对象的属性值,所述属性值包括图片数据缓存区地址值以及图片尺寸值;

内容获取单元,用于根据多个图片对象的图片数据缓存区地址值与多个数组的内存使用信息,获取多个图片对象的图片内容数据;

重复图片确定单元,用于从所述多个图片对象中确定图片尺寸值相同、且图片内容数据相同的相同图片对象,并确定相同图片对象对应的图片为重复图片。

本发明实施例采用获取应用进程的内存使用文件,该内存使用文件包括:多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息,然后,根据该类的内使用信息获取相应图片类的属性的偏移,得到多个图片类的属性的偏移,其中,该属性包括图片数据缓存区和图片尺寸,根据该多个实例的内存使用信息和该多个图片类的属性的偏移,获取多个图片对象的属性值,该属性值包括图片数据缓存区地址值以及图片尺寸值,根据多个图片对象的图片数据缓存区地址值与多个数组的内存使用信息,获取多个图片对象的图片内容数据;从该多个图片对象中确定图片尺寸值相同、且图片内容数据相同的相同图片对象,并确定相同图片对象对应的图片为重复图片。该方案可以自动检测内存中的重复图片,无需人工处理,因此,可以提高重复图片的检测速度,进而提高重复图片的检测效率。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1a是本发明实施例提供的重复图片的检测方法的流程示意图;

图1b是本发明实施例提供的hprof文件的数据结构示意图;

图1c是本发明实施例提供的heap_dump_segment的数据结构示意图;

图1d是本发明实施例提供的hprof文件中string的数据结构示意图;

图1e是本发明实施例提供的hprof文件中loadclass的数据结构示意图;

图1f是本发明实施例提供的hprof文件中classdump的数据结构示意图;

图1g是本发明实施例提供的hprof文件中instancedump的数据结构示意图;

图1h是本发明实施例提供的hprof文件中原始数组dump的数据结构示意图;

图1i是本发明实施例提供的重复图片的示意图;

图2是本发明实施例提供的重复用图片的检测方法的另一流程示意图;

图3a是本发明实施例提供的重复图片的检测装置的第一种结构示意图;

图3b是本发明实施例提供的重复图片的检测装置的第二种结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明实施例提供了一种重复图片的检测方法和装置。以下将分别进行详细说明。

实施例一、

本实施例将从重复图片的检测装置的角度进行描述,该检测装置具体可以集成在终端中,该终端可以为电脑、手机等设备。

一种重复图片的检测方法,包括:获取应用进程的内存使用文件,该内存使用文件包括:多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息,然后,根据该类的内使用信息获取相应图片类的属性的偏移,得到多个图片类的属性的偏移,其中,该属性包括图片数据缓存区和图片尺寸,根据该多个实例的内存使用信息和该多个图片类的属性的偏移,获取多个图片对象的属性值,该属性值包括图片数据缓存区地址值以及图片尺寸值,根据多个图片对象的图片数据缓存区地址值与多个数组的内存使用信息,获取多个图片对象的图片内容数据;从该多个图片对象中确定图片尺寸值相同、且图片内容数据相同的相同图片对象,并确定相同图片对象对应的图片为重复图片。

如图1a所示,该重复图片的检测方法的具体流程可以如下:

101、获取应用进程的内存使用文件,该内存使用文件包括:多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息。

其中,应用进程的内存使用文件可以为安卓系统中的heapdump(转储)文件,比如,可以为hprof文件。一个heapdump就是一个程序(如java进程)在某个时间点上的内存快照的快照,可以获知程序的哪些部分正在使用大部分的内存。一般heapdump保存为一种叫做hprof的二进制格式,因此,也称为hprof文件,如参考图1b,为hprof文件的结构示意图。

比如,当内存使用文件为hprof文件时,可以通过解析工具(如mat对二进制的hprof文件进行解析。其中,mat(memoryanalyzertool,内存分析工具)为java堆栈分析工具,用于分析发现和定位内存中的泄露和大开销等内存问题。

本实施例中,内存使用文件可以包括:文件头部信息、类加载信息、多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息等等。

其中,文件头部信息包括字符串信息,比如,参考图1b,当内存使用文件为hprof文件时,该文件头部信息可以包括hprof_tag_string。参考图1b,该类加载信息可以为文件中的hprof_tag_load_class。

该类的内存使用信息可以为安卓系统中的classdump(类转储)信息,该实例的内存使用信息可以为安卓系统中的instancedump(实例转储)信息,该数组的内存使用信息可以为安卓系统中primitivearraydump(原始数组转储)信息。比如,参考图1b,当内存使用文件为hprof文件时,hprof文件包含hprof_tag_heap_dump_segment,该hprof_tag_heap_dump_segment存放的是内存中堆信息包括线程、类、实例、栈帧等。

参考图1c,hprof_tag_heap_dump_segment可以包括:classdump、instancedump、primitivearraydump等信息。如图1c所示,u1-u4分别表示该信息位占用的字节数从1字节到4字节,id表示的是一个u4信息。每个信息内容会有一个tag标识,该tag为一个u1的信息内容。

102、根据该类的内使用信息获取相应图片类的属性的偏移,得到多个图片类的属性的偏移,其中,该属性包括图片数据缓存区和图片尺寸。

其中,图片的格式有多种,比如,可以给为位图(bitmap)格式等。

本实施例中,图片类的属性(field)可以包括mbuffer(图片数据缓存区)和图片尺寸,该图片尺寸可以包括图片的长宽,或者图片的宽高,比如,mwindth、mheight。

本实施例中,图片类的属性的偏移为图片类的属性在内存的偏移位置或者偏移值。实际应用中,要获取图片类的属性值,就需要先获取图片类的属性的偏移。

比如,以安卓系统为例,可以根据classdump获取相应bitmapclass的属性(如mbuffer、mwindth、mheight)的偏移。

本实施例可以根据每个类的内存使用信息(如classdump)获取相应图片类的属性的偏移,从而得到多个图片类(如class)的属性(图片数据缓存区、图片尺寸)的偏移。比如,可以针对每个类的内存使用信息进行解析,得到每个类的属性类型(typeoffield),然后,基于每个类的属性类型获取每个类(图片数据缓存区、图片尺寸)的属性的偏移,当该类为图片类如bitmapclass时,此时便可以得到图片类的属性(图片数据缓存区、图片尺寸)的偏移,如bitmapclass中mbuffer、mwindth、mheight的偏移。

由于本发明实施例关注的图片类,即需要检测图片类,因此,为节省资源,本实施例可以针对每个类的内存使用信息进行解析,得到每个类的属性类型(typeoffield),然后,确定当前类是否为图片类,若是,则基于每个类的属性类型获取每个类的属性(图片数据缓存区、图片尺寸)的偏移。优选地,本实施例可以先获取需要关注的图片类标识,然后,基于图片类标识和类对象标识(classobjectid)来确定当前类是否为图片类。具体地,在获取内存使用文件之后,获取偏移之前,本实施例检测方法还可以包括:根据文件头部信息和类加载信息获取图片类标识;

此时,步骤“根据该类的内存使用信息获取相应图片类的属性的偏移”可以包括:

对该类的使用信息进行解析,得到该类的类对象标识和属性类型;

当该类对象标识与该图片类标识相同时,确定该类为图片类,并根据该属性类型获取该图片类的属性的偏移。

本实施例中获取的图片类标识为后续需要进行重复图片检测的类标识,本实施例可以通过内存使用文件的头部信息以及类加载信息来获取;具体地,可以对头部信息(如头部信息中的)进行解析,得到字符串的标识(stringid),并从字符串的标识中选取与图片类名相关的字符串的标识,即图片类名字符串的标识,然后,对类加载信息进行解析,利用类加载信息的字符串标识(stringnameid)确定待检测处理的图片类标识。即步骤“根据该文件头部信息和该类加载信息获取图片类标识”可以包括:

对该文件头部信息进行解析,得到字符串的标识;

从字符串的标识中获取图片类名字符串的标识;

对该内存使用文件中类加载信息进行解析,得类的字符串标识及其对应的类标识;

确定该类的字符串标识与该图片类名字符串的标识是否相同;

若相同,则确定该类标识为图片类标识。

其中,图片类名字符串的标识为图片类的名称字符串的标识,也就是表示图片类名称的字符串的标识。在对文件头部信息进行解析之后可以得多个字符串的标识,本实施例可以从多个字符串的标识中选取表示图片类名称的字符串的标识。比如,参考图1d,可以对hprof文件中的string字符信息进行解析,得到字符串的标识(stringid),如图1d中“id(u4)”,然后,从stringid中选取图片类名字符串的标识(classnamestringid)。

在获取图片类名字符串的标识之后,可以对类加载信息(如loadclass)进行解析,得到类的字符串标识及其对应的类标识;比如,参考图1e,在对loadclass信息解析后可以得到类的字符串标识(stringnameid)以及类标识,即“id(u4)”,当类的字符串标识(stringnameid)与前面得到图片类名字符串的标识(classnamestringid)相同时,表明当前类为图片类,该类的类标识即“id(u4)”为图片类标识(classid)。在得到图片类标识之后还可将其存放在某个对象中,如可以将图片类标识(classid)存储在mbitmapclassid中。

本实施例在得到图片类标识之后,可以对类的使用信息如classdump进行解析,以得到属性类型和类对象标识,如果类型对象标识与图片类标识相同,则表明当前类为图片类如bitmapclass,此时,可以基于属性类型获取类中属性(图片数据缓存区、图片尺寸)的偏移。

比如,以安卓系统,且内存使用文件为hprof文件为例,可以根据hprof文件中string字符串信息和loadclass(类加载)信息获取图片类标识(如bitmapclassid)。当存在多个classdump时,参考图1f,可以对某个classdump进行解析,得到classobjectid、以及属性类型(typeoffield);确定该classobjectid是否与图片类标识(如bitmapclassid)相同,若相同,则认为当前class为图片类(如bitmapclass),此时,可以基于属性类型(typeoffield)获取到属性(图片数据缓存区、图片尺寸)的偏移,如bitmapclass中mbuffer、mwindth、mheight的偏移。这样在分别对多个classdump解析完成时,便可以得到多个图片类的属性的偏移。

其中,根据属性类型获取偏移的方式可以有多种,优选地,本实施例可以根据属性类型获取属性占用内存的位数,然后,基于该位数来获取属性的偏移。也即步骤“据该属性类型获取该图片类的属性的偏移”可以包括:

根据该属性类型获取该类的属性占用内存的位数;

根据该属性占用内存的位数,获取该图片类的属性的偏移。

比如,参考图1f,解析heapdumpsegment中的classdump,利用之前存储的classid找到对应的class块,然后就可以看到在该class块中就存储了类中各个属性的信息,如属性类型信息。本实施例可以遍历该类中的各属性,在遍历属性同时利用各个属性的占位情况计算各个属性的偏移。由于各属性的在占用内存的位数是与属性的属性类型相关的,每个类型占用的内存是固定(u1标识当前属性的类型),因此,可以基于属性类型来获取属性占用内存的位数,然后,基于该位数来获取属性偏移。例如当前属性为int则当前属性占用内存为4bit,如果当前属性前有一个float,一个char类型,则当前属性偏移为4+1=5。

103、根据该多个实例的内存使用信息和该多个图片类的属性的偏移,获取多个图片对象的属性值,该属性值包括图片数据缓存区地址值以及图片尺寸值。

其中,图片尺寸值可以包括:图片长度值、图片宽度值,或者:图片长度值、图片高度值。

比如,可以根据多个instancedump和多个class的属性的偏移,得到多个bitmap对象的属性值如mbuffer、mwindth、mheight的值。其中,mbuffer的值为mbuffer在内存中的地址值,。

具体地,可以针对每个实例的内存使用信息进行解析,得到实例属性值(如value),当该实例的类为图片类时,则可以基于该类的属性偏移从实例属性值中获取该类的实例属性值中获取图片对象的属性值。也即步骤“根据该多个实例的内存使用信息和该多个图片类的属性的偏移,获取多个图片对象的属性值”可以包括:

对当前实例的内存使用信息进行解析,得到当前实例的类对象标识以及实例属性值;

当该类对象标识与该图片类标识相同时,确定该当前实例的类为图片类;

根据该图片类的属性的偏移从该实例属性值中,获取图片对象的属性值;

将当前实施例的内存使用信息更新为下一个实例的内存使用信息,并返回执行对当前实例的内存使用信息进行解析的步骤,直到解析完所有实例的内存使用信息;

当该类型对象标识与图片类型标识不相同时,将当前实施例的内存使用信息更新为下一个实例的内存使用信息,并返回执行对当前实例的内存使用信息进行解析的步骤,直到解析完所有实例的内存使用信息。

比如,当属性包括mbuffer、mwindth、mheight时,在获取mbuffer、mwindth、mheight的偏移之后,参考图1g,可以对instancedump进行解析,当实例的类对象标识(classobjectid)与之前的图片类标识(classid)相同时,认为当前实例的类为图片类a,此时,可以根据图片类a的属性偏移从实例属性值(如value)中获取实例对象(此时实施对象为图片对象)的属性值;如mbuffer的偏移从实例属性值(如value)中获取mbuffer的地址值,根据mwindth、mheight的偏移从实例属性值(如value)中获取mwindth、mheight的值。比如,mbuffer的偏移为30,那么在得到实例属性值value(如value=0x100)后,可以从value+30(即0x100+30=0x130)得到的地址0x130。接着,对下一个instancedump进行解析执行前述相同步骤,直到解析完所有的instancedump。

104、根据多个图片对象的图片数据缓存区地址值与多个数组的内存使用信息,获取多个图片对象的图片内容数据。

比如,可以根据多个bitmap对象的mbuffer值与多个primitivearraydump,获取多个bitmap对象的图片内容数据。

由于一般图片内容数据是利用一个byte的数组进行储存的,所以需要解析primitivearraydump来获取图片内容数据。本实施例可以图片对象结构中可以知道mbuffer就是一个byte结构,那么如果找到一个byte数组地址包含在mbuffer地址内,如找到一个byte数组地址和mbuffer地址值一致,mame可以认为该数组就是存储图片对象具体图片数据的数据区域。因此,本实施例可以,线对数组的内存使用信息进行解析,然后,确定数组的地址是否包含在某个图片对象的mbuffer地址之内,如是,则从数组内容数据中获取图片内容数据。即步骤“根据多个图片对象的图片数据缓存区地址值与多个数组的内存使用信息,获取多个图片对象的图片内容数据”可以包括:

对当前数组的内存使用信息进行解析,得到数组的地址值以及数组内容数据;

确定该数组的地址值是否包含在目标图片对象的图片数据缓存区地址值内;

若是,则确定该数组为该目标图片对象的图片数据缓存区,并从该数组内容数据中获取目标图片对象的图片内容数据;

将当前数组的内存使用信息更新为下一个数组的内存使用信息,并返回执行对当前数组的内存使用信息进行解析的步骤,直到解析完所有数组的内存使用信息;

若否,则将当前数组的内存使用信息更新为下一个数组的内存使用信息,并返回执行对当前数组的内存使用信息进行解析的步骤,直到解析完所有数组的内存使用信息。

例如,在某个primitivearraydump解析后,可以得到该array的地址和array内容数据,若该array的地址包含bitmap对象b的mbuffer地址内,那么可以确定该array为bitmap对象b的图片数据缓存区,此时,便可以从该array内容数据中获取bitmap对象b的图片内容数据,参考图1h,在对primitivearraydump解析后可以从图中“elements”(packedarray)获取图片内容数据,该图片内容数据为二进制数据。若该array的地址不包含任一bitmap对象的mbuffer地址内时,解析下一个primitivearraydump,直到解析完所有的primitivearraydump。

105、从该多个图片对象中确定图片尺寸值相同、且图片内容数据相同的相同图片对象,并确定相同图片对象对应的图片为重复图片。

比如,从多个图片对象中确定mwindth、mheight相同、且图片内容数据(这里是数组的大小以及数组各个数据位的值)相同的bitmap对象,这些bitmap对象对应的图片是同一图片,因此,确定这些图片为重复图片。

为方便用户观看和后续重复图片的定位分析,本实施例还可以在确定相同图片对象对应的图片为重复图片之后,记录相同对象的mbuffer值以及图片内容数据,当解析完所有数组的内存使用信息之后,输出相同对象的mbuffer值以及图片内容数据,参考图1i,在通过步骤101-105检测之后,通过查看导出的图片信息发现的确实有重复的图片,例如其中7bc99000、7bca1000上的图片为重复图片。

本实施例可以通过将图片对象的尺寸值、图片内容数据进行比较得到相同图片对象,进而确定重复图片。可选地,为提高比较速度以及重复图片确定速度,本实施例可以在解析完所有数组的内存使用信息之后,再对数组进行解析,以实现图片对象的图片尺寸值、图片内容数据的比较。具体地,步骤“从该多个图片对象中确定图片尺寸值相同、且图片内容数据相同的相同图片对象,并确定相同图片对象对应的图片为重复图片”可以包括:

当解析完所有数组的内存使用信息之后,再次对当前数组的内存使用信息进行解析,得到数组的地址值;

确定该数组的地址值是否包含在目标图片对象的图片数据缓存区地址值内;

若是,则判断该多个图片对象中是否存在与目标图片对象的图片尺寸值和图片内容数据均相同的其他图片对象;

若存在,则确定该目标对象与该其他图片对象为相同图片对象,以及确定该相同图片对象对应的图片为重复图片;

将当前数组的内存使用信息更新为下一个数组的内存使用信息,并返回执行对当前数组的内存使用信息进行解析的步骤,直到再次解析完所有数组的内存使用信息;

若该数组的地址值不包含在目标图片对象的图片数据缓存区地址值内,或者不存在与目标图片对象的图片尺寸值和图片内容数据均相同的其他图片对象时,将当前数组的内存使用信息更新为下一个数组的内存使用信息,并返回执行对当前数组的内存使用信息进行解析的步骤,直到再次解析完所有数组的内存使用信息。

其中,其他图片对象为多个图片对象中除了目标图片对象以外的图片对象。

比如,通过第一次对所有primitivearraydump解析后得到多个图片对象的图片尺寸值和图片内容数据,bitmap对象1、bitmap对象2……bitmap对象n的图片尺寸值和图片内容数据;再次对所有primitivearraydump解析,当对某个primitivearraydump解析后,如果该primitivearraydump的地址包含在bitmap对象i的mbuffer地址内,此时,可以确定除将bitmap对象i的其余bitmap对象中有是否存在与bitmap对象i图片尺寸值和图片内容数据均相同的bitmap对象,如存在,假设bitmap对象1、bitmap对象2与bitmap对象i图片尺寸值和图片内容数据均相同,此时,确定bitmap对象1、bitmap对象2、bitmap对象i为相同bitmap对象,并确定bitmap对象1、bitmap对象2、bitmap对象i对应的图片为重复图片;然后,再次对下一个primitivearraydump解析执行前述相同的步骤,以确定重复图片,直到再次解析完所有的primitivearraydump。

由上可知,本发明实施例采用获取应用进程的内存使用文件,该内存使用文件包括:多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息,然后,根据该类的内使用信息获取相应图片类的属性的偏移,得到多个图片类的属性的偏移,其中,该属性包括图片数据缓存区和图片尺寸,根据该多个实例的内存使用信息和该多个图片类的属性的偏移,获取多个图片对象的属性值,该属性值包括图片数据缓存区地址值以及图片尺寸值,根据多个图片对象的图片数据缓存区地址值与多个数组的内存使用信息,获取多个图片对象的图片内容数据;从该多个图片对象中确定图片尺寸值相同、且图片内容数据相同的相同图片对象,并确定相同图片对象对应的图片为重复图片。该方案可以自动检测内存中的重复图片,无需人工处理,因此,可以提高重复图片的检测速度,进而提高重复图片的检测效率。

此外,该方案无需依赖于检测人员的分析经验,可以避免由于检测人员缺乏分析经验导致误判断重复图片的情况,可以提高重复图片的检测准确性。

实施例二、

根据实施例一所描述的方法,将通过举例来进一步说明。

本实施例将以检测安卓系统中的重复图片为例,来对本发明提供的检测方法来详细说明。

如图2所示,本发明提供了一种重复图片的检测方法,具体流程如下:

201、获取应用进程的hprof文件,该hprof文件包括:hprof头部信息、loadclass、多个classdump、instancedump以及多个primitivearraydump。

该应用进程的内存使用文件可以hprof文件,参考图1b。

参考图1c,hprof_tag_heap_dump_segment可以包括:classdump、instancedump、primitivearraydump等信息。如图1c所示,u1-u4分别表示该信息位占用的字节数从1字节到4字节,id表示的是一个u4信息。每个信息内容会有一个tag标识,该tag为一个u1的信息内容。

202、对hprof头部信息进行解析,得到字符串的标识;并从字符串的标识中获取图片类名字符串的标识。

以对hprof文件中的string字符信息进行解析,得到字符串的标识(stringid),如图1d中“id(u4)”,然后,从stringid中选取图片类名字符串的标识(classnamestringid)。

203、对loadclass进行解析,得到class的字符串标识及其对应的类标识。

参考图1f,可以对某个classdump进行解析,得到classobjectid、以及属性类型(typeoffield);确定该classobjectid是否与图片类标识(如bitmapclassid)相同,若相同,则认为当前class为图片类(如bitmapclass),此时,可以基于属性类型(typeoffield)获取到属性(图片数据缓存区、图片尺寸)的偏移,如bitmapclass中mbuffer、mwindth、mheight的偏移。

204、当class的字符串标识与图片类名字符串的标识相同时,确定类标识为bitmap类标识。

比如,参考图1e,在对loadclass信息解析后可以得到类的字符串标识(stringnameid)以及类标识,即“id(u4)”,当类的字符串标识(stringnameid)与前面得到图片类名字符串的标识(classnamestringid)相同时,表明当前类为图片类,该类的类标识即“id(u4)”为图片类标识(classid)。

205、对当前classdump进行解析,得到类对象标识(classobjectid)、以及属性类型(typeoffield)。

206、判断该类对象标识是否与bitmap类标识相同,若相同,则执行步骤207,若不相同,则执行步骤209。

207、确定当前class为bitmapclass,根据属性类型获取mbuffer、mwindth、mheight的偏移。

参考图1f,可以对某个classdump进行解析,得到classobjectid、以及属性类型(typeoffield);确定该classobjectid是否与图片类标识(如bitmapclassid)相同,于属性类型(typeoffield)获取mbuffer、mwindth、mheight。的偏移。

208、判断是否解析完所有classdump,若否,则执行步骤209,若是,则执行步骤210。

209、对下一个classdump进行解析,得到类对象标识(classobjectid)、以及属性类型(typeoffield),并返回执行步骤207。

210、对当前instancedump进行解析,得到类对象标识(classobjectid)以及实例属性值(value)。

211、判断该类对象标识是否与bitmap类标识相同,若相同,则执行步骤212,若不相同,则执行步骤214。

212、根据mbuffer、mwindth、mheight的偏移从实例属性值中获取bitmap对象的mbuffer、mwindth、mheight值。

参考图1g,可以对instancedump进行解析,当实例的类对象标识(classobjectid)与之前的图片类标识(classid)相同时,认为当前实例的类为图片类,此时,可以根据该图片类的属性偏移从实例属性值(如value)中获取mbuffer、mwindth、mheight值。

其中,mbuffer的值为mbuffer的地址值。

本实施例可以,将mbuffer、mwindth、mheight值存在一个bitmapinfo对象中。然后以mbuffer为key,bitmapinfo对象为value建立一个map对(mbuffertoinfo)供后续使用。

213、判断是否解析完所有的instancedump,若否,则执行步骤214,若是,则执行步骤215。

214、对下一个instancedump进行解析,并返回执行步骤211。

215、对当前原始数组dump进行解析,得到数组的地址值以及数组内容数据。

216、确定数组的地址是否包含在bitmap对象的mbuffer地址内,若是,则执行步骤217,若否,则执行步骤218。

在构建mbuffer为key,bitmapinfo对象为value的map对象的情况下,可以确定数字的地址是否包含在bitmapinfo的key中。

217、确定当前数组为该bitmap对象的mbuffer,并从数组内容数据获取bitmap对象的图片内容数据。

其中,图片内容数据包括数组的大小以及数组各数据为的值。

本实施例可以构建map对象mbitmapbuffer,存储图片内容数据,以mbuffer为key,mbitmapbuffer对象为value建立一个map对供后续使用。

218、判断是否解析完所有的原始数组dump,若否,则执行步骤219,若是,则执行步骤220。

219、对下一个原始数组dump进行解析,并返回执行步骤216。

220、再次对当前原始数组dump进行解析,得到数组的地址值。

221、确定数组的地址是否包含在bitmap对象的mbuffer地址内,若是,则执行步骤222,若否,则执行步骤224。

222、确定是否存在与该bitmap对象mwindth、mheight值、图片内容数据均相同的其他bitmap对象,若是,则执行步骤223,若否,则执行步骤224。

比如,以mbuffer地址为key遍历mbuffertoinfo及其对应的mbitmapbuffer比较存储mwindth、mheight,以及具体的图像内容数据(这个需要比较byte数组的大小以及数组各个数据位的值)是否相等,如果相等,则认为相等的几个图片是同一图片,将其mbuffer和二进制图片数据记录在一个hashset中。

223、确定该bitmap对象与其他bitmap对象对应的bitmap为重复bitmap,记录bitmap对象的mbuffer值和图片内容数据。

224、判断是否解析完所有的原始数组dump,若否,则执行步骤225,若是,则执行步骤226。

225、再次对下一个原始数组dump进行解析,并返回执行步骤223。

226、输出记录的mbuffer值和图片内容数据。

比如,处理hashset中记录数据,将二进制图片数据转为图像信息导出到磁盘,同时统计重复的图片数量和重复的类型。

由上可知,本发明实施例采用获取应用进程的内存使用文件,该内存使用文件包括:多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息,然后,根据该类的内使用信息获取相应图片类的属性的偏移,得到多个图片类的属性的偏移,其中,该属性包括图片数据缓存区和图片尺寸,根据该多个实例的内存使用信息和该多个图片类的属性的偏移,获取多个图片对象的属性值,该属性值包括图片数据缓存区地址值以及图片尺寸值,根据多个图片对象的图片数据缓存区地址值与多个数组的内存使用信息,获取多个图片对象的图片内容数据;从该多个图片对象中确定图片尺寸值相同、且图片内容数据相同的相同图片对象,并确定相同图片对象对应的图片为重复图片。该方案可以自动检测内存中的重复图片,无需人工处理,因此,可以提高重复图片的检测速度,进而提高重复图片的检测效率。

此外,该方案无需依赖于检测人员的分析经验,可以避免由于检测人员缺乏分析经验导致误判断重复图片的情况,可以提高重复图片的检测准确性。

实施例三、

为了更好地实施以上方法,本发明实施例还提供重复图片的检测装置,如图3a所示,该重复图片的检测装置可以包括:文件获取单元301、偏移获取单元302、属性值获取单元303、内容获取单元304和重复图片确定单元305,如下:

(1)文件获取单元301;

文件获取单元301,用于获取应用进程的内存使用文件,该内存使用文件包括:多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息。

其中,应用进程的内存使用文件可以为安卓系统中的heapdump(转储)文件,比如,可以为hprof文件。一个heapdump就是一个程序(如java进程)在某个时间点上的内存快照的快照,可以获知程序的哪些部分正在使用大部分的内存。一般heapdump保存为一种叫做hprof的二进制格式,因此,也称为hprof文件。

内存使用文件可以包括:文件头部信息、类加载信息、多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息等等。

比如,该类的内存使用信息可以为安卓系统中的classdump(类转储)信息,该实例的内存使用信息可以为安卓系统中的instancedump(实例转储)信息,该数组的内存使用信息可以为安卓系统中primitivearraydump(原始数组转储)信息。

(2)偏移获取单元302;

偏移获取单元302,用于根据该类的内使用信息获取相应图片类的属性的偏移,得到多个图片类的属性的偏移,其中,该属性包括图片数据缓存区和图片尺寸。

其中,图片的格式有多种,比如,可以给为位图(bitmap)格式等。

本实施例中,图片类的属性(field)可以包括mbuffer(图片数据缓存区)和图片尺寸,该图片尺寸可以包括图片的长宽,或者图片的宽高,比如,mwindth、mheight。

本实施例中,图片类的属性的偏移为图片类的属性在内存的偏移位置或者偏移值。实际应用中,要获取图片类的属性值,就需要先获取图片类的属性的偏移。

比如,以安卓系统为例,可以根据classdump获取相应bitmapclass的属性(如mbuffer、mwindth、mheight)的偏移。

本实施例中,针对每个类的内存使用信息进行解析,得到每个类的属性类型(typeoffield),然后,基于每个类的属性类型获取每个类(图片数据缓存区、图片尺寸)的属性的偏移,当该类为图片类如bitmapclass时,此时便可以得到图片类的属性(图片数据缓存区、图片尺寸)的偏移,如bitmapclass中mbuffer、mwindth、mheight的偏移。

优选地,本实施例可以先获取需要关注的图片类标识,然后,基于图片类标识和类对象标识(classobjectid)来确定当前类是否为图片类,若是,则基于每个类的属性类型获取每个类的属性(图片数据缓存区、图片尺寸)的偏移。参考图3b,检测装置还包括:类标识获取单元306;

类标识获取单元306,用于在文件获取单元301获取内存使用文件之后,偏移获取单元获取偏移之前,根据该头部信息和该类加载信息获取图片类标识;

该偏移获取单元302,具体用于:

对该类的使用信息进行解析,得到该类的类对象标识和属性类型;

当该类对象标识与该图片类标识相同时,确定该类为图片类,并根据该属性类型获取该图片类的属性的偏移。

其中,类标识获取单元306可以具体用于:

对该文件头部信息进行解析,得到字符串的标识;

从字符串的标识中获取图片类名字符串的标识;

对该内存使用文件中类加载信息进行解析,得类的字符串标识及其对应的类标识;

确定该类的字符串标识与该图片类名字符串的标识是否相同;

若相同,则确定该类标识为图片类标识。

其中,移获取单元302,具体用于根据该属性类型获取该类的属性占用内存的位数,根据该属性占用内存的位数,获取该图片类的属性的偏移。

(3)属性值获取单元303;

属性值获取单元303,用于根据该多个实例的内存使用信息和该多个图片类的属性的偏移,获取多个图片对象的属性值,该属性值包括图片数据缓存区地址值以及图片尺寸值。

其中,图片尺寸值可以包括:图片长度值、图片宽度值,或者:图片长度值、图片高度值。

比如,可以根据多个instancedump和多个class的属性的偏移,得到多个bitmap对象的属性值如mbuffer、mwindth、mheight的值。其中,mbuffer的值为mbuffer在内存中的地址值,

其中,属性值获取单元303,可以具体用于:

对当前实例的内存使用信息进行解析,得到当前实例的类对象标识以及实例属性值;

当该类对象标识与该图片类标识相同时,确定该当前实例的类为图片类;

根据该图片类的属性的偏移从该实例属性值中,获取图片对象的属性值;

将当前实施例的内存使用信息更新为下一个实例的内存使用信息,并返回执行对当前实例的内存使用信息进行解析的步骤,直到解析完所有实例的内存使用信息。

比如,当属性包括mbuffer、mwindth、mheight时,在获取mbuffer、mwindth、mheight的偏移之后,参考图1g,可以对instancedump进行解析,当实例的类对象标识(classobjectid)与之前的图片类标识(classid)相同时,认为当前实例的类为图片类a,此时,可以根据图片类a的属性偏移从实例属性值(如value)中获取实例对象(此时实施对象为图片对象)的属性值;如mbuffer的偏移从实例属性值(如value)中获取mbuffer的地址值,根据mwindth、mheight的偏移从实例属性值(如value)中获取mwindth、mheight的值。

(4)内容获取单元304;

内容获取单元304,用于根据多个图片对象的图片数据缓存区地址值与多个数组的内存使用信息,获取多个图片对象的图片内容数据。

比如,内容获取单元304可以根据多个bitmap对象的mbuffer值与多个primitivearraydump,获取多个bitmap对象的图片内容数据。

由于一般图片内容数据是利用一个byte的数组进行储存的,所以需要解析primitivearraydump来获取图片内容数据。因此,内容获取单元304可以具体用于:

对当前数组的内存使用信息进行解析,得到数组的地址值以及数组内容数据;

确定该数组的地址值是否包含在目标图片对象的图片数据缓存区地址值内;

若是,则确定该数组为该目标图片对象的图片数据缓存区,并从该数组内容数据中获取目标图片对象的图片内容数据;

将当前数组的内存使用信息更新为下一个数组的内存使用信息,并返回执行对当前数组的内存使用信息进行解析的步骤,直到解析完所有数组的内存使用信息。

例如,在某个primitivearraydump解析后,可以得到该array的地址和array内容数据,若该array的地址包含bitmap对象b的mbuffer地址内,那么可以确定该array为bitmap对象b的图片数据缓存区,此时,便可以从该array内容数据中获取bitmap对象b的图片内容数据。

(5)重复图片确定单元305;

重复图片确定单元305,用于该多个图片对象中确定图片尺寸值相同、且图片内容数据相同的相同图片对象,并确定相同图片对象对应的图片为重复图片。

比如,从多个图片对象中确定mwindth、mheight相同、且图片内容数据(这里是数组的大小以及数组各个数据位的值)相同的bitmap对象,这些bitmap对象对应的图片是同一图片,因此,确定这些图片为重复图片。

本实施例可以通过将图片对象的尺寸值、图片内容数据进行比较得到相同图片对象,进而确定重复图片。可选地,为提高比较速度以及重复图片确定速度,重复图片确定单元305,可以具体用于:

对当前数组的内存使用信息进行解析,得到数组的地址值以及数组内容数据;

确定该数组的地址值是否包含在目标图片对象的图片数据缓存区地址值内;

若是,则确定该数组为该目标图片对象的图片数据缓存区,并从该数组内容数据中获取目标图片对象的图片内容数据;

将当前数组的内存使用信息更新为下一个数组的内存使用信息,并返回执行对当前数组的内存使用信息进行解析的步骤,直到解析完所有数组的内存使用信息。

具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元的具体实施可参见前面的方法实施例,在此不再赘述。

该重复图片的检测装置具体集成在终端,如笔记本电脑、平板电脑等设备中。

由上可知,本发明实施例通过文件获取单元301获取应用进程的内存使用文件,该内存使用文件包括:多个类的内存使用信息、多个实例的内存使用信息以及多个数组的内存使用信息,然后,由偏移获取单元302根据该类的内使用信息获取相应图片类的属性的偏移,得到多个图片类的属性的偏移,其中,该属性包括图片数据缓存区和图片尺寸,由属性值获取单元303根据该多个实例的内存使用信息和该多个图片类的属性的偏移,获取多个图片对象的属性值,该属性值包括图片数据缓存区地址值以及图片尺寸值,由内容获取单元304根据多个图片对象的图片数据缓存区地址值与多个数组的内存使用信息,获取多个图片对象的图片内容数据;由重复图片确定单元305从该多个图片对象中确定图片尺寸值相同、且图片内容数据相同的相同图片对象,并确定相同图片对象对应的图片为重复图片。该方案可以自动检测内存中的重复图片,无需人工处理,因此,可以提高重复图片的检测速度,进而提高重复图片的检测效率。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(rom,readonlymemory)、随机存取记忆体(ram,randomaccessmemory)、磁盘或光盘等。

以上对本发明实施例所提供的一种重复图片的检测方法和装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1