本公開(kāi)涉及計(jì)算機(jī)技術(shù),尤其涉及一種類加載方法及裝置。
背景技術(shù):
安卓操作系統(tǒng)是目前終端設(shè)備上使用最廣泛的系統(tǒng)。安卓操作系統(tǒng)使用java語(yǔ)言作為主要的開(kāi)發(fā)語(yǔ)言。從5.0版本開(kāi)始,安卓系統(tǒng)引入了一個(gè)名為ART(Android RunTime)的虛擬機(jī)。用java編寫(xiě)的程序,被編譯成DEX格式的文件,ART會(huì)先將DEX文件編譯成終端設(shè)備的中央處理器(Central Processing Unit;簡(jiǎn)稱:CPU)能夠直接運(yùn)行的機(jī)器指令碼,然后CPU再執(zhí)行編譯后的機(jī)器碼,就能大大加快系統(tǒng)的運(yùn)行速度。為了進(jìn)一步提高系統(tǒng)的運(yùn)行速度,ART如何加載java類(class)變得非常重要。
相關(guān)技術(shù)中,ART通過(guò)以下方式加載java類:將preload-classes文件中列舉出的類先加載到內(nèi)存中,然后將這些類從內(nèi)存中搬運(yùn)到一塊地址連續(xù)的內(nèi)存中,之后,將這塊連續(xù)的內(nèi)存的數(shù)據(jù)以及連續(xù)的內(nèi)存的地址保存在boot.art文件中;當(dāng)需要加載java類時(shí),ART將boot.art文件映射到連續(xù)內(nèi)存的地址處,這樣就實(shí)現(xiàn)了類可以直接被使用。
技術(shù)實(shí)現(xiàn)要素:
為克服相關(guān)技術(shù)中存在的問(wèn)題,本公開(kāi)提供一種類加載方法及裝置。
根據(jù)本公開(kāi)實(shí)施例的第一方面,提供一種類加載方法,包括:
根據(jù)應(yīng)用程序的APK文件中的入口類建立映射文件;其中,所述映射文件中包括參考固定地址、映射表及根據(jù)所述入口類確定的類的集合中每個(gè)類的數(shù)據(jù),所述映射表中存儲(chǔ)有每個(gè)類的標(biāo)識(shí)、所述類在所述映射文件中的存儲(chǔ)位置與所述映射文件的第一個(gè)位置之間的第一偏移值及所述類存儲(chǔ)其所引用的類首地址的位置與所述類的第一個(gè)位置之間的第二偏移值的映射關(guān)系,所述參考固定地址為所述映射文件待映射至的內(nèi)存的地址;
若在將所述映射文件映射至所述參考固定地址時(shí)失敗,則將所述映射文件映射至與所述參考固定地址不同的第一地址;
根據(jù)待加載的類的標(biāo)識(shí)及所述映射表中與所述待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第一偏移值及所述第一地址,確定所述待加載的類的首地址;
根據(jù)所述待加載的類的首地址及所述映射表中與所述待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第二偏移值確定所述待加載的類中存儲(chǔ)其所引用的類首地址的地址,并將所述地址中存儲(chǔ)的值修改為所述第一地址與所述參考固定地址的差值加上所述地址中存儲(chǔ)的值之后的值;
初始化所述待加載的類。
結(jié)合第一方面,在第一方面的第一種可能的實(shí)現(xiàn)方式中,所述根據(jù)應(yīng)用程序的APK文件中的入口類建立映射文件,包括:
根據(jù)應(yīng)用程序的APK文件確定入口類,確定所述入口類所引用的類,將所述入口類及所述入口類所引用的類作為類的集合;
將所述類的集合中的所有類加載至終端設(shè)備的內(nèi)存中;
將所述內(nèi)存中的所有類復(fù)制至連續(xù)的內(nèi)存中,選擇參考固定地址,并根據(jù)所述參考固定地址修改每個(gè)類中存儲(chǔ)的其所引用的類的首地址;
根據(jù)每個(gè)類的標(biāo)識(shí)、每個(gè)類在映射文件中的存儲(chǔ)位置及每個(gè)類中存儲(chǔ)其所引用的類首地址的位置,建立映射表;
將所述參考固定地址、所述映射表及所述類的集合中每個(gè)類的數(shù)據(jù)寫(xiě)入所述映射文件中。
結(jié)合第一方面或者第一方面的第一種可能的實(shí)現(xiàn)方式,在第一方面的第二種可能的實(shí)現(xiàn)方式中,所述初始化所述待加載的類,包括:
調(diào)用所述待加載的類的初始化函數(shù)。
結(jié)合第一方面的第一種可能的實(shí)現(xiàn)方式,在第一方面的第三種可能的實(shí)現(xiàn)方式中,所述根據(jù)應(yīng)用程序的APK文件確定入口類,包括:
讀取所述APK文件中的全局配置文件;
從所述全局配置文件中獲取所述入口類。
根據(jù)本公開(kāi)實(shí)施例的第二方面,提供一種類加載裝置,包括:
建立模塊,被配置為根據(jù)應(yīng)用程序的APK文件中的入口類建立映射文件;其中,所述映射文件中包括參考固定地址、映射表及根據(jù)所述入口類確定的類的集合中每個(gè)類的數(shù)據(jù),所述映射表中存儲(chǔ)有每個(gè)類的標(biāo)識(shí)、所述類在所述映射文件中的存儲(chǔ)位置與所述映射文件的第一個(gè)位置之間的第一偏移值及所述類存儲(chǔ)其所引用的類首地址的位置與所述類的第一個(gè)位置之間的第二偏移值的映射關(guān)系,所述參考固定地址為所述映射文件待映射至的內(nèi)存的地址;
映射模塊,被配置為當(dāng)在將所述映射文件映射至所述參考固定地址時(shí)失敗時(shí),將所述映射文件映射至與所述參考固定地址不同的第一地址;
確定模塊,被配置為根據(jù)待加載的類的標(biāo)識(shí)及所述映射表中與所述待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第一偏移值及所述第一地址,確定所述待加載的類的首地址;
修改模塊,被配置為根據(jù)所述待加載的類的首地址及所述映射表中與所述待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第二偏移值確定所述待加載的類中存儲(chǔ)其所引用的類首地址的地址,并將所述地址中存儲(chǔ)的值修改為所述第一地址與所述參考固定地址的差值加上所述地址中存儲(chǔ)的值之后的值;
初始化模塊,被配置為初始化所述待加載的類。
結(jié)合第二方面,在第二方面的第一種可能的實(shí)現(xiàn)方式中,所述建立模塊包括:
確定子模塊,被配置為根據(jù)應(yīng)用程序的APK文件確定入口類,確定所述入口類所引用的類,將所述入口類及所述入口類所引用的類作為類的集合;
加載子模塊,被配置為將所述類的集合中的所有類加載至終端設(shè)備的內(nèi)存中;
復(fù)制子模塊,被配置為將所述內(nèi)存中的所有類復(fù)制至連續(xù)的內(nèi)存中,選擇參考固定地址,并根據(jù)所述參考固定地址修改每個(gè)類中存儲(chǔ)的其所引用的類的首地址;
建立子模塊,被配置為根據(jù)每個(gè)類的標(biāo)識(shí)、每個(gè)類在映射文件中的存儲(chǔ)位置及每個(gè)類中存儲(chǔ)其所引用的類首地址的位置,建立映射表;
寫(xiě)入子模塊,被配置為將所述參考固定地址、所述映射表及所述類的集合中每個(gè)類的數(shù)據(jù)寫(xiě)入所述映射文件中。
結(jié)合第二方面或者第二方面的第一種可能的實(shí)現(xiàn)方式,在第二方面的第二種可能的實(shí)現(xiàn)方式中,所述初始化模塊包括:
調(diào)用子模塊,被配置為調(diào)用所述待加載的類的初始化函數(shù)。
結(jié)合第二方面的第一種可能的實(shí)現(xiàn)方式,在第二方面的第三種可能的實(shí)現(xiàn)方式中,所述確定子模塊包括:
讀取子模塊,被配置為讀取所述APK文件中的全局配置文件;
獲取子模塊,被配置為從所述全局配置文件中獲取所述入口類。
根據(jù)本公開(kāi)實(shí)施例的第三方面,提供一種類加載裝置,包括:
處理器;
用于存儲(chǔ)所述處理器可執(zhí)行指令的存儲(chǔ)器;
其中,所述處理器被配置為:
根據(jù)應(yīng)用程序的APK文件中的入口類建立映射文件;其中,所述映射文件中包括參考固定地址、映射表及根據(jù)所述入口類確定的類的集合中每個(gè)類的數(shù)據(jù),所述映射表中存儲(chǔ)有每個(gè)類的標(biāo)識(shí)、所述類在所述映射文件中的存儲(chǔ)位置與所述映射文件的第一個(gè)位置之間的第一偏移值及所述類存儲(chǔ)其所引用的類首地址的位置與所述類的第一個(gè)位置之間的第二偏移值的映射關(guān)系,所述參考固定地址為所述映射文件待映射至的內(nèi)存的地址;
若在將所述映射文件映射至所述參考固定地址時(shí)失敗,則將所述映射文件映射至與所述參考固定地址不同的第一地址;
根據(jù)待加載的類的標(biāo)識(shí)及所述映射表中與所述待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第一偏移值及所述第一地址,確定所述待加載的類的首地址;
根據(jù)所述待加載的類的首地址及所述映射表中與所述待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第二偏移值確定所述待加載的類中存儲(chǔ)其所引用的類首地址的地址,并將所述地址中存儲(chǔ)的值修改為所述第一地址與所述參考固定地址的差值加上所述地址中存儲(chǔ)的值之后的值;
初始化所述待加載的類。
本公開(kāi)的實(shí)施例提供的技術(shù)方案可以包括以下有益效果:
在一個(gè)實(shí)施例中,通過(guò)根據(jù)應(yīng)用程序的APK文件中的入口類建立映射文件,若在將映射文件映射至參考固定地址時(shí)失敗,則將映射文件映射至與參考固定地址不同的第一地址,根據(jù)待加載的類的標(biāo)識(shí)及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第一偏移值及第一地址,確定待加載的類的首地址,根據(jù)待加載的類的首地址及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第二偏移值確定待加載的類中存儲(chǔ)其所引用的類首地址的地址,并將地址中存儲(chǔ)的值修改為第一地址與參考固定地址的差值加上地址中存儲(chǔ)的值之后的值,初始化待加載的類,實(shí)現(xiàn)了以下效果:第一、在無(wú)法將映射文件映射至參考固定地址時(shí),將映射文件映射至其他的位置,相較于相關(guān)技術(shù)中只能將映射文件映射至固定地址的方式,可以實(shí)現(xiàn)方便地根據(jù)應(yīng)用程序的具體運(yùn)行情況加載類,更加靈活;第二、本公開(kāi)實(shí)施例中加載的類是應(yīng)用程序中的定義的類,相較于相關(guān)技術(shù)中只能加載操作系統(tǒng)定義的類,應(yīng)用更廣泛;第三、本公開(kāi)實(shí)施例的方法沒(méi)有修改ART的源代碼,可以實(shí)現(xiàn)加載獨(dú)立的應(yīng)用程序定義的類,不影響操作系統(tǒng)的穩(wěn)定性。綜上所述,本公開(kāi)實(shí)施例提供的類加載方法,實(shí)現(xiàn)了在不影響操作系統(tǒng)穩(wěn)定性的情況下實(shí)現(xiàn)靈活地加載應(yīng)用程序定義的類,從而,提高了應(yīng)用程序的啟動(dòng)速度和運(yùn)行速度,進(jìn)而,提高了用戶體驗(yàn)。
應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本公開(kāi)。
附圖說(shuō)明
此處的附圖被并入說(shuō)明書(shū)中并構(gòu)成本說(shuō)明書(shū)的一部分,示出了符合本公開(kāi)的實(shí)施例,并與說(shuō)明書(shū)一起用于解釋本公開(kāi)的原理。
圖1是根據(jù)一示例性實(shí)施例示出的一種類加載方法的流程圖;
圖2是根據(jù)一示例性實(shí)施例示出的一種類加載裝置的框圖;
圖3是根據(jù)另一示例性實(shí)施例示出的一種類加載裝置的框圖;
圖4是根據(jù)又一示例性實(shí)施例示出的一種類加載裝置的框圖;
圖5是根據(jù)再一示例性實(shí)施例示出的一種類加載裝置的框圖;
圖6是根據(jù)另一示例性實(shí)施例示出的一種類加載裝置的框圖;
圖7是根據(jù)一示例性實(shí)施例示出的一種類加載裝置的框圖。
通過(guò)上述附圖,已示出本公開(kāi)明確的實(shí)施例,后文中將有更詳細(xì)的描述。這些附圖和文字描述并不是為了通過(guò)任何方式限制本公開(kāi)構(gòu)思的范圍,而是通過(guò)參考特定實(shí)施例為本領(lǐng)域技術(shù)人員說(shuō)明本公開(kāi)的概念。
具體實(shí)施方式
這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說(shuō)明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本公開(kāi)相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書(shū)中所詳述的、本公開(kāi)的一些方面相一致的裝置和方法的例子。
圖1是根據(jù)一示例性實(shí)施例示出的一種類加載方法的流程圖。如圖1所示,本公開(kāi)實(shí)施例提供的類加載方法包括以下步驟:
在步驟101中,根據(jù)應(yīng)用程序的安卓安裝包文件中的入口類建立映射文件。
其中,映射文件中包括參考固定地址、映射表及根據(jù)入口類確定的類的集合中每個(gè)類的數(shù)據(jù),映射表中存儲(chǔ)有每個(gè)類的標(biāo)識(shí)、類在映射文件中的存儲(chǔ)位置與映射文件的第一個(gè)位置之間的第一偏移值及類存儲(chǔ)其所引用的類首地址的位置與類的第一個(gè)位置之間的第二偏移值的映射關(guān)系,參考固定地址為映射文件待映射至的內(nèi)存的地址。
本公開(kāi)實(shí)施例提供的類加載方法可以由終端設(shè)備執(zhí)行。終端設(shè)備可以是手持設(shè)備、車(chē)載設(shè)備、可穿戴設(shè)備、計(jì)算設(shè)備,以及各種形式的用戶設(shè)備(User Equipment;簡(jiǎn)稱:UE),移動(dòng)臺(tái)(Mobile Station;簡(jiǎn)稱:MS)及終端(terminal)等。示例性的,本公開(kāi)實(shí)施例中的終端設(shè)備可以是手機(jī)。
本公開(kāi)實(shí)施例提供的類加載方法可以是由安卓操作系統(tǒng)中的ART執(zhí)行,其通過(guò)執(zhí)行本公開(kāi)實(shí)施例提供的類加載方法可以實(shí)現(xiàn)加載應(yīng)用程序中的定義的類,進(jìn)而,提高應(yīng)用程序的啟動(dòng)速度和運(yùn)行速度。其中所涉及的類可以是java類。如果ART采用本公開(kāi)實(shí)施例提供的類加載方法加載的是應(yīng)用程序啟動(dòng)時(shí)相關(guān)的類,則可以提高應(yīng)用程序的啟動(dòng)速度;如果ART采用本公開(kāi)實(shí)施例提供的類加載方法加載的是應(yīng)用程序運(yùn)行時(shí)相關(guān)的類,則可以提高應(yīng)用程序的運(yùn)行速度。
本公開(kāi)實(shí)施例中的應(yīng)用程序的安卓安裝包(Android Package;簡(jiǎn)稱:APK)可以是終端設(shè)備上安裝的第三方應(yīng)用程序的APK。入口類指的是實(shí)現(xiàn)該應(yīng)用程序入口功能的類。
在根據(jù)應(yīng)用程序的APK文件中的入口類建立映射文件時(shí),可以是按照如下方式實(shí)現(xiàn):根據(jù)應(yīng)用程序的APK文件確定入口類,確定入口類所引用的類,將入口類及入口類所引用的類作為類的集合;將類的集合中的所有類加載至終端設(shè)備的內(nèi)存中;將內(nèi)存中的所有類復(fù)制至連續(xù)的內(nèi)存中,選擇參考固定地址,并根據(jù)參考固定地址修改每個(gè)類中存儲(chǔ)的其所引用的類的首地址;根據(jù)每個(gè)類的標(biāo)識(shí)、每個(gè)類在映射文件中的存儲(chǔ)位置及每個(gè)類中存儲(chǔ)其所引用的類首地址的位置,建立映射表;將參考固定地址、映射表及類的集合中每個(gè)類的數(shù)據(jù)寫(xiě)入映射文件中。
終端設(shè)備可以讀取APK文件中的全局配置文件(AndroidManifest.xml),并從該AndroidManifest.xml文件中確定入口類。在確定了入口類之后,再讀取APK中的classes.dex文件,解析該文件,可以確定入口類所引用的類。classes.dex文件中包括了所有類的定義以及類的引用信息,因此,在確定了入口類之后,即可以根據(jù)入口類及classes.dex文件確定入口類所引用的類。將入口類和入口類所引用的類作為一個(gè)類集合。
類集合中的每個(gè)類的數(shù)據(jù)可以包括:類的名稱、類包含的成員、類包含的函數(shù)、包含的函數(shù)的地址、類的訪問(wèn)權(quán)限及類的引用關(guān)系等。引用關(guān)系可以包括類所引用的類的地址。示例性的,類的數(shù)據(jù)中存儲(chǔ)有其所引用的類的首地址。
在確定了類的集合后,將該集合中的所有類加載至終端設(shè)備的內(nèi)存中。這里的內(nèi)存可以是地址分散的內(nèi)存。將類加載至內(nèi)存中表示通過(guò)分析類的內(nèi)容實(shí)現(xiàn)用類的函數(shù)對(duì)內(nèi)存進(jìn)行讀或?qū)懖僮?。之后,將這些內(nèi)存中的所有類復(fù)制至連續(xù)的內(nèi)存中。連續(xù)的內(nèi)存意為這些內(nèi)存的地址是連續(xù)的。再選擇參考固定地址,這個(gè)參考固定地址是映射文件需要映射至的內(nèi)存的地址。需要說(shuō)明的是,參考固定地址可以與連續(xù)的內(nèi)存的地址相同,也可以不同。并根據(jù)參考固定地址修改每個(gè)類中存儲(chǔ)的其所引用的類的首地址。
修改每個(gè)類中存儲(chǔ)的其所引用的類的首地址是為了保證這個(gè)類可以正確地引用其所引用的類。舉例來(lái)說(shuō),連續(xù)內(nèi)存的首地址是1000,class A存儲(chǔ)在連續(xù)內(nèi)存的第0個(gè)位置,則class A的首地址是1000,class B存儲(chǔ)在連續(xù)內(nèi)存的第100個(gè)位置,則class B的首地址是1100,class A引用class B,則class A中存儲(chǔ)有class B的首地址1100,在生成映射文件時(shí),class A存儲(chǔ)在映射文件的第0個(gè)位置,class B存儲(chǔ)在映射文件的第100個(gè)位置,有以下兩種情況:假設(shè)此時(shí)的參考固定地址是1000的話,則將映射文件映射至該地址的話,class A的地址是1000,class B的地址是1100,class A中存儲(chǔ)有class B的首地址為1100,則從地址為1100的內(nèi)存出可以讀取到class B,引用正確;假設(shè)此時(shí)的參考固定地址是2000,假設(shè)不修改class A中的引用關(guān)系,則將映射文件映射至該地址的時(shí)候,class A映射至2000,class B映射至2100,但class A中存儲(chǔ)的class B的地址依然為1100,但從地址為1100的內(nèi)存中并不會(huì)讀取到class B,發(fā)生引用錯(cuò)誤,所以,在確定了參考固定地址后,需要根據(jù)其與連續(xù)內(nèi)存的地址的差值修改每個(gè)類中存儲(chǔ)的其所引用的類的首地址,在上例的后一種情況中,連續(xù)內(nèi)存和參考固定地址之間的差值為1000,則將class A中存儲(chǔ)的class B的首地址修改為1100+1000=2100,即可實(shí)現(xiàn)正確引用。
需要說(shuō)明的是,選擇參考固定地址的步驟與將內(nèi)存中的所有類復(fù)制至連續(xù)的內(nèi)存中的步驟之間沒(méi)有時(shí)序關(guān)系。如果選擇參考固定地址的步驟在將內(nèi)存中的所有類復(fù)制至連續(xù)的內(nèi)存中的步驟之前,在修改每個(gè)類中存儲(chǔ)的引用的類的首地址時(shí),可以是復(fù)制與修改同時(shí)進(jìn)行。
在將類集合中的所有類復(fù)制至連續(xù)的內(nèi)存中后,需要建立映射表。映射表中存儲(chǔ)的是類的標(biāo)識(shí)、類在映射文件中的存儲(chǔ)位置與映射文件的第一個(gè)位置之間的第一偏移值以及類存儲(chǔ)其所引用的類首地址的位置與該類的第一個(gè)位置之間的第二偏移值之間的一一對(duì)應(yīng)的關(guān)系。需要說(shuō)明的是,本發(fā)明實(shí)施例中類的首地址指的是將類復(fù)制在連續(xù)內(nèi)存中后類的首地址。類的標(biāo)識(shí)可以是類的名稱等可以唯一標(biāo)識(shí)該類的屬性。以下舉例說(shuō)明第一偏移值與第二偏移值,假設(shè)class A存儲(chǔ)在映射文件的第100個(gè)位置,則第一偏移值就是100,假設(shè)class A的第8個(gè)字節(jié)處存儲(chǔ)的是class A所引用的class B的首地址,則第二偏移值就是8??蛇x的,映射文件的第一個(gè)位置表示的是映射文件的第一個(gè)字節(jié),類的第一個(gè)位置表示的是類的第一個(gè)字節(jié)。
可選的,建立映射表的過(guò)程可以采用哈希映射的方式建立,則最終建立的映射表為哈希映射表。哈希映射表可以提高后續(xù)步驟中查找與類的標(biāo)識(shí)對(duì)應(yīng)的第一偏移值和第二偏移值的速度。
在建立了映射表之后,將參考固定地址、映射表及類的集合中每個(gè)類的數(shù)據(jù)寫(xiě)入映射文件中,即完成了建立映射文件。
在步驟102中,若在將映射文件映射至參考固定地址時(shí)失敗,則將映射文件映射至與參考固定地址不同的第一地址。
在需要加載類時(shí),先將映射文件映射至參考固定地址。如果此時(shí)參考固定地址被別的程序占用,無(wú)法使用,則會(huì)映射失敗,則將映射文件映射至與參考固定地址不同的第一地址。
在步驟103中,根據(jù)待加載的類的標(biāo)識(shí)及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第一偏移值及第一地址,確定待加載的類的首地址。
根據(jù)程序運(yùn)行過(guò)程中的具體情況以及用戶的具體操作,確定待加載的類。
在確定了待加載的類之后,需要確定待加載的類的首地址。此時(shí),映射文件的首地址為第一地址,從映射表中可以確定第一偏移值,第一地址加上第一偏移值即為待加載的類的首地址。
在步驟104中,根據(jù)待加載的類的首地址及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第二偏移值確定待加載的類中存儲(chǔ)其所引用的類首地址的地址,并將地址中存儲(chǔ)的值修改為第一地址與參考固定地址的差值加上地址中存儲(chǔ)的值之后的值。
在確定了待加載的類的首地址之后,需要修改該待加載的類中的存儲(chǔ)的其所引用的類的首地址。此時(shí)需要先找到該待加載的類存儲(chǔ)其所引用的類首地址的地址。
根據(jù)步驟103中確定的待加載的類的首地址以及映射表可以確定待加載的類中存儲(chǔ)其所引用的類首地址的地址,具體為待加載的類的首地址加上其所對(duì)應(yīng)的第二偏移值。之后,將待加載的類中存儲(chǔ)其所引用的類首地址的地址中的值修改為第一地址與參考固定地址的差值加上該地址中原本存儲(chǔ)的值。
步驟103和步驟104的執(zhí)行過(guò)程可以是通過(guò)ART建立一個(gè)新的Classloader來(lái)實(shí)現(xiàn)。
以下以一個(gè)具體的例子說(shuō)明步驟103與步驟104的過(guò)程:在生成映射文件時(shí),參考固定地址是1000,class A的地址是1000,class B的地址是1100,class A中存儲(chǔ)有class B的首地址為1100,class A中存儲(chǔ)1100這個(gè)值的位置為第8個(gè)位置,class A存儲(chǔ)在映射文件的第0個(gè)位置,class B存儲(chǔ)在映射文件的第100個(gè)位置,則在映射文件中,對(duì)應(yīng)class A的標(biāo)識(shí),第一偏移值為0,第二偏移值為8。在將該映射文件映射至參考固定地址時(shí)映射失敗,選擇將映射文件映射至2000處,則第一地址為2000。為了保證后續(xù)class A引用正確,需要修改class A中的引用關(guān)系。首先確定映射后的class A的首地址,用第一地址加上第一偏移值即可確定class A的首地址,為2000,同理,class B的首地址為2100。在確定class A的首地址之后,class A的首地址加上第二偏移值即為class A中存儲(chǔ)其所引用的類首地址的地址,該地址為2008。將該地址中存儲(chǔ)的值1100修改為2000-1000+1100=2100,表示class A引用的類的首地址為2100??梢钥吹?,class B確實(shí)存儲(chǔ)在2100中,因此,可以保證引用正確。
在步驟105中,初始化待加載的類。
通過(guò)調(diào)用該待加載的類的初始化函數(shù)實(shí)現(xiàn)初始化該待加載的類。完成類的加載過(guò)程。
本公開(kāi)實(shí)施例提供的類加載方法,通過(guò)根據(jù)應(yīng)用程序的APK文件中的入口類建立映射文件,若在將映射文件映射至參考固定地址時(shí)失敗,則將映射文件映射至與參考固定地址不同的第一地址,根據(jù)待加載的類的標(biāo)識(shí)及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第一偏移值及第一地址,確定待加載的類的首地址,根據(jù)待加載的類的首地址及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第二偏移值確定待加載的類中存儲(chǔ)其所引用的類首地址的地址,并將地址中存儲(chǔ)的值修改為第一地址與參考固定地址的差值加上地址中存儲(chǔ)的值之后的值,初始化待加載的類,實(shí)現(xiàn)了以下效果:第一、在無(wú)法將映射文件映射至參考固定地址時(shí),將映射文件映射至其他的位置,相較于相關(guān)技術(shù)中只能將映射文件映射至固定地址的方式,可以實(shí)現(xiàn)方便地根據(jù)應(yīng)用程序的具體運(yùn)行情況加載類,更加靈活;第二、本公開(kāi)實(shí)施例中加載的類是應(yīng)用程序中的定義的類,相較于相關(guān)技術(shù)中只能加載操作系統(tǒng)定義的類,應(yīng)用更廣泛;第三、本公開(kāi)實(shí)施例的方法沒(méi)有修改ART的源代碼,可以實(shí)現(xiàn)加載獨(dú)立的應(yīng)用程序定義的類,不影響操作系統(tǒng)的穩(wěn)定性。綜上所述,本公開(kāi)實(shí)施例提供的類加載方法,實(shí)現(xiàn)了在不影響操作系統(tǒng)穩(wěn)定性的情況下實(shí)現(xiàn)靈活地加載應(yīng)用程序定義的類,從而,提高了應(yīng)用程序的啟動(dòng)速度和運(yùn)行速度,進(jìn)而,提高了用戶體驗(yàn)。
下述為本公開(kāi)裝置實(shí)施例,可以用于執(zhí)行本公開(kāi)方法實(shí)施例。對(duì)于本公開(kāi)裝置實(shí)施例中未披露的細(xì)節(jié),請(qǐng)參照本公開(kāi)方法實(shí)施例。
圖2是根據(jù)一示例性實(shí)施例示出的一種類加載裝置的框圖。該類加載裝置可以通過(guò)軟件、硬件或者兩者的結(jié)合實(shí)現(xiàn)成為包含終端設(shè)備的部分或者全部。如圖2所示,本公開(kāi)實(shí)施例提供的類加載裝置包括如下模塊:
建立模塊21,被配置為根據(jù)應(yīng)用程序的APK文件中的入口類建立映射文件。
其中,映射文件中包括參考固定地址、映射表及根據(jù)入口類確定的類的集合中每個(gè)類的數(shù)據(jù),映射表中存儲(chǔ)有每個(gè)類的標(biāo)識(shí)、類在映射文件中的存儲(chǔ)位置與映射文件的第一個(gè)位置之間的第一偏移值及類存儲(chǔ)其所引用的類首地址的位置與類的第一個(gè)位置之間的第二偏移值的映射關(guān)系,參考固定地址為映射文件待映射至的內(nèi)存的地址。
映射模塊22,被配置為當(dāng)在將映射文件映射至參考固定地址時(shí)失敗時(shí),將映射文件映射至與參考固定地址不同的第一地址。
確定模塊23,被配置為根據(jù)待加載的類的標(biāo)識(shí)及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第一偏移值及第一地址,確定待加載的類的首地址。
修改模塊24,被配置為根據(jù)待加載的類的首地址及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第二偏移值確定待加載的類中存儲(chǔ)其所引用的類首地址的地址,并將地址中存儲(chǔ)的值修改為第一地址與參考固定地址的差值加上地址中存儲(chǔ)的值之后的值。
初始化模塊25,被配置為初始化待加載的類。
本公開(kāi)實(shí)施例提供的類加載裝置,通過(guò)設(shè)置建立模塊,被配置為根據(jù)應(yīng)用程序的APK文件中的入口類建立映射文件,其中,映射文件中包括參考固定地址、映射表及根據(jù)入口類確定的類的集合中每個(gè)類的數(shù)據(jù),映射表中存儲(chǔ)有每個(gè)類的標(biāo)識(shí)、類在映射文件中的存儲(chǔ)位置與映射文件的第一個(gè)位置之間的第一偏移值及類存儲(chǔ)其所引用的類首地址的位置與類的第一個(gè)位置之間的第二偏移值的映射關(guān)系,參考固定地址為映射文件待映射至的內(nèi)存的地址,映射模塊,被配置為當(dāng)在將映射文件映射至參考固定地址時(shí)失敗時(shí),將映射文件映射至與參考固定地址不同的第一地址,確定模塊,被配置為根據(jù)待加載的類的標(biāo)識(shí)及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第一偏移值及第一地址,確定待加載的類的首地址,修改模塊,被配置為根據(jù)待加載的類的首地址及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第二偏移值確定待加載的類中存儲(chǔ)其所引用的類首地址的地址,并將地址中存儲(chǔ)的值修改為第一地址與參考固定地址的差值加上地址中存儲(chǔ)的值之后的值,初始化模塊,被配置為初始化待加載的類,實(shí)現(xiàn)了以下效果:第一、在無(wú)法將映射文件映射至參考固定地址時(shí),將映射文件映射至其他的位置,相較于相關(guān)技術(shù)中只能將映射文件映射至固定地址的方式,可以實(shí)現(xiàn)方便地根據(jù)應(yīng)用程序的具體運(yùn)行情況加載類,更加靈活;第二、本公開(kāi)實(shí)施例中加載的類是應(yīng)用程序中的定義的類,相較于相關(guān)技術(shù)中只能加載操作系統(tǒng)定義的類,應(yīng)用更廣泛;第三、本公開(kāi)實(shí)施例沒(méi)有修改ART的源代碼,可以實(shí)現(xiàn)加載獨(dú)立的應(yīng)用程序定義的類,不影響操作系統(tǒng)的穩(wěn)定性。綜上,本公開(kāi)實(shí)施例提供的類加載裝置,實(shí)現(xiàn)了在不影響操作系統(tǒng)穩(wěn)定性的情況下實(shí)現(xiàn)靈活地加載應(yīng)用程序定義的類,從而,提高了應(yīng)用程序的啟動(dòng)速度和運(yùn)行速度,進(jìn)而,提高了用戶體驗(yàn)。
圖3是根據(jù)另一示例性實(shí)施例示出的一種類加載裝置的框圖。本公開(kāi)實(shí)施例在圖1所示實(shí)施例的基礎(chǔ)上,對(duì)建立模塊21的具體組成作一詳細(xì)說(shuō)明。如圖3所示,本公開(kāi)實(shí)施例在圖2所示實(shí)施例的基礎(chǔ)上,建立模塊21包括:
確定子模塊211,被配置為根據(jù)應(yīng)用程序的APK文件確定入口類,確定入口類所引用的類,將入口類及入口類所引用的類作為類的集合。
加載子模塊212,被配置為將類的集合中的所有類加載至終端設(shè)備的內(nèi)存中。
復(fù)制子模塊213,被配置為將內(nèi)存中的所有類復(fù)制至連續(xù)的內(nèi)存中,選擇參考固定地址,并根據(jù)參考固定地址修改每個(gè)類中存儲(chǔ)的其所引用的類的首地址。
建立子模塊214,被配置為根據(jù)每個(gè)類的標(biāo)識(shí)、每個(gè)類在映射文件中的存儲(chǔ)位置及每個(gè)類中存儲(chǔ)其所引用的類首地址的位置,建立映射表。
寫(xiě)入子模塊215,被配置為將參考固定地址、映射表及類的集合中每個(gè)類的數(shù)據(jù)寫(xiě)入映射文件中。
本公開(kāi)實(shí)施例提供的類加載裝置中,建立映射文件的過(guò)程實(shí)現(xiàn)簡(jiǎn)單,提高了類加載的穩(wěn)定性。
圖4是根據(jù)又一示例性實(shí)施例示出的一種類加載裝置的框圖。本公開(kāi)實(shí)施例對(duì)初始化模塊25的具體組成作一詳細(xì)說(shuō)明。如圖4所示,本公開(kāi)實(shí)施例在圖2或圖3所示實(shí)施例的基礎(chǔ)上,初始化模塊25包括:
調(diào)用子模塊251,被配置為調(diào)用待加載的類的初始化函數(shù)。
本公開(kāi)實(shí)施例提供的類加載裝置中,實(shí)現(xiàn)初始化待加載的類的過(guò)程簡(jiǎn)單,提高了類加載的穩(wěn)定性和速度。
圖5是根據(jù)再一示例性實(shí)施例示出的一種類加載裝置的框圖。本公開(kāi)實(shí)施例在圖3所示實(shí)施例的基礎(chǔ)上,對(duì)確定子模塊211的具體組成作一詳細(xì)說(shuō)明。如圖5所示,本公開(kāi)實(shí)施例提供的類加載裝置中,確定子模塊211包括:
讀取子模塊2111,被配置為讀取APK文件中的全局配置文件。
獲取子模塊2112,被配置為從全局配置文件中獲取入口類。
本公開(kāi)實(shí)施例提供的類加載裝置,通過(guò)設(shè)置讀取子模塊,被配置為讀取APK文件中的全局配置文件,獲取子模塊,被配置為從全局配置文件中獲取入口類,實(shí)現(xiàn)了快捷地確定入口類,提高了類加載的速度。
以上描述了類加載裝置的內(nèi)部功能和結(jié)構(gòu),圖6是根據(jù)另一示例性實(shí)施例示出的一種類加載裝置的框圖。如圖6所示,該類加載裝置可實(shí)現(xiàn)為:
處理器61;
用于存儲(chǔ)處理器61可執(zhí)行指令的存儲(chǔ)器62;
其中,處理器61被配置為:
根據(jù)應(yīng)用程序的APK文件中的入口類建立映射文件;其中,映射文件中包括參考固定地址、映射表及根據(jù)入口類確定的類的集合中每個(gè)類的數(shù)據(jù),映射表中存儲(chǔ)有每個(gè)類的標(biāo)識(shí)、類在映射文件中的存儲(chǔ)位置與映射文件的第一個(gè)位置之間的第一偏移值及類存儲(chǔ)其所引用的類首地址的位置與類的第一個(gè)位置之間的第二偏移值的映射關(guān)系,參考固定地址為映射文件待映射至的內(nèi)存的地址;
若在將映射文件映射至參考固定地址時(shí)失敗,則將映射文件映射至與參考固定地址不同的第一地址;
根據(jù)待加載的類的標(biāo)識(shí)及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第一偏移值及第一地址,確定待加載的類的首地址;
根據(jù)待加載的類的首地址及映射表中與待加載的類的標(biāo)識(shí)對(duì)應(yīng)的第二偏移值確定待加載的類中存儲(chǔ)其所引用的類首地址的地址,并將地址中存儲(chǔ)的值修改為第一地址與參考固定地址的差值加上地址中存儲(chǔ)的值之后的值;
初始化待加載的類。
圖7是根據(jù)一示例性實(shí)施例示出的一種類加載裝置的框圖。例如,類加載裝置800可以是移動(dòng)電話,計(jì)算機(jī),數(shù)字廣播終端,消息收發(fā)設(shè)備,游戲控制臺(tái),平板設(shè)備,醫(yī)療設(shè)備,健身設(shè)備,個(gè)人數(shù)字助理等。
參照?qǐng)D7,裝置800可以包括以下一個(gè)或多個(gè)組件:處理組件802,存儲(chǔ)器804,電源組件806,多媒體組件808,音頻組件810,輸入/輸出(I/O)接口812,傳感器組件814,以及通信組件816。
處理組件802通??刂蒲b置800的整體操作,諸如與顯示,電話呼叫,數(shù)據(jù)通信,相機(jī)操作和記錄操作相關(guān)聯(lián)的操作。處理組件802可以包括一個(gè)或多個(gè)處理器820來(lái)執(zhí)行指令,以完成上述的方法的全部或部分步驟。此外,處理組件802可以包括一個(gè)或多個(gè)模塊,便于處理組件802和其他組件之間的交互。例如,處理組件802可以包括多媒體模塊,以方便多媒體組件808和處理組件802之間的交互。
存儲(chǔ)器804被配置為存儲(chǔ)各種類型的數(shù)據(jù)以支持在裝置800的操作。這些數(shù)據(jù)的示例包括用于在裝置800上操作的任何應(yīng)用程序或方法的指令,聯(lián)系人數(shù)據(jù),電話簿數(shù)據(jù),消息,圖片,視頻等。存儲(chǔ)器804可以由任何類型的易失性或非易失性存儲(chǔ)設(shè)備或者它們的組合實(shí)現(xiàn),如靜態(tài)隨機(jī)存取存儲(chǔ)器(SRAM),電可擦除可編程只讀存儲(chǔ)器(EEPROM),可擦除可編程只讀存儲(chǔ)器(EPROM),可編程只讀存儲(chǔ)器(PROM),只讀存儲(chǔ)器(ROM),磁存儲(chǔ)器,快閃存儲(chǔ)器,磁盤(pán)或光盤(pán)。
電源組件806為裝置800的各種組件提供電力。電源組件806可以包括電源管理系統(tǒng),一個(gè)或多個(gè)電源,及其他與為裝置800生成、管理和分配電力相關(guān)聯(lián)的組件。
多媒體組件808包括在裝置800和用戶之間的提供一個(gè)輸出接口的屏幕。在一些實(shí)施例中,屏幕可以包括液晶顯示器(LCD)和觸摸面板(TP)。如果屏幕包括觸摸面板,屏幕可以被實(shí)現(xiàn)為觸摸屏,以接收來(lái)自用戶的輸入信號(hào)。觸摸面板包括一個(gè)或多個(gè)觸摸傳感器以感測(cè)觸摸、滑動(dòng)和觸摸面板上的手勢(shì)。觸摸傳感器可以不僅感測(cè)觸摸或滑動(dòng)動(dòng)作的邊界,而且還檢測(cè)與觸摸或滑動(dòng)操作相關(guān)的持續(xù)時(shí)間和壓力。在一些實(shí)施例中,多媒體組件808包括一個(gè)前置攝像頭和/或后置攝像頭。當(dāng)裝置800處于操作模式,如拍攝模式或視頻模式時(shí),前置攝像頭和/或后置攝像頭可以接收外部的多媒體數(shù)據(jù)。每個(gè)前置攝像頭和后置攝像頭可以是一個(gè)固定的光學(xué)透鏡系統(tǒng)或具有焦距和光學(xué)變焦能力。
音頻組件810被配置為輸出和/或輸入音頻信號(hào)。例如,音頻組件810包括一個(gè)麥克風(fēng)(MIC),當(dāng)裝置800處于操作模式,如呼叫模式、記錄模式和語(yǔ)音識(shí)別模式時(shí),麥克風(fēng)被配置為接收外部音頻信號(hào)。所接收的音頻信號(hào)可以被進(jìn)一步存儲(chǔ)在存儲(chǔ)器804或經(jīng)由通信組件816發(fā)送。在一些實(shí)施例中,音頻組件810還包括一個(gè)揚(yáng)聲器,用于輸出音頻信號(hào)。
I/O接口812為處理組件802和外圍接口模塊之間提供接口,上述外圍接口模塊可以是鍵盤(pán),點(diǎn)擊輪,按鈕等。這些按鈕可包括但不限于:主頁(yè)按鈕、音量按鈕、啟動(dòng)按鈕和鎖定按鈕。
傳感器組件814包括一個(gè)或多個(gè)傳感器,用于為裝置800提供各個(gè)方面的狀態(tài)評(píng)估。例如,傳感器組件814可以檢測(cè)到裝置800的打開(kāi)/關(guān)閉狀態(tài),組件的相對(duì)定位,例如所述組件為裝置800的顯示器和小鍵盤(pán),傳感器組件814還可以檢測(cè)裝置800或裝置800一個(gè)組件的位置改變,用戶與裝置800接觸的存在或不存在,裝置800方位或加速/減速和裝置800的溫度變化。傳感器組件814可以包括接近傳感器,被配置用來(lái)在沒(méi)有任何的物理接觸時(shí)檢測(cè)附近物體的存在。傳感器組件814還可以包括光傳感器,如CMOS或CCD圖像傳感器,用于在成像應(yīng)用中使用。在一些實(shí)施例中,該傳感器組件814還可以包括加速度傳感器,陀螺儀傳感器,磁傳感器,壓力傳感器或溫度傳感器。
通信組件816被配置為便于裝置800和其他設(shè)備之間有線或無(wú)線方式的通信。裝置800可以接入基于通信標(biāo)準(zhǔn)的無(wú)線網(wǎng)絡(luò),如WiFi,2G或3G,或它們的組合。在一個(gè)示例性實(shí)施例中,通信組件816經(jīng)由廣播信道接收來(lái)自外部廣播管理系統(tǒng)的廣播信號(hào)或廣播相關(guān)信息。在一個(gè)示例性實(shí)施例中,所述通信組件816還包括近場(chǎng)通信(NFC)模塊,以促進(jìn)短程通信。例如,在NFC模塊可基于射頻識(shí)別(RFID)技術(shù),紅外數(shù)據(jù)協(xié)會(huì)(IrDA)技術(shù),超寬帶(UWB)技術(shù),藍(lán)牙(BT)技術(shù)和其他技術(shù)來(lái)實(shí)現(xiàn)。
在示例性實(shí)施例中,裝置800可以被一個(gè)或多個(gè)應(yīng)用專用集成電路(ASIC)、數(shù)字信號(hào)處理器(DSP)、數(shù)字信號(hào)處理設(shè)備(DSPD)、可編程邏輯器件(PLD)、現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)、控制器、微控制器、微處理器或其他電子元件實(shí)現(xiàn),用于執(zhí)行上述方法。
在示例性實(shí)施例中,還提供了一種包括指令的非臨時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),例如包括指令的存儲(chǔ)器804,上述指令可由裝置800的處理器820執(zhí)行以完成上述方法。例如,所述非臨時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以是ROM、隨機(jī)存取存儲(chǔ)器(RAM)、CD-ROM、磁帶、軟盤(pán)和光數(shù)據(jù)存儲(chǔ)設(shè)備等。
一種非臨時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),當(dāng)該存儲(chǔ)介質(zhì)中的指令由類加載裝置的處理器執(zhí)行時(shí),使得類加載裝置能夠執(zhí)行上述類加載方法。
本領(lǐng)域技術(shù)人員在考慮說(shuō)明書(shū)及實(shí)踐這里公開(kāi)的發(fā)明后,將容易想到本公開(kāi)的其它實(shí)施方案。本申請(qǐng)旨在涵蓋本公開(kāi)的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本公開(kāi)的一般性原理并包括本公開(kāi)未公開(kāi)的本技術(shù)領(lǐng)域中的公知常識(shí)或慣用技術(shù)手段。說(shuō)明書(shū)和實(shí)施例僅被視為示例性的,本公開(kāi)的真正范圍和精神由下面的權(quán)利要求書(shū)指出。
應(yīng)當(dāng)理解的是,本公開(kāi)并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并且可以在不脫離其范圍進(jìn)行各種修改和改變。本公開(kāi)的范圍僅由所附的權(quán)利要求書(shū)來(lái)限制。