Apk文件的快速加載方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明設(shè)及移動(dòng)終端應(yīng)用軟件技術(shù)領(lǐng)域,尤其設(shè)及一種ΑΡΚ文件的快速加載方 法。
【背景技術(shù)】
[0002] ΑΡΚ(Αη化oid化cKage)的縮寫即An化oid安裝包。將ΑΡΚ文件(即ΑΡΚ應(yīng)用程 序)直接傳到An化oid模擬器或An化oid操作系統(tǒng)的終端設(shè)備(比如安卓智能手機(jī))中執(zhí) 行即可安裝。APK文件其實(shí)是zip格式,但后綴名被修改為apk,在windows系統(tǒng)上可W通 過解壓縮工具(比如winrar軟件)直接解壓查看。解壓APK文件后,一般的可看到的目錄
[0003] 結(jié)構(gòu)如下表所示:
[0004]
陽(yáng)0化]其中classes,dex文件內(nèi)包含可執(zhí)行代碼,較早的An化oid操作系統(tǒng)版本只支 持一個(gè)呢X文件,但是隨著硬件性能提高,應(yīng)用的執(zhí)行代碼越來越龐大,一個(gè)呢X文件已 經(jīng)無(wú)法滿足需求,所W在最新的AmlroidS. 0版操作系統(tǒng)中原生支持加載多個(gè)DEX文件 (classes,dex,classes2.dex,···classesN.dex)?,F(xiàn)有的多DEX加載方案的工作流程如 下:
[0006] 1)啟動(dòng)時(shí)檢查當(dāng)前An化oid系統(tǒng)的版本,如果大于An化oid5. 0版本,流程結(jié)束,否 則進(jìn)入下一步;
[0007] 2)遍歷APK文件中所包含的文件,找到所包含的DEX文件。因?yàn)锳mlroid系統(tǒng)只 能加載JAR文件(文件名Wjar"結(jié)尾的ZIP文件,里面包含classes,dex),所W將APK 中的DEX文件解壓后重新壓縮成ZIP文件。 陽(yáng)00引 3)對(duì)解壓出的DEX文件逐個(gè)調(diào)用AiKlroid系統(tǒng)提供的DexFile.loa曲exQ函數(shù), 將DEX加載到系統(tǒng),并添加到已加載DEX的列表中。
[0009] 運(yùn)種加載方式消耗的時(shí)間過長(zhǎng),導(dǎo)致應(yīng)用啟動(dòng)緩慢,長(zhǎng)時(shí)間無(wú)法顯示出界面,用戶 體驗(yàn)差。
【發(fā)明內(nèi)容】
[0010] 本發(fā)明要解決的技術(shù)問題是:為了解決現(xiàn)有的APK文件的加載方法消耗的時(shí)間過 長(zhǎng),導(dǎo)致應(yīng)用啟動(dòng)緩慢,長(zhǎng)時(shí)間無(wú)法顯示出界面,用戶體驗(yàn)差的問題,本發(fā)明提供了一種APK 文件的快速加載方法來解決上述問題。 W11] 本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:一種APK文件的快速加載方法,包 括W下步驟:
[0012] S1、解壓所述APK文件并提取其中的DEX文件,將所述DEX文件壓縮成JAR文件,其 中所述DEX文件的數(shù)量為多個(gè),文件名分別為classes2.dex,classes3.dex,…classesN. dex;
[0013] S2、初始化一個(gè)VM(虛擬機(jī)),所述VM將至少一個(gè)所述DEX文件制作成ODEX文件, 并且在0DEX文件的制作過程中對(duì)DEX文件中包含的零個(gè)類進(jìn)行驗(yàn)證和優(yōu)化;
[0014] S3、所述VM調(diào)用函數(shù)DexFile.loa曲exQ加載所述0DEX文件。
[0015] 作為優(yōu)選,在所述步驟S3中,如果一個(gè)0DEX文件在加載時(shí)出現(xiàn)異常,所述VM則對(duì) 此0DEX文件中包含的所有類進(jìn)行驗(yàn)證,尋找非法指令序列。
[0016] 作為優(yōu)選,在所述步驟S3中,如果加載時(shí)出現(xiàn)異常的0DEX文件通過驗(yàn)證,所述VM 則對(duì)此0DEX文件進(jìn)行優(yōu)化。
[0017] 作為優(yōu)選,所述VM為化Iv化VM,在所述步驟S2中,所述化Iv化VM調(diào)用函數(shù) dexopt將DEX文件制作成0DEX文件。
[0018] 作為優(yōu)選,在所述步驟S3中,如果一個(gè)0DEX文件在加載時(shí)出現(xiàn)異常,所述化Iv化 VM調(diào)用函數(shù)dexopt對(duì)此0DEX文件中包含的所有類進(jìn)行驗(yàn)證,尋找非法指令序列。
[0019] 作為優(yōu)選,如果加載時(shí)出現(xiàn)異常的0DEX文件通過驗(yàn)證,所述化Iv化VM調(diào)用函數(shù) dexopt對(duì)此0DEX文件進(jìn)行優(yōu)化。
[0020] 作為優(yōu)選,所述VM為ARTVM,在所述步驟S2中,所述ARTVM調(diào)用函數(shù)dex2oat將 DEX文件制作成0DEX文件。
[0021] 作為優(yōu)選,在所述步驟S3中,如果一個(gè)0DEX文件在加載時(shí)出現(xiàn)異常,所述ARTVM 調(diào)用函數(shù)dex2oat對(duì)此ODEX文件中包含的所有類進(jìn)行驗(yàn)證,尋找非法指令序列。
[0022] 作為優(yōu)選,如果加載時(shí)出現(xiàn)異常的0DEX文件通過驗(yàn)證,所述ARTVM調(diào)用函數(shù) dex2oat對(duì)此0DEX文件進(jìn)行優(yōu)化。
[0023] 作為優(yōu)選,在所述APK文件的文件結(jié)構(gòu)中所述文件
[0024] classes2.dex,classes3.dex,…classesN.dex分別對(duì)應(yīng)一個(gè)Centraldirectoiy file、一個(gè)Localfileheader和一個(gè)數(shù)據(jù)內(nèi)容,在所述步驟SI中,所述文件classes2. dex壓縮成JAR文件的具體步驟為:首先復(fù)制所述文件classes2.dex對(duì)應(yīng)的Central directcxryfile、Localfileheader和數(shù)據(jù)內(nèi)容并且將它們構(gòu)成JAR文件的文件結(jié)構(gòu), 然后將Centraldirectoiyfile中的文件名修改為classes,dex,最后調(diào)整Central directoryfile中的指針指向Localfileheader;
[00巧]所述文件classes3.dex,classes4.dex."classesN.dex壓縮成JAR文件的具體步 驟與所述文件classes2.dex壓縮成JAR文件的具體步驟一致。
[00%] 本發(fā)明的有益效果是,運(yùn)種APK文件的快速加載方法在制作0呢X文件時(shí)省略了驗(yàn) 證和優(yōu)化的過程,而是將驗(yàn)證和優(yōu)化的過程安排在加載ODEX文件發(fā)生異常時(shí)進(jìn)行,不僅能 夠?qū)EX文件更快地加載到操作系統(tǒng)中,減少加載所消耗的時(shí)間,應(yīng)用啟動(dòng)快,界面顯示及 時(shí),提升了用戶體驗(yàn),而且不會(huì)影響應(yīng)用軟件的正常運(yùn)行,機(jī)器性能也得到更好的發(fā)揮。
【附圖說明】
[0027] 下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明進(jìn)一步說明。
[0028] 圖1是本發(fā)明的一種APK文件的快速加載方法的實(shí)施例一的流程圖。
[0029] 圖2是本發(fā)明的一種APK文件的快速加載方法的實(shí)施例四的流程圖。
【具體實(shí)施方式】
[0030] 下面詳細(xì)描述本發(fā)明的實(shí)施例,所述實(shí)施例的示例在附圖中示出,其中自始至終 相同或類似的標(biāo)號(hào)表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考 附圖描述的實(shí)施例是示例性的,僅用于解釋本發(fā)明,而不能理解為對(duì)本發(fā)明的限制。相反, 本發(fā)明的實(shí)施例包括落入所附加權(quán)利要求書的精神和內(nèi)涵范圍內(nèi)的所有變化、修改和等同 物。
[0031] 在本發(fā)明的描述中,需要理解的是,術(shù)語(yǔ)"中屯、"、"縱向"、"橫向"、"長(zhǎng)度"、"寬度"、 "厚度"、"上"、"下"、"前"、"后"、"左"、"右"、"豎直"、"水平"、"頂"、"底""內(nèi)"、"外"、"軸向"、 "徑向"、"周向"等指示的方位或位置關(guān)系為基于附圖所示的方位或位置關(guān)系,僅是為了便 于描述本發(fā)明和簡(jiǎn)化描述,而不是指示或暗示所指的裝置或元件必須具有特定的方位、W 特定的方位構(gòu)造和操作,因此不能理解為對(duì)本發(fā)明的限制。
[0032] 此外,術(shù)語(yǔ)"第一"、"第二"等僅用于描述目的,而不能理解為指示或暗示相對(duì)重要 性。在本發(fā)明的描述中,需要說明的是,除非另有明確的規(guī)定和限定,術(shù)語(yǔ)"相連"、"連接" 應(yīng)做廣義理解,例如,可W是固定連接,也可W是可拆卸連接,或一體地連接;可W是機(jī)械連 接,也可W是電連接;可W是直接相連,也可W通過中間媒介間接相連。對(duì)于本領(lǐng)域的普通 技術(shù)人員而言,可W具體情況理解上述術(shù)語(yǔ)在本發(fā)明中的具體含義。此外,在本發(fā)明的描述 中,除非另有說明,"多個(gè)"的含義是兩個(gè)或兩個(gè)W上。
[0033] 流程圖中或在此W其他方式描述的任何過程或方法描述可W被理解為,表示包括 一個(gè)或更多個(gè)用于實(shí)現(xiàn)特定邏輯功能或過程的步驟的可執(zhí)行指令的代碼的模塊、片段或部 分,并且本發(fā)明的優(yōu)選實(shí)施方式的范圍包括另外的實(shí)現(xiàn),其中可W不按所示出或討論的順 序,包括根據(jù)所設(shè)及的功能按基本同時(shí)的方式或按相反的順序,來執(zhí)行功能,運(yùn)應(yīng)被本發(fā)明 的實(shí)施例所屬技術(shù)領(lǐng)域的技術(shù)人員所理解。
[0034] 實(shí)施例一,
[00對(duì)如圖1所示,本發(fā)明提供了一種APK文件的快速加載方法,包括W下步驟:
[0036] S1、解壓APK文件并提取其中的DEX文件,將DEX文件壓縮成JAR文件,其中DEX 文件的數(shù)量為多個(gè),文件名分別為classes2.dex,classes3.dex, ???classesN.dex;
[0037] S2、初始化一個(gè)VM(虛擬機(jī)),VM將至少一個(gè)DEX文件制作成ODEX文件,并且在 ODEX文件的制作過程中對(duì)DEX文件中包含的零個(gè)類進(jìn)行驗(yàn)證和優(yōu)化;
[0038] S3、VM調(diào)用函數(shù)DexFile.loa曲exQ加載ODEX文件。
[0039] VM調(diào)用函數(shù)DexFile.loa曲exQ加載DEX文件時(shí),首先會(huì)檢查DEX文件對(duì)應(yīng)的 0DEX文件是否已經(jīng)存在,如果已經(jīng)存在則直接進(jìn)行加載。現(xiàn)有技術(shù)中0DEX文件的制作過程 中最主要的是驗(yàn)證和優(yōu)化的DEX,其中驗(yàn)證過程設(shè)及到每個(gè)DEX文件中的所有類和類中的 所有方法中的指令,目標(biāo)是檢查非法指令序列,驗(yàn)證通過再進(jìn)行優(yōu)化,優(yōu)化和驗(yàn)證雖然可W 保證程序安全高效的運(yùn)行,但是它們也是最消耗性能,導(dǎo)致應(yīng)用長(zhǎng)時(shí)間無(wú)法響應(yīng),降低用戶 體驗(yàn)原因所在;其實(shí)DEX文件不經(jīng)過驗(yàn)證和優(yōu)化也可W正常執(zhí)行,因此本發(fā)明的提供一種 APK文件的快速加載方法在VM調(diào)用函數(shù)DexFile.loadDex0加載0DEX文件之前快速制作 0DEX文件,其中通過自定義參數(shù)在0DEX文件的制作過程中取消了驗(yàn)證和優(yōu)化兩個(gè)步驟,進(jìn) 而大大降低了加載DEX文件所消耗的時(shí)間。
[0040] 前期省略了驗(yàn)證和優(yōu)化兩個(gè)步驟可能會(huì)導(dǎo)致程序在運(yùn)行時(shí)出現(xiàn)異常狀態(tài),如果一 個(gè)0DEX文件在加載時(shí)出現(xiàn)異常,VM則對(duì)此0DEX文件中包含的所有類進(jìn)行驗(yàn)證,尋找非法指 令序列;如果驗(yàn)證不通過,說明0DEX文件中有非法指令序列,則產(chǎn)出錯(cuò)誤報(bào)告,如果0DEX文 件通過驗(yàn)證,說明不存在非法指令,那么考慮到有