本發(fā)明涉及應(yīng)用程序安全防護技術(shù)領(lǐng)域,具體涉及一種dex文件的存儲方法和裝置。
背景技術(shù):
隨著Android系統(tǒng)的快速發(fā)展和及設(shè)備的高速增長,基于Android的平臺應(yīng)用需求也越來越復(fù)雜。形形色色的應(yīng)用軟件壯大了Android市場,也豐富了我們的生活,越來越多的人從起初的嘗試到享受再到依賴,Android應(yīng)用越來越廣泛。與其它操作系統(tǒng)相比,Android系統(tǒng)的開源性為應(yīng)用開發(fā)者提供了更多的功能接口,但這些功能接口在提高系統(tǒng)可擴展性的同時也為惡意軟件提供了遍歷,非法拷貝、反編譯、內(nèi)存截取等手段不斷威脅著安卓系統(tǒng)的安全,不僅危害了使用者,也給正常應(yīng)用開發(fā)者造成了嚴重的損害。因此,Android應(yīng)用安全性一直是開發(fā)者所關(guān)注的重點問題。
對Android應(yīng)用進行加固防護的主要目的均是為了防止其java字節(jié)碼文件classes.dex文件被獲取,在Android平臺安裝運行APK文件時,都必須將dex文件釋放到內(nèi)存,在dex文件加載時,根據(jù)文件頭header中定義的其它結(jié)構(gòu)的偏移地址和長度信息進行尋址解析,將其它結(jié)構(gòu)中的數(shù)據(jù)加載分別加載到內(nèi)存中,加載后的dex文件的內(nèi)容是存放在內(nèi)存中的一端連續(xù)的內(nèi)存空間中的,因此,破解者只需要獲取到classes.dex文件的起始地址,然后從起始地址開始dump(提取/提取)文件總長度filesize大小的內(nèi)容,即可提取得到完整的classes.dex文件的內(nèi)容,進而可以進一步還原出APK文件的源代碼,使得安卓應(yīng)用程序很容易被篡改。
技術(shù)實現(xiàn)要素:
針對現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明實施例的目的在于提供一種能夠克服上述問題或者至少能夠部分地解決上述問題的一種dex文件的存儲方法和裝置。
為實現(xiàn)上述目的,本發(fā)明的一個實施例中提供了一種dex文件的存儲方法,包括:
運行安卓應(yīng)用程序,解析并加載安卓應(yīng)用程序的dex文件;
檢測所述dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中;
當檢測到所述類已經(jīng)被加載到內(nèi)存空間中時,刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item。
優(yōu)選的,如上所述的方法,所述運行安卓應(yīng)用程序前,包括:
接收安卓應(yīng)用程序啟動指令,啟動類檢測線程;所述類檢測線程用于在安卓應(yīng)用程序啟動過程中,檢測安卓應(yīng)用程序的dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中。
優(yōu)選的,如上所述的方法,接收安卓應(yīng)用程序啟動指令前,還包括:創(chuàng)建所述類檢測線程;
在刪除所述類的類數(shù)據(jù)信息class_data_item后,關(guān)閉所述類檢測線程。
優(yōu)選的,如上所述的方法,所述dex文件中定義的類包括安卓應(yīng)用程序的dex文件中的定義的至少一個類。
優(yōu)選的,如上所述的方法,刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item,包括:
根據(jù)dex文件的類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off,查找到dex文件數(shù)據(jù)區(qū)段data中該類的類數(shù)據(jù)信息class_data_item并刪除。
優(yōu)選的,如上所述的方法,刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item后,還包括:
將所述dex文件的類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off的值修改為0。
優(yōu)選的,如上所述的方法,所述檢測所述dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中,包括:
通過檢測安卓操作系統(tǒng)中的dex文件路徑列表DexPathList的dex元素數(shù)組dexElements中是否存在所述類的緩存標識,判斷所述類是否已經(jīng)被加載到內(nèi)存空間中。
優(yōu)選的,如上所述的方法,所述類的緩存標識為所述類的變量值cookie,所述變量值cookie為加載后的類所在的內(nèi)存地址。
本發(fā)明的實施例中還公開了:一種dex文件的存儲裝置,包括:
dex文件解析加載模塊,用于運行安卓應(yīng)用程序,解析并加載安卓應(yīng)用程序的dex文件;
類加載狀態(tài)檢測模塊,用于檢測所述dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中;
類數(shù)據(jù)刪除模塊,用于當檢測到所述類已經(jīng)被加載到內(nèi)存空間中時,刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item。
優(yōu)選的,如上所述的裝置,該裝置還包括:
類檢測線程啟動模塊,用于在運行安卓應(yīng)用程序前,接收安卓應(yīng)用程序啟動指令,啟動類檢測線程;所述類檢測線程用于在安卓應(yīng)用程序啟動過程中,檢測安卓應(yīng)用程序的dex文件中定義的類是否已經(jīng)被加載到內(nèi)存中。
優(yōu)選的,如上所述的裝置,還包括:
類檢測線程創(chuàng)建模塊,用于在接收安卓應(yīng)用程序啟動指令前,創(chuàng)建所述類檢測線程;
類檢測線程關(guān)閉模塊,用于在刪除所述類的類數(shù)據(jù)信息class_data_item后,關(guān)閉所述類檢測線程。
優(yōu)選的,如上所述的裝置,所述dex文件中定義的類class包括安卓應(yīng)用程序的dex文件中定義的至少一個類。
優(yōu)選的,如上所述的裝置,所述類數(shù)據(jù)刪除模塊包括:
類數(shù)據(jù)查找單元,用于根據(jù)dex文件的類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off,查找到dex文件數(shù)據(jù)區(qū)段data中該類的類數(shù)據(jù)信息class_data_item;
類數(shù)據(jù)刪除單元,用于刪除查找到的類數(shù)據(jù)信息class_data_item。
優(yōu)選的,如上所述的裝置,還包括:
類偏移修改模塊,用于在刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item后,將所述dex文件的類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off的值修改為0。
優(yōu)選的,如上所述的裝置,所述類數(shù)據(jù)刪除模塊包括:
類緩存判斷單元,用于通過檢測安卓操作系統(tǒng)中的dex文件路徑列表DexPathList的dex元素數(shù)組dexElements中是否存在所述類的緩存標識,判斷所述類是否已經(jīng)被加載到內(nèi)存空間中。
優(yōu)選的,如上所述的裝置,所述類的緩存標識為類的變量值cookie,所述變量值cookie為加載后的類所在的內(nèi)存地址。
本發(fā)明的有益效果在于:本發(fā)明實施例中所提供的dex文件的存儲方法和裝置,在安卓應(yīng)用程序APP啟動時,通過對應(yīng)用程序的dex文件中定義的類的內(nèi)存加載狀態(tài)進行檢測,在檢測到所述類已經(jīng)被加載到內(nèi)存后,刪除dex文件結(jié)構(gòu)中所述類的類數(shù)據(jù)信息,從而避免了在程序運行時,能夠通過dexdump等dex文件內(nèi)存提取工具從內(nèi)存中提取到完整的dex文件的問題,達到了保護dex文件的目的,該方法和裝置,有效避免了dex文件的內(nèi)存提取,避免了被動態(tài)反編譯,提高了dex文件動態(tài)加載的安全性。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,附圖僅限于示出優(yōu)選實施方式的目的,而并不認為是本發(fā)明的限制,且對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明的一個實施例中一種dex文件的存儲方法的流程示意圖;
圖2為本發(fā)明的一個實施例中dex文件的類列表區(qū)段class_defs的部分結(jié)構(gòu)示意圖;
圖3為本發(fā)明的一個實施例中一種dex文件的存儲方法的流程示意圖;
圖4為本發(fā)明的一個實施例中一種dex文件的存儲方法的流程示意圖;
圖5為本發(fā)明的一個實施例中一種dex文件的存儲裝置的結(jié)構(gòu)示意圖;
圖6為本發(fā)明的一個實施例中一種dex文件的存儲裝置的結(jié)構(gòu)示意圖;
圖7為本發(fā)明一個實施例中的類數(shù)據(jù)刪除模塊的結(jié)構(gòu)示意圖;
圖8為本發(fā)明一個實施例中的類數(shù)據(jù)刪除模塊的結(jié)構(gòu)示意圖;
圖9為本發(fā)明的一個實施例中一種dex文件的存儲裝置的結(jié)構(gòu)示意圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,均屬于本發(fā)明保護的范圍。
圖1示出了本發(fā)明的一個實施例中提供的一種防止從內(nèi)存中提取dex文件方法的流程示意圖,該方法主要可以包括以下步驟:
步驟S110:運行安卓應(yīng)用程序,解析并加載安卓應(yīng)用程序的dex文件;
步驟S120:檢測所述dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中;
步驟S130:當檢測到所述類已經(jīng)被加載到內(nèi)存空間中時,刪除所述dex文件中所述類的類數(shù)據(jù)信息。
本實施例中,在運行安卓應(yīng)用程序運行時,由Dalvik虛擬機進行所需要啟動的應(yīng)用程序的dex文件的底層解析與加載,將dex文件的各部分內(nèi)容加載到內(nèi)存中,在dex文件的解析與加載過程中,當檢測dex文件中定義的類已經(jīng)被加載到了內(nèi)存空間中時,則刪除dex文件中該類的類數(shù)據(jù)信息class_data_item。其中,定義的類被加載到內(nèi)存空間指的即使該類的類數(shù)據(jù)信息class_data_item已經(jīng)被存儲到內(nèi)存空間中。
在實際操作中,由于dex文件中定義的類class已經(jīng)被加載存儲到了內(nèi)存空間中,因此,刪除dex文件中的類數(shù)據(jù)信息class_data_item是不會影響應(yīng)用程序的正常運行的。
本實施例中,所述dex文件中定義的類包括安卓應(yīng)用程序的dex文件中定義的至少一個類。
classes.dex文件(本發(fā)明實施例中簡稱為dex文件)是Android平臺上可執(zhí)行文件的類型,dex文件的類列表區(qū)段class_defs中存放著classdefinitions即類class的定義,類列表區(qū)段class_defs的數(shù)據(jù)格式為class_def_item,class_def_item結(jié)構(gòu)中的class_idx描述了具體類class類型。本實施例中所述dex文件中定義的類class即是class_idx中描述的至少一個類class。
本實施例中提供的所述dex文件的存儲方法,通過將已經(jīng)加載到內(nèi)存中的dex文件中的類class的類數(shù)據(jù)信息class_data_item進行抹除,使得即使采用dexdump工具從內(nèi)存中的提取dex文件,由于至少一個類class的數(shù)據(jù)信息class_data_item不存在,因此,無法從內(nèi)存中dump到完成dex文件,有效避免了dex文件的內(nèi)存提取。
在本發(fā)明的一個實施例中,步驟S130中,所述刪除所述dex文件中所述類的類數(shù)據(jù)信息,包括:
根據(jù)dex文件的類列表區(qū)段class_defs中所述類class的類數(shù)據(jù)偏移地址class_data_off,查找到dex文件數(shù)據(jù)區(qū)段data中該類class的類數(shù)據(jù)信息class_data_item并刪除。
class_data_off是上述class_def_item結(jié)構(gòu)中的一個類的偏移地址,指向的內(nèi)容是對應(yīng)的類class所需要使用到的數(shù)據(jù),位置在dex文件的數(shù)據(jù)區(qū)段data中,格式為class_data_item,class_data_item中描述的是類class所要使用到的數(shù)據(jù)信息。因此,對于所述類class,根據(jù)其類數(shù)據(jù)偏移地址class_data_off即可在數(shù)據(jù)區(qū)段data找到該類的類數(shù)據(jù)信息。
如圖2所示,為dex文件中類列表區(qū)段class_defs的部分結(jié)構(gòu)示意圖,圖中第二個矩形框中的內(nèi)容即為某個類的類數(shù)據(jù)信息class_data_item的結(jié)構(gòu)示意圖,本實施例中,所述刪除內(nèi)存中dex文件的中某一個類的類數(shù)據(jù)信息即是刪除圖2中第二個矩形框中的內(nèi)容。
需要說明的是,圖2中的英文內(nèi)容均是安卓dex文件中的通用數(shù)據(jù)結(jié)構(gòu),對本領(lǐng)域技術(shù)人員來說都是清楚的,在此不再對其中的內(nèi)容進行一一說明。
在本發(fā)明的一個實施例中,步驟S120中,所述檢測所述dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中,包括:
通過檢測安卓操作系統(tǒng)中的dex文件路徑列表DexPathList的dex元素數(shù)組dexElements中是否存在所述類的緩存標識,判斷所述類是否已經(jīng)被加載到內(nèi)存空間中。
在將dex文件中定義的類class加載到內(nèi)存后,即將類的類數(shù)據(jù)信息class_data_item加載到內(nèi)存中后,會將類所存儲在的內(nèi)存地址作為一個元素添加到安卓操作系統(tǒng)中的dex文件路徑列表DexPathList的dex元素數(shù)組dexElements中,以建立安卓操作系統(tǒng)的底層與上層的通信調(diào)用,由dex類加載器Dexclassloader根據(jù)dex元素數(shù)組dexElements中的元素完成上層dex文件的動態(tài)加載。因此,可以通過檢測類的緩存標識在dex元素數(shù)組dexElements中是否存在,來判斷類是否加載完成,當某個定義的類的緩存標識存在時,則表明該類已經(jīng)加載到了內(nèi)存空間中。
在本發(fā)明的一個實施例中,所述類的緩存標識可以為類的變量值cookie,所述變量值cookie即為完成底層加載后的類所在的內(nèi)存地址。
圖3示出了本發(fā)明的一個實施例中提供的一種防止從內(nèi)存中提取dex文件方法的流程示意圖,該方法主要可以包括以下步驟:
步驟S310:創(chuàng)建類檢測線程,
本實施例中,首先創(chuàng)建一類檢測線程,所述類檢測線程用于在安卓應(yīng)用程序APP的啟動過程中,檢測安卓應(yīng)用程序APP的dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中。
需要說明的是,所述創(chuàng)建類檢測線程的步驟,只需要執(zhí)行一次,完成一次類檢測線程的創(chuàng)建后,在后續(xù)安卓應(yīng)用程序啟動時,自動啟動該線程即可。
步驟S320:接收安卓應(yīng)用程序啟動指令,啟動所述類檢測線程;
在接收到安卓應(yīng)用程序AAP的啟動指令時,首先啟動所述類檢測線程,其中,所述安卓應(yīng)用程序啟動指令,即用戶在終端設(shè)備上的點擊或其它應(yīng)用程序的啟動動作,在接收到用戶對所需要啟動的應(yīng)用程序的啟動指令后,首先啟動上述類檢測線程,即在應(yīng)用程序啟動之前,先啟動類檢測線程,以實現(xiàn)對應(yīng)用程序運行過程中dex文件中定義的類class的加載狀態(tài)進行檢測。
步驟S330:運行安卓應(yīng)用程序,解析加載安卓應(yīng)用程序的dex文件;
步驟S340:當類檢測線程檢測所述類已經(jīng)被加載到內(nèi)存空間中時,刪除所述dex文件中所述類的類數(shù)據(jù)信息;
在所述類檢測線程啟動后,進入安卓應(yīng)用程序運行過程,由Dalvik虛擬機進行所需要啟動的應(yīng)用程序的dex文件的底層解析與加載,將dex文件的各部分內(nèi)容加載到內(nèi)存中,在dex文件的解析與加載過程中,所述類檢測程序檢測dex文件的定義的類class是否已經(jīng)被加載到內(nèi)存空間中,當檢測到所述類class的類數(shù)據(jù)信息class_data_item已經(jīng)被加載完成后,則刪除內(nèi)存中所述dex文件中的所述類class的類數(shù)據(jù)信息class_data_item。
步驟S350:關(guān)閉所述類檢測線程。
將內(nèi)存中的所述dex文件中所述類的類數(shù)據(jù)信息class_data_item刪除后,關(guān)閉所述類檢測線程。當所述類為兩個或兩個以上時,則在分別刪除完dex文件中所述兩個或兩個以上的類的類數(shù)據(jù)信息class_data_item后,關(guān)閉類檢測線程。
在本發(fā)明的一個實施例中,如圖4所示,在刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item后,所述存儲方法還可以包括:
步驟S140:將所述dex文件的類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off的值修改為0。
本實施例中,通過將所述類class的類偏移地址class_data_off的值修改為0,進一步刪除了該類class的相關(guān)信息。class_data_off的值為0表明在數(shù)據(jù)區(qū)中不存在相應(yīng)的類數(shù)據(jù)信息,對于圖2中所示的結(jié)構(gòu),將類數(shù)據(jù)偏移地址class_data_off的值修改為0即是將圖2中第一個矩形框中的class_data_off修改成0。
對應(yīng)于圖1中所示的方法,本發(fā)明的一個實施例中還提供了一種dex文件的存儲裝置,如圖5所示,該裝置可以包括dex文件解析加載模塊110、類加載狀態(tài)檢測模塊120和類數(shù)據(jù)刪除模塊130。其中:
dex文件解析加載模塊110,用于運行安卓應(yīng)用程序,解析并加載安卓應(yīng)用程序的dex文件;
類加載狀態(tài)檢測模塊120,用于檢測所述dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中;
類數(shù)據(jù)刪除模塊130,用于當檢測到所述類已經(jīng)被加載到內(nèi)存空間中時,刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item。
其中,所述dex文件中定義的類包括安卓應(yīng)用程序的dex文件中的至少一個類。
本實施例中所述的dex文件的存儲裝置,通過在完成dex文件中定義的類的內(nèi)存加載存儲后,將dex文件中定義的類的類數(shù)據(jù)信息進行刪除,使得dexdump等內(nèi)存提取工具無法從內(nèi)存中提取到完整的dex文件,保證了dex文件的動態(tài)加載的安全。
在本發(fā)明的一個實施例中,所述存儲裝置還可以包括類檢測線程創(chuàng)建模塊140、類檢測線程啟動模塊150和類檢測線程關(guān)閉模塊160,如圖6所示。其中:
類檢測線程創(chuàng)建模塊140,用于在接收安卓應(yīng)用程序啟動指令前,創(chuàng)建類檢測線程;所述類檢測線程用于在安卓應(yīng)用程序啟動過程中,檢測安卓應(yīng)用程序的dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中;
類檢測線程啟動模塊150,用于在接收運行安卓應(yīng)用程序啟動指令前,接收安卓應(yīng)用程序啟動指令,啟動所述類檢測線程;
類檢測線程關(guān)閉模塊160,用于在刪除內(nèi)存中的所述dex文件中所述類的類數(shù)據(jù)信息class_data_item后,關(guān)閉所述類檢測線程。
在本發(fā)明的一個實施例中,如圖7所示,所述類數(shù)據(jù)刪除模塊130包括類數(shù)據(jù)查找單元132和類數(shù)據(jù)刪除單元133。其中:
類數(shù)據(jù)查找單元132,用于根據(jù)dex文件的類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off,查找到dex文件數(shù)據(jù)區(qū)段data中該類的類數(shù)據(jù)信息class_data_item;
類數(shù)據(jù)刪除單元133,用于刪除查找到的類數(shù)據(jù)信息class_data_item。
在本發(fā)明的一個實施例中,如圖8所示,所述類數(shù)據(jù)刪除模塊130包括類緩存判斷單元131。其中:
類緩存判斷單元131,用于通過監(jiān)測檢測安卓操作系統(tǒng)中的dex文件路徑列表DexPathList的dex元素數(shù)組dexElements中是否存在所述類的緩存標識,判斷所述類是否已經(jīng)被加載到內(nèi)存空間中。
在本發(fā)明的一個實施例中,所述類的緩存標識可以為類的變量值cookie,所述變量值cookie為加載后的類所在的內(nèi)存地址。
在本發(fā)明的一個實施例中,如圖9所示,所述裝置還可以類偏移修改模塊170。其中:
類偏移修改模塊170,用于在刪除內(nèi)存中的dex文件中所述類的類數(shù)據(jù)信息class_data_item后,將類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off的值修改為0。
本實施例中,通過類偏移地址修改模塊180進一步刪除了所述類class的相關(guān)信息。
本發(fā)明實施例中所提供的dex文件的存儲方法和裝置,在安卓應(yīng)用程序APP的運行過程中,通過對dex文件中定義的類的內(nèi)存加載狀態(tài)進行檢測,在檢測到所述類已經(jīng)加載到內(nèi)存即在內(nèi)存中緩存好之后,即刪除dex文件結(jié)構(gòu)中所述類的類數(shù)據(jù)信息,從而避免了在程序運行時,能夠通過dexdump等dex文件內(nèi)存提取工具從內(nèi)存中提取到完整的dex文件的問題,達到保護dex文件的目的。
需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個實體或者操作與另一個實體或操作區(qū)分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設(shè)備中還存在另外的相同要素。
本說明書中的各個實施例均采用相關(guān)的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對于裝置實施例而言,由于其基本相似于方法實施例,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。
本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述裝置實施方式中各部分的全部或部分可以以硬件實現(xiàn),或者以在一個或多個硬件上運行的軟件模塊來實現(xiàn),方法實施方式中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成。本領(lǐng)域技術(shù)人員應(yīng)該明白,本發(fā)明所述的方法和裝置并不限于具體實施方式中所述的實施例,上面的具體描述只是為了解釋本發(fā)明的目的,并非用于限制本發(fā)明。本領(lǐng)域技術(shù)人員根據(jù)本發(fā)明的技術(shù)方案得出其他的實施方式,同樣屬于本發(fā)明的技術(shù)創(chuàng)新范圍,本發(fā)明的保護范圍由權(quán)利要求及其等同物限定。
本發(fā)明的實例中公開了:A1、一種dex文件的存儲方法,包括:
運行安卓應(yīng)用程序,解析并加載安卓應(yīng)用程序的dex文件;
檢測所述dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中;
當檢測到所述類已經(jīng)被加載到內(nèi)存空間中時,刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item。
A2、根據(jù)A1所述的方法,所述運行安卓應(yīng)用程序前,包括:
接收安卓應(yīng)用程序啟動指令,啟動類檢測線程;所述類檢測線程用于在安卓應(yīng)用程序啟動過程中,檢測安卓應(yīng)用程序的dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中。
A3、根據(jù)A2所述的方法,接收安卓應(yīng)用程序啟動指令前,還包括:創(chuàng)建所述類檢測線程;
在刪除所述類的類數(shù)據(jù)信息class_data_item后,關(guān)閉所述類檢測線程。
A4、根據(jù)權(quán)利要求1至3之一所述的方法,其特征在于,所述dex文件中定義的類包括安卓應(yīng)用程序的dex文件中的定義的至少一個類。
A5、根據(jù)A1至A3之一所述的方法,刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item,包括:
根據(jù)dex文件的類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off,查找到dex文件數(shù)據(jù)區(qū)段data中該類的類數(shù)據(jù)信息class_data_item并刪除。
A6、根據(jù)A1至A3之一所述的方法,刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item后,還包括:
將所述dex文件的類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off的值修改為0。
A7、根據(jù)A1至A3之一所述的方法,所述檢測所述dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中,包括:
通過檢測安卓操作系統(tǒng)中的dex文件路徑列表DexPathList的dex元素數(shù)組dexElements中是否存在所述類的緩存標識,判斷所述類是否已經(jīng)被加載到內(nèi)存空間中。
A8、根據(jù)A7所述的方法,所述類的緩存標識為所述類的變量值cookie,所述變量值cookie為加載后的類所在的內(nèi)存地址。
本發(fā)明實施例中公開了:B9、一種dex文件的存儲裝置,包括:
dex文件解析加載模塊,用于運行安卓應(yīng)用程序,解析并加載安卓應(yīng)用程序的dex文件;
類加載狀態(tài)檢測模塊,用于檢測所述dex文件中定義的類是否已經(jīng)被加載到內(nèi)存空間中;
類數(shù)據(jù)刪除模塊,用于當檢測到所述類已經(jīng)被加載到內(nèi)存空間中時,刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item。
B10、根據(jù)B9所述的裝置,該裝置還包括:
類檢測線程啟動模塊,用于在運行安卓應(yīng)用程序前,接收安卓應(yīng)用程序啟動指令,啟動類檢測線程;所述類檢測線程用于在安卓應(yīng)用程序啟動過程中,檢測安卓應(yīng)用程序的dex文件中定義的類是否已經(jīng)被加載到內(nèi)存中。
B11、根據(jù)B10所述的裝置,還包括:
類檢測線程創(chuàng)建模塊,用于在接收安卓應(yīng)用程序啟動指令前,創(chuàng)建所述類檢測線程;
類檢測線程關(guān)閉模塊,用于在刪除所述類的類數(shù)據(jù)信息class_data_item后,關(guān)閉所述類檢測線程。
B12、根據(jù)B9至B11之一所述的裝置,所述dex文件中定義的類class包括安卓應(yīng)用程序的dex文件中定義的至少一個類。
B13、根據(jù)B9至B11之一所述的裝置,所述類數(shù)據(jù)刪除模塊包括:
類數(shù)據(jù)查找單元,用于根據(jù)dex文件的類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off,查找到dex文件數(shù)據(jù)區(qū)段data中該類的類數(shù)據(jù)信息class_data_item;
類數(shù)據(jù)刪除單元,用于刪除查找到的類數(shù)據(jù)信息class_data_item。
B14、根據(jù)B9至B11之一所述的裝置,還包括:
類偏移修改模塊,用于在刪除所述dex文件中所述類的類數(shù)據(jù)信息class_data_item后,將所述dex文件的類列表區(qū)段class_defs中所述類的類數(shù)據(jù)偏移地址class_data_off的值修改為0。
B15、根據(jù)B9至B11之一所述的裝置,所述類數(shù)據(jù)刪除模塊包括:
類緩存判斷單元,用于通過檢測安卓操作系統(tǒng)中的dex文件路徑列表DexPathList的dex元素數(shù)組dexElements中是否存在所述類的緩存標識,判斷所述類是否已經(jīng)被加載到內(nèi)存空間中。
B16、根據(jù)B15所述的裝置,所述類的緩存標識為類的變量值cookie,所述變量值cookie為加載后的類所在的內(nèi)存地址。
顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其同等技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。