一種應用啟動方法及裝置的制造方法
【專利摘要】本發(fā)明實施例提供一種應用啟動方法及裝置,其中的應用啟動方法可包括:獲取第一壓縮文件,所述第一壓縮文件包含目標應用的啟動信息以及所述目標應用的代碼包dex壓縮內(nèi)容;從所述第一壓縮文件中提取所述dex壓縮內(nèi)容;將所述dex壓縮內(nèi)容生成第二壓縮文件;加載所述第二壓縮文件中的所述dex壓縮內(nèi)容,并根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用。采用本發(fā)明實施例可節(jié)省解壓和再壓縮時間,減少目標應用啟動時間,提高用戶體驗。
【專利說明】
_種應用啟動方法及裝置
技術(shù)領域
[0001]本發(fā)明涉及通信技術(shù)領域,具體涉及一種應用啟動方法及裝置?!颈尘凹夹g(shù)】
[0002]Android系統(tǒng)限制每個dex(代碼包)只能包含最多65535個方法數(shù),在開發(fā)期間,編譯工具就按照這一限制,將程序代碼編譯為若干個方法數(shù)不超過65535的dex包。在安裝應用后首次啟動該應用時,將順序加載所有dex。
[0003]現(xiàn)有技術(shù)在首次啟動該應用時,具體加載dex的方法按照圖1所示流程:用戶點擊圖標,應用進行dex裝載,從安卓系統(tǒng)安裝包(Android Package,APK)文件中找到dex壓縮內(nèi)容,然后將該dex壓縮內(nèi)容解壓到臨時目錄,再重新壓縮為zip文件,以zip形式加載所有dex 方法,進入應用主界面。
[0004]從上述可知,在首次啟動安裝的應用時,需要占用較多時間來執(zhí)行解壓以及重新壓縮的操作,dex數(shù)量越多,耗時越長,設備越低端,耗時越長。此操作發(fā)生在啟動界面和主界面顯示之前,用戶可明顯感知到點擊應用圖標到看到界面變化之間有長時間等待,用戶體驗差。
【發(fā)明內(nèi)容】
[0005]本發(fā)明實施例提供一種應用啟動方法及裝置,可節(jié)省解壓和再壓縮時間,減少目標應用啟動時間,提尚用戶體驗。
[0006]本發(fā)明第一方面提供一種應用啟動方法,包括:
[0007]獲取第一壓縮文件,所述第一壓縮文件包含目標應用的啟動信息以及所述目標應用的代碼包dex壓縮內(nèi)容;
[0008]從所述第一壓縮文件中提取所述dex壓縮內(nèi)容;
[0009]將所述dex壓縮內(nèi)容生成第二壓縮文件;
[0010]加載所述第二壓縮文件中的所述dex壓縮內(nèi)容,并根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用。
[0011]本發(fā)明第二方面提供一種應用啟動裝置,包括:
[0012]獲取模塊,用于獲取第一壓縮文件,所述第一壓縮文件包含目標應用的啟動信息以及所述目標應用的代碼包dex壓縮內(nèi)容;
[0013]提取模塊,用于從所述第一壓縮文件中提取所述dex壓縮內(nèi)容;[〇〇14]生成模塊,用于將所述dex壓縮內(nèi)容生成第二壓縮文件;
[0015]啟動模塊,用于加載所述第二壓縮文件中的所述dex壓縮內(nèi)容,并根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用。
[0016]實施本發(fā)明實施例,具有如下有益效果:
[0017]本發(fā)明實施例,獲取第一壓縮文件,該第一壓縮文件包含目標應用的啟動信息以及目標應用的dex壓縮內(nèi)容,從該第一壓縮文件中提取該dex壓縮內(nèi)容,將該dex壓縮內(nèi)容生成第二壓縮文件,加載第二壓縮文件中的dex壓縮內(nèi)容,并根據(jù)第一壓縮文件中的啟動信息啟動目標應用。這種方式可節(jié)省解壓和再壓縮dex包的時間,減少目標應用啟動時間,提高用戶體驗?!靖綀D說明】
[0018]為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0019]圖1為本發(fā)明實施例提供的現(xiàn)有技術(shù)中應用啟動流程圖;
[0020]圖2為本發(fā)明實施例提供的一種應用啟動方法的流程圖;
[0021]圖3為本發(fā)明實施例提供的另一種應用啟動方法的流程圖;[〇〇22]圖4為本發(fā)明實施例提供的一種優(yōu)化dex解壓速度的流程圖;[〇〇23]圖5為本發(fā)明實施例提供的一種后臺加載的流程圖;
[0024]圖6為本發(fā)明實施例提供的一種產(chǎn)品界面示意圖;
[0025]圖7為本發(fā)明實施例提供的一種優(yōu)化比較示意圖;
[0026]圖8為本發(fā)明實施例提供的一種應用啟動框圖;
[0027]圖9為本發(fā)明實施例提供的一種應用啟動裝置的結(jié)構(gòu)示意圖;
[0028]圖10為本發(fā)明實施例提供的一種生成模塊的結(jié)構(gòu)示意圖;
[0029]圖11為本發(fā)明實施例提供的一種啟動模塊的結(jié)構(gòu)示意圖?!揪唧w實施方式】
[0030]下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
[0031]本發(fā)明實施例中,所述目標應用為安裝在終端上的任何應用,包括但不限于瀏覽器、電子郵件、即時消息服務、文字處理、鍵盤虛擬、窗口小部件(Widget)、加密、數(shù)字版權(quán)管理、語音識別、語音復制、定位導航(例如由全球定位系統(tǒng)提供的功能)、音樂播放、視頻播放等等。
[0032]下面將結(jié)合附圖2-附圖8,對本發(fā)明實施例提供的應用啟動方法進行詳細介紹。
[0033]請參照圖2,為本發(fā)明實施例提供的一種應用啟動方法的流程圖;該方法可包括以下步驟S200-步驟S203。[〇〇34] S200,獲取第一壓縮文件,所述第一壓縮文件包含目標應用的啟動信息以及所述目標應用的代碼包dex壓縮內(nèi)容;
[0035]本發(fā)明實施例中,當把目標應用安裝完成后,首次啟動該目標應用時,要對dex進行dexopt操作,將dex從APK文件中提取出來進行加載。具體可選的,獲取第一壓縮文件,該第一壓縮文件可以為APK文件,APK文件中包含目標應用的代碼包dex壓縮內(nèi)容,啟動該目標應用時,均需要加載dex,通常加載dex是以zip形式進行加載。
[0036]進一步可選的,該第一壓縮文件中還包含目標應用的啟動信息,目標應用的啟動信息包括但不限于啟動該目標應用的數(shù)據(jù)以及啟動該目標應用的入口程序代碼。[〇〇37]S201,從所述第一壓縮文件中提取所述dex壓縮內(nèi)容;
[0038]本發(fā)明實施例中,從第一壓縮文件中提取出dex壓縮內(nèi)容,具體的提取過程可以是根據(jù)dex壓縮內(nèi)容的文件名進行查找,可選的,dex壓縮內(nèi)容在APK文件中文件名為 classes2.dex的entry中,通過遍歷所有entry找到該dex壓縮內(nèi)容,如下所示:[〇〇39](1)先在APK文件中查找目錄結(jié)束標示結(jié)構(gòu)(標識符是:0x06054b50),然后從該位置往下偏移16個字節(jié)處,找到核心目錄第一個entry的偏移處(標識符是:0x02014b50)。 [0〇4〇](2)然后用for循環(huán)開始記錄各個entry的信息(可以記錄下每個entry在APK文件中的偏移,這樣便于在寫信息(即是生成第二壓縮文件)的時候定位到該entry的開始處), 從entry頭往下偏移42字節(jié)處,去找該entry的文件頭信息,文件頭信息包括文件頭+文件源數(shù)據(jù)(壓縮后的數(shù)據(jù))+ (hasDD,不一定有)。在APK文件中,dex壓縮內(nèi)容在文件名為 classes2.dex中的entry中。找到dex壓縮內(nèi)容之后,S卩可以開始手動zip壓縮文件的寫入過程。[〇〇411S202,將所述dex壓縮內(nèi)容生成第二壓縮文件;[〇〇42]本發(fā)明實施例中,根據(jù)所提取的dex壓縮內(nèi)容,生成第二壓縮文件,第二壓縮文件的壓縮格式可以是zip格式,在這里就不需要將dex壓縮內(nèi)容先進行解壓到臨時目錄,再重新壓縮,節(jié)省了目標應用啟動的時間。
[0043]可選的,將dex壓縮內(nèi)容生成第二壓縮文件可以包括以下兩個步驟:
[0044]步驟一、根據(jù)所述第一壓縮文件中所述dex壓縮內(nèi)容的文件頭信息,生成第二壓縮文件的頭信息,所述第二壓縮文件的頭信息包含所述dex壓縮內(nèi)容;
[0045]步驟二、根據(jù)所述第一壓縮文件中所述dex壓縮內(nèi)容的核心目錄信息,生成所述第二壓縮文件的核心目錄信息。
[0046]本發(fā)明實施例中,第二壓縮文件包括頭信息、核心目錄信息以及目錄結(jié)束標示結(jié)構(gòu)信息等,在生成第二壓縮文件時,根據(jù)第一壓縮文件中該dex壓縮內(nèi)容對應的文件頭信息,生成第二壓縮文件的頭信息,該第二壓縮文件的頭信息也包括文件頭+文件源數(shù)據(jù)(壓縮后的dex數(shù)據(jù)) + (hasDD,不一定有)。[〇〇47]進一步,生成第二壓縮文件中核心目錄信息時,也是根據(jù)第一壓縮文件中該dex壓縮內(nèi)容的核心目錄信息生成,具體的第二壓縮文件生成過程如下,這里繼續(xù)以步驟S201中 (1)和(2)進行說明:[〇〇48](3)先寫第二壓縮文件的文件頭信息,需要改文件名字為classes.dex,重算文件名長度,其他信息可以把APK文件classes2.dex的entry中的文件頭信息拷貝過來。[〇〇49](4)再寫第二壓縮文件的entry核心目錄信息[〇〇5〇]因為只有一個entry,將里面的文件名,文件名長度,文件頭位移做相應修改,其他信息從原來APK文件classes2.dex的entry中的信息拷貝過來即可。在上述(2)中,讀APK文件的時候記錄了 entry在APK文件中的偏移位置,在找尋cl asses 2.dex的過程中,可以用 buffer流,因為entry中每個字段的信息字節(jié)數(shù)都是確定的,所以可以用一個變量來定位和記錄各個位置的偏移情況。
[0051](5)寫第二壓縮文件的目錄結(jié)束標示結(jié)構(gòu)信息。
[0052]S203,加載所述第二壓縮文件中的所述dex壓縮內(nèi)容,并根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用。[〇〇53]本發(fā)明實施例中,當根據(jù)dex壓縮內(nèi)容生成第二壓縮文件之后,即可加載第二壓縮文件中的dex壓縮內(nèi)容,并根據(jù)第一壓縮文件中的啟動信息啟動目標應用,需要說明的是, 第一壓縮文件中的啟動信息可以是處于解壓狀態(tài),例如可以是在目標應用安裝過程中,進行編譯時即進行了解壓。[〇〇54] 上述步驟S200-S203主要闡述了優(yōu)化dex解壓速度,可以等效于圖4的流程圖,首次安裝目標應用啟動時要對dex進行dexopt操作,需要將dex從APK文件中提取出來,本方案直接讀取APK文件,從APK文件中找到壓縮狀態(tài)的dex壓縮內(nèi)容,復制對應內(nèi)容,加上zip文件頭,直接輸出為新zip文件,并以zip形式加載dex的所有方法,最后進入應用程序 (Applicati〇n,APP)主界面。相比現(xiàn)有方案節(jié)省了一次解壓和一次壓縮操作,若使用雙核 1GHz的手機對目標應用進行啟動,則可以將這部分文件操作時間從秒級降到毫秒級。[〇〇55]可選的,所述dex壓縮內(nèi)容為所述第一壓縮文件中的分dex程序包,所述分dex程序包包含非啟動入口程序,所述啟動信息包括所述第一壓縮文件中的主dex程序包,所述主 dex程序包包含至少一個解壓狀態(tài)的啟動入口程序;
[0056]所述加載所述第二壓縮文件中的所述dex壓縮內(nèi)容,并根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用,包括以下步驟S20?S22:[〇〇57]S20,啟動所述主dex程序包,并顯示啟動界面;[〇〇58]S21,加載所述第二壓縮文件中的所述dex壓縮內(nèi)容;[〇〇59]S22,當檢測到加載完所述dex壓縮內(nèi)容,執(zhí)行所述主dex程序包中的所述至少一個啟動入口程序,并顯示所述目標應用的主界面。
[0060]本發(fā)明實施例中,當首次安裝啟動目標應用時,用戶點擊應用圖標啟動目標應用, 舊版本會先加載dex,再調(diào)用該目標應用的啟動入口程序啟動目標應用從而出現(xiàn)閃屏,這樣啟動目標應用,在加載dex過程中用戶看不到閃屏,呈卡死狀態(tài),體驗較差。
[0061]本發(fā)明實施例對上述啟動過程進行改進,實現(xiàn)先出現(xiàn)閃屏,再加載dex。而要實現(xiàn)上述啟動過程就需要保證所有可能的啟動入口程序的所有直接依賴集和間接依賴集在安裝編譯時都分在主dex程序包里,這樣啟動主dex程序包時可以調(diào)動顯示啟動界面,即出現(xiàn)閃屏,如圖6所示,當用戶點擊應用圖標時,即出現(xiàn)第二個啟動界面,在啟動界面顯示過程中異步加載dex。[〇〇62]需要說明的是,主dex程序包中的依賴集很大,系統(tǒng)的自動分包方案不能保證所有啟動入口程序的依賴集都在主dex程序包中。因此開發(fā)人員分析出啟動入口程序的所有直接依賴集和間接依賴集,然后確保依賴集都在主dex程序包里面,這樣啟動入口就能夠保證啟動成功。開發(fā)人員首先對分dex程序包的腳本做修改,加入預設分類規(guī)則,當在目標應用安裝編譯過程中,即根據(jù)該預設分類規(guī)則將所有程序分在主dex程序包和分dex程序包。 [〇〇63]在主dex程序包中需要確保keep最小依賴集,保證主dex程序包能夠有我們所有的依賴類集合,主要包含如下幾個部分:service、content provider、broadcast、 MusicApplicat1n、LifeCycleManager、BaseActivity、OuterShellBaseActivity、 DexActivity〇
[0064]優(yōu)選的,給主dex程序包增加外殼activity(OuterShellBaseActivity,DexActivity),OuterShellBaseActivity是個基類,和Activity類似,首次啟動目標應用時,分dex程序包中的dex壓縮內(nèi)容沒載入的情況下要經(jīng)過這個外殼,從而調(diào)用顯示啟動界面。流程如圖8所示:[0〇65] A、正常入口去啟動對應的activity,會先到基本組件Acitivity或者外殼組件 OuterShellBaseActivity里面判斷是否已經(jīng)加載過dex;[〇〇66]若是_>正常啟動,執(zhí)行步驟B;[0〇67] 若否->保留當前intent信息,并存入下一個intent中,然后去啟動DexActiivty, 在DexAcitivty中載入dex之后,根據(jù)得到的intent啟動原來activity,在dex異步加載過程中一直處于閃屏狀態(tài),當dex加載完畢,調(diào)用應用啟動組件啟動應用,出現(xiàn)應用主界面,該啟動方式為首次啟動邏輯;[0〇68] B、在onattachbasecontext里面加載dex,然后調(diào)用應用啟動組件啟動應用,出現(xiàn)閃屏,該啟動方式為非首次啟動邏輯;
[0069]進一步如圖8所示,啟動方式還可以是覆蓋安裝啟動方式,具體請參照圖3的實施例所述,在此不再贅述。
[0070]如圖7表格所示,采用不同方案目標應用的啟動耗時完全不同,比如,使用雙核 1GHz的android 4.4.2的P1手機對目標應用進行啟動,采用現(xiàn)有方案(即【背景技術(shù)】所述方案)啟動時,耗時3100ms,采用本發(fā)明優(yōu)化后,耗時170ms,使用雙核1GHz的android 4.4.4的 P2手機對目標應用進行啟動,采用現(xiàn)有方案(即【背景技術(shù)】所述方案)啟動時,耗時1400ms,采用本發(fā)明優(yōu)化后,耗時170ms,從上述比較可知,采用本發(fā)明實施例的應用啟動方法可以大大減小目標應用的首次啟動時長。
[0071]本發(fā)明實施例,獲取第一壓縮文件,該第一壓縮文件包含目標應用的啟動信息以及目標應用的dex壓縮內(nèi)容,從該第一壓縮文件中提取該dex壓縮內(nèi)容,將該dex壓縮內(nèi)容生成第二壓縮文件,加載第二壓縮文件中的dex壓縮內(nèi)容,并根據(jù)第一壓縮文件中的啟動信息啟動目標應用。這種方式可節(jié)省解壓和再壓縮dex包的時間,減少目標應用啟動時間,提高用戶體驗。
[0072]請參照圖3,為本發(fā)明實施例提供的另一種應用啟動方法的流程圖,該方法可包括以下步驟S300-S304;[〇〇73] S300,當檢測到系統(tǒng)廣播的用于通知目標應用安裝完成的廣播包時,獲取第一壓縮文件;
[0074]本發(fā)明實施例中,覆蓋安裝目標應用后,系統(tǒng)會廣播用于通知目標應用安裝完成的廣播包PACKAGE_REPLACED,目標應用接收PACKAGE_REPLACED廣播,并啟動獨立進程進行 dex預解壓,即是自動獲取第一壓縮文件,并提取該第一壓縮文件中的dex壓縮內(nèi)容,將該 dex壓縮內(nèi)容重新生成第二壓縮文件,并加載第二壓縮文件中的dex。[〇〇75] 如圖5所示,APP被安裝到設備,系統(tǒng)發(fā)出PACKAGE_REPLACED廣播,APP啟動lite線程,lite線程調(diào)用本發(fā)明實施例一中的應用啟動方法進行dex加載,加載完畢后,lite線程退出,之后用戶使用APP直接按照非首次啟動流程,縮短首次啟動時間。[〇〇76] S301,從所述第一壓縮文件中提取所述dex壓縮內(nèi)容;[〇〇77] S302,將所述dex壓縮內(nèi)容生成第二壓縮文件;[〇〇78] S303,加載所述第二壓縮文件中的所述dex壓縮內(nèi)容;
[0079]本發(fā)明實施例步驟S301-S303請參照圖2的實施例步驟S201?S203,在此不再贅述。
[0080]S304,當檢測到啟動所述目標應用的啟動指令時,根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用。
[0081]本發(fā)明實施例中,當檢測到啟動目標應用的啟動指令(比如用戶點擊應用圖標) 時,根據(jù)第一壓縮文件中的啟動信息啟動目標應用,而不需要再去加載dex,因為dex已經(jīng)在目標應用安裝后即進行了加載。
[0082]本發(fā)明實施例,獲取第一壓縮文件,該第一壓縮文件包含目標應用的啟動信息以及目標應用的dex壓縮內(nèi)容,從該第一壓縮文件中提取該dex壓縮內(nèi)容,將該dex壓縮內(nèi)容生成第二壓縮文件,加載第二壓縮文件中的dex壓縮內(nèi)容,并根據(jù)第一壓縮文件中的啟動信息啟動目標應用。這種方式可節(jié)省解壓和再壓縮dex包的時間,減少目標應用啟動時間,提高用戶體驗。[〇〇83]下面將結(jié)合附圖9-附圖11,對本發(fā)明實施例提供的一種應用啟動裝置進行詳細介紹。
[0084]請參照圖9,為本發(fā)明實施例提供的一種應用啟動裝置的結(jié)構(gòu)示意圖,如圖所示, 該應用啟動裝置包括獲取模塊100、提取模塊101、生成模塊102以及啟動模塊103;
[0085]獲取模塊100,用于獲取第一壓縮文件,所述第一壓縮文件包含目標應用的啟動信息以及所述目標應用的代碼包dex壓縮內(nèi)容;
[0086]本發(fā)明實施例中,當把目標應用安裝完成后,首次啟動該目標應用時,要對dex進行dexopt操作,將dex從APK文件中提取出來進行加載。具體可選的,獲取模塊100獲取第一壓縮文件,該第一壓縮文件可以為APK文件,APK文件中包含目標應用的代碼包dex壓縮內(nèi)容,啟動該目標應用時,均需要加載dex,通常加載dex是以zip形式進行加載。
[0087]進一步可選的,該第一壓縮文件中還包含目標應用的啟動信息,目標應用的啟動信息包括但不限于啟動該目標應用的數(shù)據(jù)以及啟動該目標應用的入口程序代碼。[〇〇88]提取模塊101,用于從所述第一壓縮文件中提取所述dex壓縮內(nèi)容;
[0089]本發(fā)明實施例中,提取模塊101從第一壓縮文件中提取出dex壓縮內(nèi)容,具體的提取過程可以是根據(jù)dex壓縮內(nèi)容的文件名進行查找,可選的,dex壓縮內(nèi)容在APK文件中文件名為classes2.dex的entry中,通過遍歷所有entry找到該dex壓縮內(nèi)容,如下所示:
[0090](1)先在APK文件中查找目錄結(jié)束標示結(jié)構(gòu)(標識符是:0x06054b50),然后從該位置往下偏移16個字節(jié)處,找到核心目錄第一個entry的偏移處(標識符是:0x02014b50)。 [0〇91 ](2)然后用for循環(huán)開始記錄各個entry的信息(可以記錄下每個entry在APK文件中的偏移,這樣便于在寫信息(即是生成第二壓縮文件)的時候定位到該entry的開始處), 從entry頭往下偏移42字節(jié)處,去找該entry的文件頭信息,文件頭信息包括文件頭+文件源數(shù)據(jù)(壓縮后的數(shù)據(jù))+ (hasDD,不一定有)。在APK文件中,dex壓縮內(nèi)容在文件名為 classes2.dex中的entry中。找到dex壓縮內(nèi)容之后,S卩可以開始手動zip壓縮文件的寫入過程。[〇〇92]生成模塊102,用于將所述dex壓縮內(nèi)容生成第二壓縮文件;[〇〇93]本發(fā)明實施例中,生成模塊102根據(jù)所提取的dex壓縮內(nèi)容,生成第二壓縮文件,第二壓縮文件的壓縮格式可以是zip格式,在這里就不需要將dex壓縮內(nèi)容先進行解壓到臨時目錄,再重新壓縮,節(jié)省了目標應用啟動的時間。
[0094] 可選的,如圖10所示,生成模塊102可以包括第一生成單元1020和第二生成單元 1021;[〇〇95]第一生成單元1020,用于根據(jù)所述第一壓縮文件中所述dex壓縮內(nèi)容的文件頭信息,生成第二壓縮文件的頭信息,所述第二壓縮文件的頭信息包含所述dex壓縮內(nèi)容;[〇〇96]第二生成單元1021,用于根據(jù)所述第一壓縮文件中所述dex壓縮內(nèi)容的核心目錄信息,生成所述第二壓縮文件的核心目錄信息。
[0097]本發(fā)明實施例中,第二壓縮文件包括頭信息、核心目錄信息以及目錄結(jié)束標示結(jié)構(gòu)信息等,在生成第二壓縮文件時,根據(jù)第一壓縮文件中該dex壓縮內(nèi)容對應的文件頭信息,生成第二壓縮文件的頭信息,該第二壓縮文件的頭信息也包括文件頭+文件源數(shù)據(jù)(壓縮后的dex數(shù)據(jù)) + (hasDD,不一定有)。[〇〇98]進一步,生成第二壓縮文件中核心目錄信息時,也是根據(jù)第一壓縮文件中該dex壓縮內(nèi)容的核心目錄信息生成,具體的第二壓縮文件生成過程如下,這里繼續(xù)基于上述(1)和 (2)進行說明:[〇〇99](3)先寫第二壓縮文件的文件頭信息,需要改文件名字為classes.dex,重算文件名長度,其他信息可以把APK文件classes2.dex的entry中的文件頭信息拷貝過來。
[0100](4)再寫第二壓縮文件的entry核心目錄信息[0101 ]因為只有一個entry,將里面的文件名,文件名長度,文件頭位移做相應修改,其他信息從原來APK文件classes2.dex的entry中的信息拷貝過來即可。在上述(2)中,讀APK文件的時候記錄了 entry在APK文件中的偏移位置,在找尋cl asses 2.dex的過程中,可以用 buffer流,因為entry中每個字段的信息字節(jié)數(shù)都是確定的,所以可以用一個變量來定位和記錄各個位置的偏移情況。[〇1〇2](5)寫第二壓縮文件的目錄結(jié)束標示結(jié)構(gòu)信息。
[0103]啟動模塊103,用于加載所述第二壓縮文件中的所述dex壓縮內(nèi)容,并根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用。
[0104]本發(fā)明實施例中,當根據(jù)dex壓縮內(nèi)容生成第二壓縮文件之后,啟動模塊103即可加載第二壓縮文件中的dex壓縮內(nèi)容,并根據(jù)第一壓縮文件中的啟動信息啟動目標應用,需要說明的是,第一壓縮文件中的啟動信息可以是處于解壓狀態(tài),例如可以是在目標應用安裝過程中,進行編譯時即進行了解壓。
[0105]上述主要闡述了優(yōu)化dex解壓速度,可以等效于圖4的流程圖,首次安裝目標應用啟動時要對dex進行dexopt操作,需要將dex從APK文件中提取出來,本方案直接讀取APK文件,從APK文件中找到壓縮狀態(tài)的dex壓縮內(nèi)容,復制對應內(nèi)容,加上zip文件頭,直接輸出為新zip文件,并以zip形式加載dex的所有方法,最后進入應用程序(Applicat1n,APP)主界面。相比現(xiàn)有方案節(jié)省了一次解壓和一次壓縮操作,若使用雙核1GHz的手機對目標應用進行啟動,則可以將這部分文件操作時間從秒級降到毫秒級。[〇1〇6]可選的,所述dex壓縮內(nèi)容為所述第一壓縮文件中的分dex程序包,所述分dex程序包包含非啟動入口程序,所述啟動信息包括所述第一壓縮文件中的主dex程序包,所述主 dex程序包包含至少一個解壓狀態(tài)的啟動入口程序;
[0107] 如圖11所示,啟動模塊103可以包括第一顯示單元1030、加載單元1031以及第二顯示單元1032;[〇1〇8] 第一顯示單元1030,用于啟動所述主dex程序包,并顯示啟動界面;[〇1〇9]加載單元1031,用于加載所述第二壓縮文件中的所述dex壓縮內(nèi)容;[〇11〇]第二顯示單元1032,用于當檢測到加載完所述dex壓縮內(nèi)容,執(zhí)行所述主dex程序包中的所述至少一個啟動入口程序,并顯示所述目標應用的主界面。
[0111]本發(fā)明實施例中,當首次安裝啟動目標應用時,用戶點擊應用圖標啟動目標應用, 舊版本會先加載dex,再調(diào)用該目標應用的啟動入口程序啟動目標應用從而出現(xiàn)閃屏,這樣啟動目標應用,在加載dex過程中用戶看不到閃屏,呈卡死狀態(tài),體驗較差。
[0112]本發(fā)明實施例對上述啟動過程進行改進,實現(xiàn)先出現(xiàn)閃屏,再加載dex。而要實現(xiàn)上述啟動過程就需要保證所有可能的啟動入口程序的所有直接依賴集和間接依賴集在安裝編譯時都分在主dex程序包里,這樣啟動主dex程序包時可以調(diào)動顯示啟動界面,即出現(xiàn)閃屏,如圖6所示,當用戶點擊應用圖標時,即出現(xiàn)第二個啟動界面,在啟動界面顯示過程中異步加載dex。[〇113]需要說明的是,主dex程序包中的依賴集很大,系統(tǒng)的自動分包方案不能保證所有啟動入口程序的依賴集都在主dex程序包中。因此開發(fā)人員分析出啟動入口程序的所有直接依賴集和間接依賴集,然后確保依賴集都在主dex程序包里面,這樣啟動入口就能夠保證啟動成功。開發(fā)人員首先對分dex程序包的腳本做修改,加入預設分類規(guī)則,當在目標應用安裝編譯過程中,即根據(jù)該預設分類規(guī)則將所有程序分在主dex程序包和分dex程序包。
[0114]在主dex程序包中需要確保keep最小依賴集,保證主dex程序包能夠有我們所有的依賴類集合,主要包含如下幾個部分:service、content provider、broadcast、 MusicApplicat1n、LifeCycleManager、BaseActivity、OuterShellBaseActivity、 DexActivity〇
[0115]優(yōu)選的,給主dex程序包增加外殼activity(OuterShellBaseActivity, DexActivity),OuterShellBaseActivity是個基類,和Activity類似,首次啟動目標應用時,分dex程序包中的dex壓縮內(nèi)容沒載入的情況下要經(jīng)過這個外殼,從而調(diào)用顯示啟動界面。流程如圖8所示:
[0116]A、正常入口去啟動對應的activity,會先到基本組件Acitivity或者外殼組件 OuterShellBaseActivity里面判斷是否已經(jīng)加載過dex;[〇117]若是_>正常啟動,執(zhí)行步驟B;[〇118] 若否->保留當前intent信息,并存入下一個intent中,然后去啟動DexActiivty, 在DexAcitivty中載入dex之后,根據(jù)得到的intent啟動原來activity,在dex異步加載過程中一直處于閃屏狀態(tài),當dex加載完畢,調(diào)用應用啟動組件啟動應用,出現(xiàn)應用主界面,該啟動方式為首次啟動邏輯;[〇119] B、在onattachbasecontext里面加載dex,然后調(diào)用應用啟動組件啟動應用,出現(xiàn)閃屏,該啟動方式為非首次啟動邏輯;
[0120]進一步如圖8所示,啟動方式還可以是覆蓋安裝啟動方式,具體請參照圖3的實施例所述,在此不再贅述。[〇121 ]如圖7表格所示,采用不同方案目標應用的啟動耗時完全不同,比如,使用雙核 1GHz的android 4.4.2的P1手機對目標應用進行啟動,采用現(xiàn)有方案(即【背景技術(shù)】所述方案)啟動時,耗時3100ms,采用本發(fā)明優(yōu)化后,耗時170ms,使用雙核1GHz的android 4.4.4的 P2手機對目標應用進行啟動,采用現(xiàn)有方案(即【背景技術(shù)】所述方案)啟動時,耗時1400ms,采用本發(fā)明優(yōu)化后,耗時170ms,從上述比較可知,采用本發(fā)明實施例的應用啟動方法可以大大減小目標應用的首次啟動時長。
[0122]優(yōu)選的,所述獲取模塊100具體用于當檢測到系統(tǒng)廣播的用于通知目標應用安裝完成的廣播包時,獲取第一壓縮文件;
[0123]本發(fā)明實施例中,覆蓋安裝目標應用后,系統(tǒng)會廣播用于通知目標應用安裝完成的廣播包PACKAGE_REPLACED,目標應用獲取模塊100接收PACKAGE_REPLACED廣播,并啟動獨立進程進行dex預解壓,即是自動獲取第一壓縮文件,并提取該第一壓縮文件中的dex壓縮內(nèi)容,將該dex壓縮內(nèi)容重新生成第二壓縮文件,并加載第二壓縮文件中的dex。
[0124]如圖5所示,APP被安裝到設備,系統(tǒng)發(fā)出PACKAGE_REPLACED廣播,APP啟動lite線程,lite線程調(diào)用本發(fā)明實施例一中的應用啟動方法進行dex加載,加載完畢后,lite線程退出,之后用戶使用APP直接按照非首次啟動流程,縮短首次啟動時間。
[0125]所述啟動模塊103根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用具體包括:
[0126]當檢測到啟動所述目標應用的啟動指令時,根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用。
[0127]本發(fā)明實施例中,當檢測到啟動目標應用的啟動指令(比如用戶點擊應用圖標) 時,啟動模塊103根據(jù)第一壓縮文件中的啟動信息啟動目標應用,而不需要再去加載dex,因為dex已經(jīng)在目標應用安裝后即進行了加載。
[0128]本發(fā)明實施例,獲取第一壓縮文件,該第一壓縮文件包含目標應用的啟動信息以及目標應用的dex壓縮內(nèi)容,從該第一壓縮文件中提取該dex壓縮內(nèi)容,將該dex壓縮內(nèi)容生成第二壓縮文件,加載第二壓縮文件中的dex壓縮內(nèi)容,并根據(jù)第一壓縮文件中的啟動信息啟動目標應用。這種方式可節(jié)省解壓和再壓縮dex包的時間,減少目標應用啟動時間,提高用戶體驗。
[0129]本領域普通技術(shù)人員可以理解實現(xiàn)上述實施例方法中的全部或部分流程,是可以通過計算機程序來指令相關的硬件來完成,所述的程序可存儲于一計算機可讀取存儲介質(zhì)中,附圖9-附圖11所示應用啟動裝置對應的程序可存儲在應用啟動裝置的可讀存儲介質(zhì)內(nèi),并被該應用啟動裝置中的至少一個處理器執(zhí)行,以實現(xiàn)上述應用啟動方法,該方法包括圖2-附圖3中方法實施例所述的流程。其中,所述的存儲介質(zhì)可為磁碟、光盤、只讀存儲記憶體(Read-Only Memory,R0M)或隨機存儲記憶體(Random Access Memory,RAM)等。
[0130]以上所揭露的僅為本發(fā)明較佳實施例而已,當然不能以此來限定本發(fā)明之權(quán)利范圍,因此依本發(fā)明權(quán)利要求所作的等同變化,仍屬本發(fā)明所涵蓋的范圍。
【主權(quán)項】
1.一種應用啟動方法,其特征在于,包括:獲取第一壓縮文件,所述第一壓縮文件包含目標應用的啟動信息以及所述目標應用的 代碼包dex壓縮內(nèi)容;從所述第一壓縮文件中提取所述dex壓縮內(nèi)容;將所述dex壓縮內(nèi)容生成第二壓縮文件;加載所述第二壓縮文件中的所述dex壓縮內(nèi)容,并根據(jù)所述第一壓縮文件中的所述啟 動信息啟動所述目標應用。2.如權(quán)利要求1所述的方法,其特征在于,所述第一壓縮文件為安卓系統(tǒng)安裝包APK文 件,所述第二壓縮文件為z ip壓縮文件。3.如權(quán)利要求1所述的方法,其特征在于,所述將所述dex壓縮內(nèi)容生成第二壓縮文件, 包括:根據(jù)所述第一壓縮文件中所述dex壓縮內(nèi)容的文件頭信息,生成第二壓縮文件的頭信 息,所述第二壓縮文件的頭信息包含所述dex壓縮內(nèi)容;根據(jù)所述第一壓縮文件中所述dex壓縮內(nèi)容的核心目錄信息,生成所述第二壓縮文件 的核心目錄信息。4.如權(quán)利要求如權(quán)利要求1-3任意一項所述的方法,其特征在于,所述dex壓縮內(nèi)容為 所述第一壓縮文件中的分dex程序包,所述分dex程序包包含非啟動入口程序,所述啟動信 息包括所述第一壓縮文件中的主dex程序包,所述主dex程序包包含至少一個解壓狀態(tài)的啟 動入口程序;所述加載所述第二壓縮文件中的所述dex壓縮內(nèi)容,并根據(jù)所述第一壓縮文件中的所 述啟動信息啟動所述目標應用,包括:啟動所述主dex程序包,并顯示啟動界面;加載所述第二壓縮文件中的所述dex壓縮內(nèi)容;當檢測到加載完所述dex壓縮內(nèi)容,執(zhí)行所述主dex程序包中的所述至少一個啟動入口 程序,并顯示所述目標應用的主界面。5.如權(quán)利要求4所述的方法,其特征在于,所述第一壓縮文件中的分dex程序包中的非 啟動入口程序以及所述第一壓縮文件中的主dex程序包中的啟動入口程序為安裝所述目標 應用時根據(jù)預設分類規(guī)則編譯獲得。6.如權(quán)利要求如權(quán)利要求1-3任意一項所述的方法,其特征在于,所述獲取第一壓縮文 件,包括:當檢測到系統(tǒng)廣播的用于通知目標應用安裝完成的廣播包時,獲取第一壓縮文件;所述根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用,包括:當檢測到啟動所述目標應用的啟動指令時,根據(jù)所述第一壓縮文件中的所述啟動信息 啟動所述目標應用。7.—種應用啟動裝置,其特征在于,包括:獲取模塊,用于獲取第一壓縮文件,所述第一壓縮文件包含目標應用的啟動信息以及 所述目標應用的代碼包dex壓縮內(nèi)容;提取模塊,用于從所述第一壓縮文件中提取所述dex壓縮內(nèi)容;生成模塊,用于將所述dex壓縮內(nèi)容生成第二壓縮文件;啟動模塊,用于加載所述第二壓縮文件中的所述dex壓縮內(nèi)容,并根據(jù)所述第一壓縮文 件中的所述啟動信息啟動所述目標應用。8.如權(quán)利要求7所述的裝置,其特征在于,所述第一壓縮文件為安卓系統(tǒng)安裝包APK文 件,所述第二壓縮文件為z ip壓縮文件。9.如權(quán)利要求7所述的裝置,其特征在于,所述生成模塊包括:第一生成單元,用于根據(jù)所述第一壓縮文件中所述dex壓縮內(nèi)容的文件頭信息,生成第 二壓縮文件的頭信息,所述第二壓縮文件的頭信息包含所述dex壓縮內(nèi)容;第二生成單元,用于根據(jù)所述第一壓縮文件中所述dex壓縮內(nèi)容的核心目錄信息,生成 所述第二壓縮文件的核心目錄信息。10.如權(quán)利要求7-9任意一項所述的裝置,其特征在于,所述dex壓縮內(nèi)容為所述第一壓 縮文件中的分dex程序包,所述分dex程序包包含非啟動入口程序,所述啟動信息包括所述 第一壓縮文件中的主dex程序包,所述主dex程序包包含至少一個解壓狀態(tài)的啟動入口程 序;所述啟動模塊包括:第一顯示單元,用于啟動所述主dex程序包,并顯示啟動界面;加載單元,用于加載所述第二壓縮文件中的所述dex壓縮內(nèi)容;第二顯示單元,用于當檢測到加載完所述dex壓縮內(nèi)容,執(zhí)行所述主dex程序包中的所 述至少一個啟動入口程序,并顯示所述目標應用的主界面。11.如權(quán)利要求10所述的裝置,其特征在于,所述第一壓縮文件中的分dex程序包中的 非啟動入口程序以及所述第一壓縮文件中的主dex程序包中的啟動入口程序為安裝所述目 標應用時根據(jù)預設分類規(guī)則編譯獲得。12.如權(quán)利要求7-9任意一項所述的裝置,其特征在于,所述獲取模塊具體用于當檢測 到系統(tǒng)廣播的用于通知目標應用安裝完成的廣播包時,獲取第一壓縮文件;所述啟動模塊根據(jù)所述第一壓縮文件中的所述啟動信息啟動所述目標應用具體包括:當檢測到啟動所述目標應用的啟動指令時,根據(jù)所述第一壓縮文件中的所述啟動信息 啟動所述目標應用。
【文檔編號】G06F9/445GK105975311SQ201610300439
【公開日】2016年9月28日
【申請日】2016年5月9日
【發(fā)明人】鄧淋元
【申請人】騰訊科技(深圳)有限公司