本發明涉及計算機技術領域,具體涉及一種重復圖片的檢測方法和裝置。
背景技術:
安卓系統中,有些應用程序會存在大量的重復圖片,即相同圖片,而重復的圖片會占用系統內存資源,消耗大量的內存資源。
為了減低系統內存資源消耗,需要查找出系統內存中的重復圖片,即檢測重復圖片。目前重復圖片的檢測方式主要是通過人工的方式在內存中查找重復圖片;具體地,技術人員從內存中圖片進行檢索,比較檢索到的圖片,以確定是否有相同圖片。
然而,目前重復圖片的檢測方式需要人工參與,人工處理關于比較慢且耗時,因此,會導致檢測速度的效率比較低。
技術實現要素:
本發明實施例提供一種重復圖片的檢測方法和裝置,可以提高重復圖片的檢測效率。
本發明實施例提供一種重復圖片的檢測方法,包括:
獲取應用進程的內存使用文件,所述內存使用文件包括:多個類的內存使用信息、多個實例的內存使用信息以及多個數組的內存使用信息;
根據所述類的內使用信息獲取相應圖片類的屬性的偏移,得到多個圖片類的屬性的偏移,其中,所述屬性包括圖片數據緩存區和圖片尺寸;
根據所述多個實例的內存使用信息和所述多個圖片類的屬性的偏移,獲取多個圖片對象的屬性值,所述屬性值包括圖片數據緩存區地址值以及圖片尺寸值;
根據多個圖片對象的圖片數據緩存區地址值與多個數組的內存使用信息,獲取多個圖片對象的圖片內容數據;
從所述多個圖片對象中確定圖片尺寸值相同、且圖片內容數據相同的相同圖片對象,并確定相同圖片對象對應的圖片為重復圖片。
相應的,本發明實施例還提供一種重復圖片的檢測裝置,包括:
文件獲取單元,用于獲取應用進程的內存使用文件,所述內存使用文件包括:多個類的內存使用信息、多個實例的內存使用信息以及多個數組的內存使用信息;
偏移獲取單元,用于根據所述類的內使用信息獲取相應圖片類的屬性的偏移,得到多個圖片類的屬性的偏移,其中,所述屬性包括圖片數據緩存區和圖片尺寸;
屬性值獲取單元,用于根據所述多個實例的內存使用信息和所述多個圖片類的屬性的偏移,獲取多個圖片對象的屬性值,所述屬性值包括圖片數據緩存區地址值以及圖片尺寸值;
內容獲取單元,用于根據多個圖片對象的圖片數據緩存區地址值與多個數組的內存使用信息,獲取多個圖片對象的圖片內容數據;
重復圖片確定單元,用于從所述多個圖片對象中確定圖片尺寸值相同、且圖片內容數據相同的相同圖片對象,并確定相同圖片對象對應的圖片為重復圖片。
本發明實施例采用獲取應用進程的內存使用文件,該內存使用文件包括:多個類的內存使用信息、多個實例的內存使用信息以及多個數組的內存使用信息,然后,根據該類的內使用信息獲取相應圖片類的屬性的偏移,得到多個圖片類的屬性的偏移,其中,該屬性包括圖片數據緩存區和圖片尺寸,根據該多個實例的內存使用信息和該多個圖片類的屬性的偏移,獲取多個圖片對象的屬性值,該屬性值包括圖片數據緩存區地址值以及圖片尺寸值,根據多個圖片對象的圖片數據緩存區地址值與多個數組的內存使用信息,獲取多個圖片對象的圖片內容數據;從該多個圖片對象中確定圖片尺寸值相同、且圖片內容數據相同的相同圖片對象,并確定相同圖片對象對應的圖片為重復圖片。該方案可以自動檢測內存中的重復圖片,無需人工處理,因此,可以提高重復圖片的檢測速度,進而提高重復圖片的檢測效率。
附圖說明
為了更清楚地說明本發明實施例中的技術方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對于本領域技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
圖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是本發明實施例提供的重復圖片的檢測裝置的第二種結構示意圖。
具體實施方式
下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分實施例,而不是全部的實施例?;诒景l明中的實施例,本領域技術人員在沒有作出創造性勞動前提下所獲得的所有其他實施例,都屬于本發明保護的范圍。
本發明實施例提供了一種重復圖片的檢測方法和裝置。以下將分別進行詳細說明。
實施例一、
本實施例將從重復圖片的檢測裝置的角度進行描述,該檢測裝置具體可以集成在終端中,該終端可以為電腦、手機等設備。
一種重復圖片的檢測方法,包括:獲取應用進程的內存使用文件,該內存使用文件包括:多個類的內存使用信息、多個實例的內存使用信息以及多個數組的內存使用信息,然后,根據該類的內使用信息獲取相應圖片類的屬性的偏移,得到多個圖片類的屬性的偏移,其中,該屬性包括圖片數據緩存區和圖片尺寸,根據該多個實例的內存使用信息和該多個圖片類的屬性的偏移,獲取多個圖片對象的屬性值,該屬性值包括圖片數據緩存區地址值以及圖片尺寸值,根據多個圖片對象的圖片數據緩存區地址值與多個數組的內存使用信息,獲取多個圖片對象的圖片內容數據;從該多個圖片對象中確定圖片尺寸值相同、且圖片內容數據相同的相同圖片對象,并確定相同圖片對象對應的圖片為重復圖片。
如圖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上的圖片為重復圖片。
本實施例可以通過將圖片對象的尺寸值、圖片內容數據進行比較得到相同圖片對象,進而確定重復圖片??蛇x地,為提高比較速度以及重復圖片確定速度,本實施例可以在解析完所有數組的內存使用信息之后,再對數組進行解析,以實現圖片對象的圖片尺寸值、圖片內容數據的比較。具體地,步驟“從該多個圖片對象中確定圖片尺寸值相同、且圖片內容數據相同的相同圖片對象,并確定相同圖片對象對應的圖片為重復圖片”可以包括:
當解析完所有數組的內存使用信息之后,再次對當前數組的內存使用信息進行解析,得到數組的地址值;
確定該數組的地址值是否包含在目標圖片對象的圖片數據緩存區地址值內;
若是,則判斷該多個圖片對象中是否存在與目標圖片對象的圖片尺寸值和圖片內容數據均相同的其他圖片對象;
若存在,則確定該目標對象與該其他圖片對象為相同圖片對象,以及確定該相同圖片對象對應的圖片為重復圖片;
將當前數組的內存使用信息更新為下一個數組的內存使用信息,并返回執行對當前數組的內存使用信息進行解析的步驟,直到再次解析完所有數組的內存使用信息;
若該數組的地址值不包含在目標圖片對象的圖片數據緩存區地址值內,或者不存在與目標圖片對象的圖片尺寸值和圖片內容數據均相同的其他圖片對象時,將當前數組的內存使用信息更新為下一個數組的內存使用信息,并返回執行對當前數組的內存使用信息進行解析的步驟,直到再次解析完所有數組的內存使用信息。
其中,其他圖片對象為多個圖片對象中除了目標圖片對象以外的圖片對象。
比如,通過第一次對所有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)、磁盤或光盤等。
以上對本發明實施例所提供的一種重復圖片的檢測方法和裝置進行了詳細介紹,本文中應用了具體個例對本發明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發明的方法及其核心思想;同時,對于本領域的技術人員,依據本發明的思想,在具體實施方式及應用范圍上均會有改變之處,綜上所述,本說明書內容不應理解為對本發明的限制。