本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種加載庫(kù)文件的方法及裝置。
背景技術(shù):
應(yīng)用程序(例如androidapp)在執(zhí)行時(shí),由于需要實(shí)現(xiàn)多個(gè)功能,因此需要依賴多個(gè)與各個(gè)功能對(duì)應(yīng)的庫(kù)文件。但為了使應(yīng)用程序的安裝包數(shù)據(jù)量不會(huì)變得過(guò)大,因此對(duì)于一些不常使用的功能對(duì)應(yīng)的庫(kù)文件,并不會(huì)被打包到安裝包中,而只有在應(yīng)用程序執(zhí)行過(guò)程中運(yùn)行響應(yīng)的功能模塊時(shí),才會(huì)動(dòng)態(tài)地去指定的地址下載該功能模塊對(duì)應(yīng)的庫(kù)文件。在應(yīng)用執(zhí)行過(guò)程中動(dòng)態(tài)地加載庫(kù)文件也叫庫(kù)文件的熱更新。
然而,目前熱更新的方案的成功率較低,主要表現(xiàn)在下載的庫(kù)文件可能被劫持,或由于網(wǎng)絡(luò)波動(dòng)造成下載不全,在拷貝庫(kù)文件到app的加載路徑目錄的過(guò)程中拷貝失敗造成庫(kù)文件不全,造成加載文件失敗以及因失敗造成的重復(fù)下載等問(wèn)題。因此,傳統(tǒng)技術(shù)中應(yīng)用的庫(kù)文件的熱更新的方案的可靠性不足。
技術(shù)實(shí)現(xiàn)要素:
基于此,為解決傳統(tǒng)的應(yīng)用庫(kù)文件的熱更新的方案的可靠性不足的技術(shù)問(wèn)題,特提出了一種加載庫(kù)文件的方法,包括:
檢測(cè)業(yè)務(wù)調(diào)用過(guò)程,根據(jù)業(yè)務(wù)調(diào)用過(guò)程確定目標(biāo)庫(kù)文件;
在緩存目錄中查找所述目標(biāo)庫(kù)文件,在未查找到時(shí),確定與所述目標(biāo)庫(kù)文件對(duì)應(yīng)的庫(kù)文件服務(wù)器;向所述庫(kù)文件服務(wù)器發(fā)起與所述目標(biāo)庫(kù)文件對(duì)應(yīng)的下載請(qǐng)求;
訪問(wèn)所述庫(kù)文件服務(wù)器,將所述目標(biāo)庫(kù)文件由所述庫(kù)文件服務(wù)器下載到所述緩存目錄中;
校驗(yàn)所述緩存目錄中的目標(biāo)庫(kù)文件是否與庫(kù)文件服務(wù)器上存儲(chǔ)的文件版本一致,若是,則通過(guò)將所述目標(biāo)庫(kù)文件添加到類加載路徑中加載所述目標(biāo)庫(kù)文件。
此外,為解決傳統(tǒng)的應(yīng)用庫(kù)文件的熱更新的方案的可靠性不足的技術(shù)問(wèn)題,特提出了一種加載庫(kù)文件的裝置,包括:
目標(biāo)庫(kù)文件確定模塊,用于檢測(cè)業(yè)務(wù)調(diào)用過(guò)程,根據(jù)業(yè)務(wù)調(diào)用過(guò)程確定目標(biāo)庫(kù)文件;
目標(biāo)庫(kù)文件查找模塊,用于在緩存目錄中查找所述目標(biāo)庫(kù)文件,在未查找到時(shí),確定與所述目標(biāo)庫(kù)文件對(duì)應(yīng)的庫(kù)文件服務(wù)器;向所述庫(kù)文件服務(wù)器發(fā)起與所述目標(biāo)庫(kù)文件對(duì)應(yīng)的下載請(qǐng)求;
目標(biāo)庫(kù)文件緩存模塊,用于訪問(wèn)所述庫(kù)文件服務(wù)器,將所述目標(biāo)庫(kù)文件由所述庫(kù)文件服務(wù)器下載到所述緩存目錄中;
第一校驗(yàn)?zāi)K,用于校驗(yàn)所述緩存目錄中的目標(biāo)庫(kù)文件是否與庫(kù)文件服務(wù)器上存儲(chǔ)的文件版本一致;
目標(biāo)庫(kù)文件加載模塊,用于在所述校驗(yàn)?zāi)K的結(jié)果為是時(shí),通過(guò)將所述目標(biāo)庫(kù)文件添加到類加載路徑中加載所述目標(biāo)庫(kù)文件。
實(shí)施本發(fā)明實(shí)施例,將具有如下有益效果:
采用了上述加載庫(kù)文件的方法和裝置之后,在業(yè)務(wù)調(diào)用過(guò)程需要調(diào)用安裝包外部的庫(kù)文件時(shí),先將確定庫(kù)文件,再將庫(kù)文件從服務(wù)器下載到新增的緩存目錄中,然后對(duì)庫(kù)文件進(jìn)行校驗(yàn),在校驗(yàn)無(wú)誤后,才會(huì)通過(guò)類加載器加載庫(kù)文件,這樣就使的庫(kù)文件下載失敗或庫(kù)文件被惡意替換時(shí),能夠阻止加載過(guò)程,從而提高了安全性和可靠性。
另外,后續(xù)業(yè)務(wù)調(diào)用再次需要加載該庫(kù)文件時(shí),可直接在緩存目錄中查找?guī)煳募?duì)緩存目錄中的庫(kù)文件進(jìn)行校驗(yàn),校驗(yàn)通過(guò)后直接加載緩存目錄中的庫(kù)文件,而不需要再次由服務(wù)器下載文件,因此還節(jié)省了網(wǎng)絡(luò)流量。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
其中:
圖1為一個(gè)實(shí)施例中一種加載庫(kù)文件的方法的流程示意圖;
圖2為一個(gè)實(shí)施例中應(yīng)用程序運(yùn)行時(shí)的文件目錄架構(gòu)圖;
圖3為一個(gè)實(shí)施例中一種加載庫(kù)文件的方法的流程示意圖;
圖4為一個(gè)實(shí)施例中一種加載庫(kù)文件的裝置的結(jié)構(gòu)示意圖;
圖5為一個(gè)實(shí)施例中運(yùn)行前述加載庫(kù)文件的方法的計(jì)算機(jī)設(shè)備的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
為了實(shí)現(xiàn)熱加載庫(kù)文件的功能,本發(fā)明實(shí)施例特提出了一種加載庫(kù)文件的方法。該方法的實(shí)現(xiàn)可依賴于計(jì)算機(jī)程序,該計(jì)算機(jī)程序可運(yùn)行于基于馮諾依曼體系的計(jì)算機(jī)系統(tǒng)之上,該計(jì)算機(jī)程序可基于應(yīng)用程序的類加載模塊或類加載器,例如android系統(tǒng)中的classloader類極其擴(kuò)展類等;或者也可以是基于應(yīng)用程序本身實(shí)現(xiàn)的文件管理功能,例如基于python語(yǔ)言、javascript語(yǔ)言的應(yīng)用程序。本發(fā)明實(shí)施例中熱加載的庫(kù)文件在編譯型編程語(yǔ)言的運(yùn)行時(shí)環(huán)境下,庫(kù)文件可以是動(dòng)態(tài)鏈接庫(kù)文件),其類型可以是.so(linux系統(tǒng)中的庫(kù)文件)、.jar(android系統(tǒng)或java系統(tǒng)的庫(kù)文件)或.dll(windows系統(tǒng)的庫(kù)文件);而在解釋型編程語(yǔ)言的運(yùn)行時(shí)環(huán)境下,可以是編程語(yǔ)言相應(yīng)的class文件或腳本文件,例如python編程語(yǔ)言中的.py文件或javascript編程語(yǔ)言中的.js文件。
具體的,如圖1所示,該加載庫(kù)文件的方法,包括如下步驟:
步驟s102:檢測(cè)業(yè)務(wù)調(diào)用過(guò)程,根據(jù)業(yè)務(wù)調(diào)用過(guò)程確定目標(biāo)庫(kù)文件。
在本實(shí)施例中,應(yīng)用程序的開發(fā)人員在開發(fā)應(yīng)用程序產(chǎn)品并打包應(yīng)用程序的安裝包時(shí),可在安裝包中僅加入基礎(chǔ)的功能,而可將不常用的功能打包成庫(kù)文件。
例如,某個(gè)p圖應(yīng)用,包括多種功能,開發(fā)人員可將一部分常用的p圖算法和分享功能打包在安裝包中,而將一些不常用的p圖算法封裝在多個(gè)相應(yīng)的庫(kù)文件中。當(dāng)用戶安裝了該p圖應(yīng)用后,可正常使用那些常用的p圖算法對(duì)照片進(jìn)行修飾,并可直接調(diào)用安裝包中的分享功能分享處理過(guò)后的照片。因?yàn)檫@部分功能對(duì)應(yīng)的類文件或程序代碼在應(yīng)用啟動(dòng)時(shí)已經(jīng)加載到內(nèi)存中。但當(dāng)該用戶需要使用不常用的p圖算法時(shí),則需要應(yīng)用自動(dòng)訪問(wèn)服務(wù)器下載相應(yīng)的p圖算法的庫(kù)文件并進(jìn)行熱加載。
如上所述,在本實(shí)施例中,對(duì)于庫(kù)文件的熱加載,應(yīng)用可通過(guò)檢測(cè)業(yè)務(wù)調(diào)用過(guò)程的進(jìn)行來(lái)確定需要加載的目標(biāo)庫(kù)文件。
具體的,在一種實(shí)施方式中,應(yīng)用可通過(guò)異常處理機(jī)制來(lái)監(jiān)測(cè)業(yè)務(wù)調(diào)用過(guò)程(該實(shí)施方式需要應(yīng)用的開發(fā)語(yǔ)言支持異常處理機(jī)制)。異常處理機(jī)制即為try-catch機(jī)制,應(yīng)用程序在執(zhí)行某個(gè)業(yè)務(wù)邏輯時(shí),會(huì)調(diào)用該業(yè)務(wù)模塊對(duì)應(yīng)的接口函數(shù)。
如前例中,p圖應(yīng)用在使用某一種p圖算法進(jìn)行圖像處理時(shí),總是通過(guò)調(diào)用該p圖算法對(duì)應(yīng)的類文件或庫(kù)文件的接口函數(shù)??稍趖ry的代碼空間中執(zhí)行該接口函數(shù),當(dāng)內(nèi)存中已加載了該p圖算法對(duì)應(yīng)的類文件或庫(kù)文件時(shí),或者該p圖算法對(duì)應(yīng)的類文件或庫(kù)文件存在于該應(yīng)用運(yùn)行時(shí)的類加載路徑classpath中是,則可正常調(diào)用該接口函數(shù)而不會(huì)拋出異常。但若該p圖算法為前述不常用的算法,則其應(yīng)用的安裝包或安裝目錄下,或者說(shuō)該應(yīng)用的類加載路徑classpath中不存在該算法對(duì)應(yīng)的庫(kù)文件時(shí),則由于調(diào)用相應(yīng)的接口函數(shù)會(huì)找不到相應(yīng)的引用關(guān)系或指針關(guān)系,會(huì)拋出相應(yīng)的異常exception(例如,在android系統(tǒng)中會(huì)拋出nullpointexception類型的異常),此時(shí)應(yīng)用即可根據(jù)異常的類型確定在調(diào)用該業(yè)務(wù)模塊的接口函數(shù)時(shí)缺少相應(yīng)的庫(kù)文件,然后根據(jù)異常的類型確定目標(biāo)庫(kù)文件的包名。
在另一種實(shí)施方式中,應(yīng)用可通過(guò)類加載器來(lái)監(jiān)測(cè)業(yè)務(wù)調(diào)用過(guò)程(需要應(yīng)用的開發(fā)語(yǔ)言支持運(yùn)行時(shí)的類加載功能,例如java、android)。例如,在android系統(tǒng)中,業(yè)務(wù)邏輯通過(guò)相應(yīng)的類文件和庫(kù)文件定義,在調(diào)用業(yè)務(wù)模塊的接口函數(shù)時(shí),先將需要加載的類文件或庫(kù)文件的包名(packagename)傳遞給classloader組件,然后使用classloader在classpath中讀取相應(yīng)的類文件和庫(kù)文件進(jìn)行加載。但若classloader在classpath中未找到與包名對(duì)應(yīng)的類文件或庫(kù)文件,則應(yīng)用即可確定該包名為需要進(jìn)行熱加載的目標(biāo)庫(kù)文件。
需要說(shuō)明的是,本發(fā)明實(shí)施例中確定目標(biāo)庫(kù)文件的方式不限于上述兩種,例如,在其他實(shí)施方式中,應(yīng)用程序也可通過(guò)在業(yè)務(wù)調(diào)用過(guò)程中增加邏輯判斷來(lái)確定目標(biāo)庫(kù)文件,還可預(yù)先將業(yè)務(wù)模塊與庫(kù)文件的映射關(guān)系添加在配置文件中,通過(guò)在業(yè)務(wù)調(diào)用時(shí)查詢配置文件來(lái)確定目標(biāo)庫(kù)文件。
步驟s104:在緩存目錄中查找目標(biāo)庫(kù)文件,在未查找到時(shí),確定與目標(biāo)庫(kù)文件對(duì)應(yīng)的庫(kù)文件服務(wù)器;向庫(kù)文件服務(wù)器發(fā)起與目標(biāo)庫(kù)文件對(duì)應(yīng)的下載請(qǐng)求。
步驟s106:訪問(wèn)所述庫(kù)文件服務(wù)器,將所述目標(biāo)庫(kù)文件由所述庫(kù)文件服務(wù)器下載到所述緩存目錄中。
在本實(shí)施例中,為實(shí)現(xiàn)庫(kù)文件的熱加載,還設(shè)置了緩存目錄。如圖2所示,應(yīng)用程序運(yùn)行時(shí)會(huì)將硬盤中的程序文件加載到內(nèi)存中。運(yùn)行時(shí)的應(yīng)用程序在本實(shí)施例中,可訪問(wèn)至少兩種類型的存儲(chǔ)區(qū)域,即類加載路徑目錄和本實(shí)施例中新設(shè)置的緩存目錄,緩存目錄用于緩存下載的庫(kù)文件。
在本實(shí)施例中,當(dāng)classpath中不存在目標(biāo)庫(kù)文件時(shí),則優(yōu)先在緩存目錄中查找是否有與包名對(duì)應(yīng)的目標(biāo)庫(kù)文件,若找到,則使用緩存目錄中的版本的目標(biāo)庫(kù)文件進(jìn)行熱加載,若為找到,則訪問(wèn)庫(kù)文件服務(wù)器下載目標(biāo)庫(kù)文件到緩存目錄中。
需要說(shuō)明的是,庫(kù)文件服務(wù)器可以是存儲(chǔ)多個(gè)庫(kù)文件的單一服務(wù)器也可以是第三方提供的與各個(gè)庫(kù)文件各自對(duì)應(yīng)的多個(gè)服務(wù)器。
例如,在一個(gè)單一服務(wù)器的實(shí)施例中,庫(kù)文件服務(wù)器可以是應(yīng)用市場(chǎng)的服務(wù)器,應(yīng)用開發(fā)商在應(yīng)用市場(chǎng)上發(fā)布應(yīng)用時(shí),可將部分功能單獨(dú)封裝在庫(kù)文件中,使得應(yīng)用市場(chǎng)服務(wù)器上存儲(chǔ)了該應(yīng)用的安裝包和相應(yīng)的庫(kù)文件,執(zhí)行本方法的終端將業(yè)務(wù)調(diào)用過(guò)程中確定的目標(biāo)庫(kù)文件的包名發(fā)送給應(yīng)用市場(chǎng)的服務(wù)器,即可將目標(biāo)庫(kù)文件下載到緩存目錄中。
需要說(shuō)明的是,為提高安全性,庫(kù)文件服務(wù)器與終端之間的連接可基于https協(xié)議,這樣可防止目標(biāo)庫(kù)文件在下載過(guò)程中不會(huì)被篡改。
而在一個(gè)多服務(wù)器的實(shí)施例中,庫(kù)文件服務(wù)器是發(fā)布該庫(kù)文件的開源組織自己的服務(wù)器,例如,某開源組織發(fā)布了一種特定的圖像處理算法的庫(kù)文件,終端需要加載該庫(kù)文件時(shí),可先在預(yù)先存儲(chǔ)的映射表中查找與包名對(duì)應(yīng)的庫(kù)文件服務(wù)器地址,然后訪問(wèn)該地址下載目標(biāo)庫(kù)文件到緩存目錄中。
步驟s108:校驗(yàn)緩存目錄中的目標(biāo)庫(kù)文件是否與庫(kù)文件服務(wù)器上存儲(chǔ)的文件版本一致,若是,則通過(guò)將目標(biāo)庫(kù)文件添加到類加載路徑中加載目標(biāo)庫(kù)文件。
由于目標(biāo)庫(kù)文件由庫(kù)文件服務(wù)器下載到緩存目錄中的過(guò)程中,可能被惡意篡改,或替換為添加了惡意代碼的庫(kù)文件。特別是在使用http協(xié)議下載的過(guò)程中,目標(biāo)庫(kù)文件極易被替換為包含了木馬、病毒的庫(kù)文件,若該庫(kù)文件被應(yīng)用加載,可能就會(huì)使應(yīng)用在執(zhí)行時(shí)執(zhí)行惡意代碼而造成文件損壞或隱私泄露。
為此,可在下載完畢后,校驗(yàn)緩存目錄中的目標(biāo)庫(kù)文件是否與庫(kù)文件服務(wù)器上存儲(chǔ)的文件版本一致,校驗(yàn)的方式可以是通過(guò)比對(duì)版本號(hào)、文件大小或哈希值(比對(duì)md5碼、sha碼等)中的至少一種來(lái)進(jìn)行校驗(yàn)。
若校驗(yàn)結(jié)果為匹配,即緩存目錄中的目標(biāo)庫(kù)文件與庫(kù)文件服務(wù)器上的文件版本的版本號(hào)、文件大小和哈希值均一致,則可對(duì)緩存目錄中的目標(biāo)庫(kù)文件進(jìn)行熱加載;而若校驗(yàn)結(jié)果為不匹配,則可刪除所述緩存目錄和所述類加載路徑目錄中的目標(biāo)庫(kù)文件,執(zhí)行確定與目標(biāo)庫(kù)文件對(duì)應(yīng)的庫(kù)文件服務(wù)器的步驟,重新訪問(wèn)庫(kù)文件服務(wù)器下載目標(biāo)庫(kù)文件。若多次下載失敗,則應(yīng)用可提示報(bào)錯(cuò),提示相應(yīng)的業(yè)務(wù)模塊無(wú)法調(diào)用。
在本實(shí)施例中,加載目標(biāo)庫(kù)文件的方式包括至少兩種:
在第一種實(shí)施方式中,通過(guò)將所述目標(biāo)庫(kù)文件添加到類加載路徑中加載所述目標(biāo)庫(kù)文件可具體為:將目標(biāo)庫(kù)文件由緩存目錄拷貝到與類加載路徑對(duì)應(yīng)的類加載路徑目錄中,由與類加載路徑目錄對(duì)應(yīng)的系統(tǒng)類加載器加載目標(biāo)庫(kù)文件。
請(qǐng)參考圖2所示,在該實(shí)施方式中,校驗(yàn)無(wú)誤的目標(biāo)庫(kù)文件存儲(chǔ)在緩存目錄中,可將其拷貝到應(yīng)用的classpath對(duì)應(yīng)的相應(yīng)的目錄中,例如,應(yīng)用的安裝目錄、系統(tǒng)環(huán)境變量中path屬性定義的目錄或其他方式定義的目錄中,然后通過(guò)程序編譯器或解釋器默認(rèn)的系統(tǒng)類加載器加載拷貝后的目標(biāo)庫(kù)文件。但若默認(rèn)的系統(tǒng)類加載器加載失敗,則刪除緩存目錄和類加載路徑目錄中的目標(biāo)庫(kù)文件。
該實(shí)施方式適合大多數(shù)編譯型和解釋型編程語(yǔ)言開發(fā)的應(yīng)用,例如java、android、python、javascript等。
在第二種實(shí)施方式中,通過(guò)將目標(biāo)庫(kù)文件添加到類加載路徑中加載目標(biāo)庫(kù)文件包括:將目標(biāo)庫(kù)文件在緩存目錄中的路徑作為類加載路徑的參數(shù)傳遞給預(yù)設(shè)的自定義類加載器,由自定義類加載器加載目標(biāo)庫(kù)文件。
例如,應(yīng)用開發(fā)人員可預(yù)先編寫自定義的classloader類來(lái)替換系統(tǒng)默認(rèn)的classloader類,并重載類加載接口函數(shù),使得類加載接口函數(shù)具有類加載路徑的形參。而在加載目標(biāo)庫(kù)文件時(shí),只需要將目標(biāo)庫(kù)文件在緩存目錄中的路徑作為參數(shù)傳入,即可將該路徑添加到類加載路徑中,從而實(shí)現(xiàn)庫(kù)文件的熱加載。同樣的,若加載失敗,可刪除緩存目錄中的目標(biāo)庫(kù)文件。
進(jìn)一步的,在本實(shí)施例中,回到步驟s104,若在緩存目錄中查找到目標(biāo)庫(kù)文件,則可先不訪問(wèn)庫(kù)文件服務(wù)器下載目標(biāo)庫(kù)文件,而是執(zhí)行校驗(yàn)緩存目錄中的目標(biāo)庫(kù)文件是否與庫(kù)文件服務(wù)器上存儲(chǔ)的文件版本一致的步驟。校驗(yàn)方式如前所述的方式。也就是說(shuō),對(duì)于已經(jīng)下載到緩存目錄中的庫(kù)文件來(lái)說(shuō),后續(xù)多次調(diào)用該庫(kù)文件時(shí),不需要訪問(wèn)庫(kù)文件服務(wù)器重新下載,若校驗(yàn)無(wú)誤則可直接加載使用。
進(jìn)一步的,在緩存目錄中查找所述目標(biāo)庫(kù)文件之前,在類加載路徑目錄中存在目標(biāo)庫(kù)文件時(shí),還可校驗(yàn)類加載路徑目錄中的目標(biāo)庫(kù)文件是否與庫(kù)文件服務(wù)器上存儲(chǔ)的文件版本一致,若否,則執(zhí)行在緩存目錄中查找目標(biāo)庫(kù)文件的步驟。
也就是說(shuō),即使類加載路徑目錄中存在目標(biāo)庫(kù)文件,也不要直接加載使用,而是先對(duì)其進(jìn)行校驗(yàn),若校驗(yàn)通過(guò),則表示該庫(kù)文件沒(méi)有在拷貝過(guò)程中或應(yīng)用執(zhí)行過(guò)程中被篡改,為安全的庫(kù)文件,可直接加載使用;若校驗(yàn)不通過(guò),則執(zhí)行上述在緩存目錄中查找目標(biāo)庫(kù)文件的步驟,直至獲取最安全的版本。
進(jìn)一步地,為了節(jié)省緩存目錄的存儲(chǔ)空間,在緩存目錄的文件大小較大,即大于或等于閾值時(shí),可按照下載的時(shí)間先后順序或加載次數(shù)由小到大的順序刪除緩存目錄中的庫(kù)文件,直至文件大小小于閾值。這就使得長(zhǎng)期不被調(diào)用的庫(kù)文件可以被快速地清理出緩存目錄,從而節(jié)省了存儲(chǔ)空間。
如圖3所示,圖3展示了本發(fā)明實(shí)施例完整的熱加載庫(kù)文件的流程。
本發(fā)明實(shí)施例還提供了一種計(jì)算機(jī)存儲(chǔ)介質(zhì),包括計(jì)算機(jī)指令,當(dāng)所述計(jì)算機(jī)指令在計(jì)算機(jī)上運(yùn)行時(shí),使得計(jì)算機(jī)執(zhí)行如前所述的加載庫(kù)文件的方法。
在上述實(shí)施例中,上述加載庫(kù)文件的方法可以全部或部分的通過(guò)軟件、硬件、固件或者其任意組合來(lái)實(shí)現(xiàn)。當(dāng)使用軟件程序?qū)崿F(xiàn)時(shí),可以全部或部分地以計(jì)算機(jī)程序產(chǎn)品的形式實(shí)現(xiàn)。所述計(jì)算機(jī)程序產(chǎn)品包括一個(gè)或多個(gè)計(jì)算機(jī)指令。在計(jì)算機(jī)上加載和執(zhí)行所述計(jì)算機(jī)程序指令時(shí),全部或部分地產(chǎn)生按照本發(fā)明實(shí)施例所述的流程或功能。所述計(jì)算機(jī)可以是通用計(jì)算機(jī)、專用計(jì)算機(jī)、計(jì)算機(jī)網(wǎng)絡(luò)、或者其他可編程裝置。所述計(jì)算機(jī)指令可以存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,或者從一個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)向另一個(gè)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)傳輸,例如,所述計(jì)算機(jī)指令可以從一個(gè)網(wǎng)站站點(diǎn)、計(jì)算機(jī)、服務(wù)器或者數(shù)據(jù)中心通過(guò)有線(例如同軸電纜、光纖、數(shù)字用戶線(dsl))或無(wú)線(例如紅外、無(wú)線、微波等)方式向另一個(gè)網(wǎng)站站點(diǎn)、計(jì)算機(jī)、服務(wù)器或者數(shù)據(jù)中心進(jìn)行傳輸。所述計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以是計(jì)算機(jī)能夠存取的任何可用介質(zhì)或者是包含一個(gè)或多個(gè)可用介質(zhì)集成的服務(wù)器、數(shù)據(jù)中心等數(shù)據(jù)存儲(chǔ)設(shè)備。所述可用介質(zhì)可以是磁性介質(zhì),(例如,軟盤、硬盤、磁帶)、光介質(zhì)(例如,dvd)、或半導(dǎo)體介質(zhì)(例如固態(tài)硬盤solidstatedisk(ssd))等。
此外,為了實(shí)現(xiàn)熱加載庫(kù)文件的功能,本發(fā)明實(shí)施例還提出了一種加載庫(kù)文件的裝置,如圖4所示,上述加載庫(kù)文件的裝置包括目標(biāo)庫(kù)文件確定模塊102、目標(biāo)庫(kù)文件查找模塊104、目標(biāo)庫(kù)文件緩存模塊106、第一校驗(yàn)?zāi)K108以及目標(biāo)庫(kù)文件加載模塊110,其中:
目標(biāo)庫(kù)文件確定模塊102,用于檢測(cè)業(yè)務(wù)調(diào)用過(guò)程,根據(jù)業(yè)務(wù)調(diào)用過(guò)程確定目標(biāo)庫(kù)文件;
目標(biāo)庫(kù)文件查找模塊104,用于在緩存目錄中查找所述目標(biāo)庫(kù)文件,在未查找到時(shí),確定與所述目標(biāo)庫(kù)文件對(duì)應(yīng)的庫(kù)文件服務(wù)器;向所述庫(kù)文件服務(wù)器發(fā)起與所述目標(biāo)庫(kù)文件對(duì)應(yīng)的下載請(qǐng)求;
目標(biāo)庫(kù)文件緩存模塊106,用于訪問(wèn)所述庫(kù)文件服務(wù)器,將所述目標(biāo)庫(kù)文件由所述庫(kù)文件服務(wù)器下載到所述緩存目錄中;
第一校驗(yàn)?zāi)K108,用于校驗(yàn)所述緩存目錄中的目標(biāo)庫(kù)文件是否與庫(kù)文件服務(wù)器上存儲(chǔ)的文件版本一致;
目標(biāo)庫(kù)文件加載模塊110,用于在所述校驗(yàn)?zāi)K的結(jié)果為是時(shí),通過(guò)將所述目標(biāo)庫(kù)文件添加到類加載路徑中加載所述目標(biāo)庫(kù)文件。
可選的,在一個(gè)實(shí)施例中,上述目標(biāo)庫(kù)文件查找模塊104還用于在緩存目錄中查找到所述目標(biāo)庫(kù)文件時(shí),調(diào)用所述目標(biāo)庫(kù)文件加載模塊110。
可選的,在一個(gè)實(shí)施例中,目標(biāo)庫(kù)文件加載模塊110還用于將所述目標(biāo)庫(kù)文件由所述緩存目錄拷貝到與所述類加載路徑對(duì)應(yīng)的類加載路徑目錄中,由與所述類加載路徑目錄對(duì)應(yīng)的系統(tǒng)類加載器加載所述目標(biāo)庫(kù)文件。
可選的,在一個(gè)實(shí)施例中,第一校驗(yàn)?zāi)K108還用于通過(guò)比對(duì)版本號(hào)、文件大小或哈希值中的至少一種校驗(yàn)所述緩存目錄中的目標(biāo)庫(kù)文件是否與庫(kù)文件服務(wù)器上存儲(chǔ)的文件版本一致。
可選的,在一個(gè)實(shí)施例中,如圖4所示,上述裝置還包括第一刪除模塊112,用于在所述校驗(yàn)?zāi)K的結(jié)果為否時(shí),刪除所述緩存目錄和所述類加載路徑目錄中的目標(biāo)庫(kù)文件,并調(diào)用所述目標(biāo)庫(kù)文件查找模塊。
可選的,在一個(gè)實(shí)施例中,如圖4所示,上述裝置還包括第二校驗(yàn)?zāi)K114,用于在所述類加載路徑目錄中存在所述目標(biāo)庫(kù)文件時(shí),校驗(yàn)所述類加載路徑目錄中的目標(biāo)庫(kù)文件是否與庫(kù)文件服務(wù)器上存儲(chǔ)的文件版本一致,在所述第二校驗(yàn)?zāi)K的結(jié)果為否時(shí),調(diào)用所述目標(biāo)庫(kù)文件查找模塊104。
可選的,在一個(gè)實(shí)施例中,如圖4所示,上述裝置還包括第二刪除模塊116,用于在所述與所述類加載路徑目錄對(duì)應(yīng)的系統(tǒng)類加載器加載所述目標(biāo)庫(kù)文件加載失敗時(shí),刪除所述緩存目錄和所述類加載路徑目錄中的目標(biāo)庫(kù)文件。
可選的,在一個(gè)實(shí)施例中,所述目標(biāo)庫(kù)文件加載模塊110還用于將所述目標(biāo)庫(kù)文件在所述緩存目錄中的路徑作為類加載路徑的參數(shù)傳遞給預(yù)設(shè)的自定義類加載器,由所述自定義類加載器加載所述目標(biāo)庫(kù)文件。
可選的,在一個(gè)實(shí)施例中,如圖4所示,上述裝置還包括緩存清理模塊118,用于檢測(cè)所述緩存目錄中的文件大小,在所述文件大小大于或等于閾值時(shí),按照下載的時(shí)間先后順序或加載次數(shù)由小到大的順序刪除所述緩存目錄中的庫(kù)文件,直至所述文件大小小于所述閾值。
實(shí)施本發(fā)明實(shí)施例,將具有如下有益效果:
采用了上述加載庫(kù)文件的方法和裝置之后,在業(yè)務(wù)調(diào)用過(guò)程需要調(diào)用安裝包外部的庫(kù)文件時(shí),先將確定庫(kù)文件,再將庫(kù)文件從服務(wù)器下載到新增的緩存目錄中,然后對(duì)庫(kù)文件進(jìn)行校驗(yàn),在校驗(yàn)無(wú)誤后,才會(huì)通過(guò)類加載器加載庫(kù)文件,這樣就使的庫(kù)文件下載失敗或庫(kù)文件被惡意替換時(shí),能夠阻止加載過(guò)程,從而提高了安全性和可靠性。
另外,后續(xù)業(yè)務(wù)調(diào)用再次需要加載該庫(kù)文件時(shí),可直接在緩存目錄中查找?guī)煳募?duì)緩存目錄中的庫(kù)文件進(jìn)行校驗(yàn),校驗(yàn)通過(guò)后直接加載緩存目錄中的庫(kù)文件,而不需要再次由服務(wù)器下載文件,因此還節(jié)省了網(wǎng)絡(luò)流量。
在一個(gè)實(shí)施例中,如圖5所示,圖5展示了一種運(yùn)行上述加載庫(kù)文件的方法的基于馮諾依曼體系的計(jì)算機(jī)系統(tǒng)的vr設(shè)備10。該計(jì)算機(jī)系統(tǒng)可以是vr設(shè)備的主機(jī)設(shè)備或是集成了主機(jī)功能的vr頭戴式顯示設(shè)備。具體的,可包括通過(guò)系統(tǒng)總線連接的外部輸入接口1001、處理器1002、存儲(chǔ)器1003和輸出接口1004。其中,外部輸入接口1001可選的可至少包括網(wǎng)絡(luò)接口10012和陀螺儀傳感器10014。存儲(chǔ)器1003可包括外存儲(chǔ)器10032(例如硬盤、光盤或軟盤等)和內(nèi)存儲(chǔ)器10034。輸出接口1004可至少包括顯示屏10042等設(shè)備。
在本實(shí)施例中,本方法的運(yùn)行基于計(jì)算機(jī)程序,該計(jì)算機(jī)程序的程序文件存儲(chǔ)于前述基于馮諾依曼體系的計(jì)算機(jī)系統(tǒng)10的外存儲(chǔ)器10032中,在運(yùn)行時(shí)被加載到內(nèi)存儲(chǔ)器10034中,然后被編譯為機(jī)器碼之后傳遞至處理器1002中執(zhí)行,從而使得基于馮諾依曼體系的計(jì)算機(jī)系統(tǒng)10中形成邏輯上的目標(biāo)庫(kù)文件確定模塊102、目標(biāo)庫(kù)文件查找模塊104、目標(biāo)庫(kù)文件緩存模塊106、第一校驗(yàn)?zāi)K108、目標(biāo)庫(kù)文件加載模塊110、第一刪除模塊112、第二校驗(yàn)?zāi)K114、第二刪除模塊116以及緩存清理模塊118。且在上述加載庫(kù)文件的方法執(zhí)行過(guò)程中,輸入的參數(shù)均通過(guò)外部輸入接口1001接收,并傳遞至存儲(chǔ)器1003中緩存,然后輸入到處理器1002中進(jìn)行處理,處理的結(jié)果數(shù)據(jù)或緩存于存儲(chǔ)器1003中進(jìn)行后續(xù)地處理,或被傳遞至輸出接口1004進(jìn)行輸出。
以上所揭露的僅為本發(fā)明較佳實(shí)施例而已,當(dāng)然不能以此來(lái)限定本發(fā)明之權(quán)利范圍,因此依本發(fā)明權(quán)利要求所作的等同變化,仍屬本發(fā)明所涵蓋的范圍。