本發(fā)明屬于信息技術(shù)領(lǐng)域,尤其涉及一種應(yīng)用程序的熱修復(fù)方法及終端。
背景技術(shù):
Android APP在釋放一個版本之后,經(jīng)常會遇到由于用戶投訴或者嚴重bug而需要對所述APP進行修復(fù)的情況。現(xiàn)有的修復(fù)過程包括:1.開發(fā)者修改現(xiàn)有版本的APP,編譯、打包生成升級包,測試以及發(fā)布新版本的升級包;2.用戶設(shè)備提示用戶下載升級包,并根據(jù)用戶操作下載升級包以及安裝、覆蓋現(xiàn)有版本。有時候開發(fā)者僅僅修改了一行代碼,也需要對整個APP進行編譯打包,以及進行發(fā)布宣傳和提示操作,開發(fā)者側(cè)的修復(fù)成本高;而在用戶側(cè),則需要用戶手動下載升級包、手動進行安裝,過程繁瑣,有時候安裝過程甚至?xí)袛嘤脩舻漠?dāng)前業(yè)務(wù)。
技術(shù)實現(xiàn)要素:
鑒于此,本發(fā)明實施例提供一種應(yīng)用程序的熱修復(fù)方法及終端,以降低應(yīng)用程序的修復(fù)成本,簡化應(yīng)用程序的修復(fù)操作。
第一方面,提供了一種應(yīng)用程序的熱修復(fù)方法,所述熱修復(fù)方法包括:
第一終端將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包,然后將所述熱修復(fù)補丁包下發(fā)至已安裝所述預(yù)設(shè)應(yīng)用的第二終端;
所述第二終端接收并保存所述熱修復(fù)補丁包,當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù)。
進一步地,所述第一終端將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包包括:
所述第一終端對所述預(yù)設(shè)應(yīng)用的已修復(fù)版本中的每一個類進行哈希運算,得到第一哈希文件;
將所述第一哈希文件與所述預(yù)設(shè)應(yīng)用的未修復(fù)版本的第二哈希文件進行比對,得到修復(fù)后的類并生成所述類的class文件;
根據(jù)所述class文件生成dex文件,并將所述dex文件打包為熱修復(fù)補丁包。
進一步地,所述第一終端將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包包括:
所述第一終端保存所述預(yù)設(shè)應(yīng)用的未修復(fù)版本中class文件的消息摘要信息,使用未修復(fù)版本的mapping文件來編譯已修復(fù)版本,生成消息摘要信息;
將編譯后的所述消息摘要信息與所述預(yù)設(shè)應(yīng)用的已修復(fù)版本中class文件的消息摘要信息進行比對,得到修復(fù)后的class文件;
根據(jù)所述修復(fù)后的class文件生成dex文件,并將所述dex文件打包為熱修復(fù)補丁包。
進一步地,所述當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù)包括:
在所述預(yù)設(shè)應(yīng)用啟動時,將所述熱修復(fù)補丁包寫入到所述預(yù)設(shè)應(yīng)用的私有目錄文件中;
從所述熱修復(fù)補丁包的dex文件中獲取第一dexElements數(shù)組,以及從所述預(yù)設(shè)應(yīng)用的未修復(fù)版本中獲取第二dexElements數(shù)組;
拼接所述第一dexElements數(shù)組和第二dexElements數(shù)組,得到第三dexElements數(shù)組,并將所述dex文件插入至所述第三dexElements數(shù)組的首位;
將所述第三dexElements數(shù)組通過反射的方式設(shè)置給熱修復(fù)補丁列表再賦值回類加載器,以使得所述類加載器載入所述dex文件。
第二方面,提供了一種終端,所述終端包括:
生成模塊,用于將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包;
下發(fā)模塊,用于將所述熱修復(fù)補丁包下發(fā)至已安裝所述預(yù)設(shè)應(yīng)用的第二終端,以使得所述第二終端在所述預(yù)設(shè)應(yīng)用啟動時加載所述熱修復(fù)補丁包并對所述預(yù)設(shè)應(yīng)用進行熱修復(fù)。
進一步地,所述生成模塊包括:
運算單元,用于對所述預(yù)設(shè)應(yīng)用的已修復(fù)版本中的每一個類進行哈希運算,得到第一哈希文件;
第一比對單元,用于將所述第一哈希文件與所述預(yù)設(shè)應(yīng)用的未修復(fù)版本的第二哈希文件進行比對,得到修復(fù)后的類并生成所述類的class文件;
第一打包單元,用于根據(jù)所述class文件生成dex文件,并將所述dex文件打包為熱修復(fù)補丁包。
進一步地,所述生成模塊包括:
編譯單元,用于保存所述預(yù)設(shè)應(yīng)用的未修復(fù)版本中class文件的消息摘要信息,使用未修復(fù)版本的mapping文件來編譯已修復(fù)版本,生成消息摘要信息;
第二比對單元,用于將編譯后的所述消息摘要信息與所述預(yù)設(shè)應(yīng)用的已修復(fù)版本中class文件的消息摘要信息進行比對,得到修復(fù)后的class文件;
第二打包單元,用于根據(jù)所述修復(fù)后的class文件生成dex文件,并將所述dex文件打包為熱修復(fù)補丁包。。
第三方面,提供了一種終端,所述終端包括:
接收模塊,用于接收并保存第一終端下發(fā)的熱修復(fù)補丁包;
修復(fù)模塊,用于當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù)。
進一步地,所述修復(fù)模塊包括:
寫入單元,用于在所述預(yù)設(shè)應(yīng)用啟動時,將所述熱修復(fù)補丁包寫入到所述預(yù)設(shè)應(yīng)用的私有目錄文件中;
獲取單元,用于從所述熱修復(fù)補丁包的dex文件中獲取第一dexElements數(shù)組,以及從所述預(yù)設(shè)應(yīng)用的未修復(fù)版本中獲取第二dexElements數(shù)組;
拼接單元,用于拼接所述第一dexElements數(shù)組和第二dexElements數(shù)組,得到第三dexElements數(shù)組,并將所述dex文件插入至所述第三dexElements數(shù)組的首位;
修復(fù)單元,用于將所述第三dexElements數(shù)組通過反射的方式設(shè)置給熱修復(fù)補丁列表再賦值回類加載器,以使得所述類加載器載入所述dex文件。
與現(xiàn)有技術(shù)相比,本發(fā)明實施例由第一終端將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包,然后將所述熱修復(fù)補丁包下發(fā)至已安裝所述預(yù)設(shè)應(yīng)用的第二終端;所述第二終端接收并保存所述熱修復(fù)補丁包,當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,則加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù);從而實現(xiàn)了對異常應(yīng)用程序的熱修復(fù),整個修復(fù)過程動態(tài)靜默執(zhí)行,無需用戶進行任何操作,極大地簡化了應(yīng)用程序的修復(fù)操作,也無需中斷用戶的當(dāng)前業(yè)務(wù),提升了用戶體驗感;且本發(fā)明只對發(fā)生異常的地方進行修復(fù),有效地降低了版本發(fā)布和升級的成本,修復(fù)效率高。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他附圖。
圖1是本發(fā)明實施例提供的應(yīng)用程序的熱修復(fù)系統(tǒng)的組成結(jié)構(gòu)圖;
圖2是本發(fā)明實施例提供的應(yīng)用程序的熱修復(fù)方法的實現(xiàn)流程圖;
圖3是本發(fā)明實施例提供的應(yīng)用程序的熱修復(fù)方法中步驟S101的具體實現(xiàn)流程圖;
圖4是本發(fā)明另一實施例提供的應(yīng)用程序的熱修復(fù)方法中步驟S101的具體實現(xiàn)流程圖;
圖5是本發(fā)明實施例提供的應(yīng)用程序的熱修復(fù)方法中步驟S103的實現(xiàn)流程圖;
圖6是本發(fā)明實施例提供的第三dexElements數(shù)組的結(jié)構(gòu)示意圖;
圖7是本發(fā)明實施例提供的終端的組成結(jié)構(gòu)圖;
圖8是本發(fā)明另一實施例提供的終端的組成結(jié)構(gòu)圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
本發(fā)明實施例由第一終端將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包,然后將所述熱修復(fù)補丁包下發(fā)至已安裝所述預(yù)設(shè)應(yīng)用的第二終端;所述第二終端接收并保存所述熱修復(fù)補丁包,當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,則加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù);從而實現(xiàn)了對異常應(yīng)用程序的熱修復(fù),整個修復(fù)過程動態(tài)靜默執(zhí)行,無需用戶進行任何操作,極大地簡化了應(yīng)用程序的修復(fù)操作,也無需中斷用戶的當(dāng)前業(yè)務(wù),提升了用戶體驗感;且本發(fā)明只對發(fā)生異常的地方進行修復(fù),有效地降低了版本發(fā)布和升級的成本,修復(fù)效率高。本發(fā)明實施例還提供了相應(yīng)的終端,以下分別進行詳細的說明。
圖1示出了本發(fā)明實施例提供的應(yīng)用程序的熱修復(fù)系統(tǒng)的組成結(jié)構(gòu),為了便于說明,僅示出了與本發(fā)明實施例相關(guān)的部分。
在本發(fā)明實施例中,所述應(yīng)用程序的熱修復(fù)系統(tǒng)包括開發(fā)人員側(cè)的第一終端1和用戶側(cè)的至少一個第二終端2,所述第一終端1與所述第二終端2之間通過有線或者無線的方式連接通信。所述第一終端1包括但不限于服務(wù)器、電腦等計算機設(shè)備,所述第二終端2包括但不限于智能手機、平板電腦、電視機、智能穿戴設(shè)備、音樂播放設(shè)備(比如MP4)等用戶設(shè)備。
在本發(fā)明實施例中,所述第一終端1用于根據(jù)開發(fā)人員的操作,將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包,并將所述熱修復(fù)補丁包下發(fā)至已安裝所述預(yù)設(shè)應(yīng)用的第二終端2。
所述第二終端2接收并保存所述熱修復(fù)補丁包,當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,則加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù)。
進一步地,所述第一終端1包括:
生成模塊11,用于將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包;
下發(fā)模塊12,用于將所述熱修復(fù)補丁包下發(fā)至已安裝所述預(yù)設(shè)應(yīng)用的第二終端,以使得所述第二終端在所述預(yù)設(shè)應(yīng)用啟動時加載所述熱修復(fù)補丁包并對所述預(yù)設(shè)應(yīng)用進行熱修復(fù)。
作為本發(fā)明的一個優(yōu)選示例,所述生成模塊11具體包括:
運算單元111,用于對所述預(yù)設(shè)應(yīng)用的已修復(fù)版本中的每一個類進行哈希運算,得到第一哈希文件;
第一比對單元112,用于將所述第一哈希文件與所述預(yù)設(shè)應(yīng)用的未修復(fù)版本的第二哈希文件進行比對,得到修復(fù)后的類并生成所述類的class文件;
第一打包單元113,用于根據(jù)所述class文件生成dex文件,并將所述dex文件打包為熱修復(fù)補丁包。
在這里,所述未修復(fù)版本和已修復(fù)版本都是針對所述預(yù)設(shè)應(yīng)用來定義的,所述未修復(fù)版本是指存在問題待修復(fù)的當(dāng)前線上版本,所述已修復(fù)版本是指問題已修復(fù)完畢的將要發(fā)布的版本。
對于普通代碼,本發(fā)明實施例首先遍歷所述預(yù)設(shè)應(yīng)用已修復(fù)版本中的全部類,對每個類進行哈希運算,即hash運算,并將運算結(jié)果寫入到所述已修復(fù)版本對應(yīng)的hashFile中,得到第一哈希文件。然后比較所述第一哈希文件與所述預(yù)設(shè)應(yīng)用的未修復(fù)版本對應(yīng)的第二哈希文件,得到所有發(fā)生過修復(fù)的類,并生成所述類的class文件;最后將所述class文件轉(zhuǎn)換成dex文件,并將所述dex文件打包為熱修復(fù)補丁包,從而完成對普通代碼的熱修復(fù)補丁包的制作。
作為本發(fā)明的另一個優(yōu)選示例,所述生成模塊11還可以包括:
編譯單元114,用于保存所述預(yù)設(shè)應(yīng)用的未修復(fù)版本中class文件的消息摘要信息,使用未修復(fù)版本的mapping文件來編譯已修復(fù)版本,生成消息摘要信息;
第二比對單元115,用于將編譯后的所述消息摘要信息與所述預(yù)設(shè)應(yīng)用的已修復(fù)版本中class文件的消息摘要信息進行比對,得到修復(fù)后的class文件;
第二打包單元116,用于根據(jù)所述修復(fù)后的class文件生成dex文件,并將所述dex文件打包為熱修復(fù)補丁包。
在這里,對于混淆代碼,本發(fā)明實施例首先保存未修復(fù)版本中所有的class文件的消息摘要信息。其中,所述消息摘要信息可選為MD5信息,即通過消息摘要算法第五版(Message Digest Algorithm MD5)算出的摘要信息。然后使用已修復(fù)版本的mapping文件進行編譯,將編譯后的所述消息摘要信息與已修復(fù)版本的消息摘要信息進行比對,取出已修復(fù)版本中與未修復(fù)版本中不相同的class文件,得到修復(fù)后的class文件。最后將所述class文件轉(zhuǎn)換成dex文件,并將所述dex文件打包為熱修復(fù)補丁包,從而完成對混淆代碼的熱修復(fù)補丁包的制作。
示例性地,所述dex文件為patch.dex文件,所述熱修復(fù)補丁包為patch_dex.jar或者patch_dex.apk文件,因此可以使用dx工具,將所述class文件轉(zhuǎn)換成patch.dex,然后將所述patch.dex打包成patch_dex.jar或者patch_dex.apk文件,從而完成熱修復(fù)補丁包的制作。
進一步地,所述第二終端2具體包括:
接收模塊21,用于接收并保存第一終端下發(fā)的熱修復(fù)補丁包;
修復(fù)模塊22,用于當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù)。
進一步地,所述修復(fù)模塊22包括:
寫入單元221,用于在所述預(yù)設(shè)應(yīng)用啟動時,將所述熱修復(fù)補丁包寫入到所述預(yù)設(shè)應(yīng)用的私有目錄文件中;
獲取單元222,用于從所述熱修復(fù)補丁包的dex文件中獲取第一dexElements數(shù)組,以及從所述預(yù)設(shè)應(yīng)用的未修復(fù)版本中獲取第二dexElements數(shù)組;
拼接單元223,用于拼接所述第一dexElements數(shù)組和第二dexElements數(shù)組,得到第三dexElements數(shù)組,并將所述dex文件插入至所述第三dexElements數(shù)組的首位;
修復(fù)單元224,用于將所述第三dexElements數(shù)組通過反射的方式設(shè)置給熱修復(fù)補丁列表再賦值回類加載器,以使得所述類加載器載入所述dex文件。
在這里,本發(fā)明實施例中,所述第一終端1下發(fā)熱修復(fù)補丁包至所述預(yù)設(shè)應(yīng)用后,所述預(yù)設(shè)應(yīng)用將所述熱修復(fù)補丁包存儲在所述第二終端2的指定路徑下。當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,所述第二終端2將所述熱修復(fù)補丁包寫入到預(yù)設(shè)應(yīng)用的私有目錄中的文件夾里,并對所述熱修復(fù)補丁包進行解析獲取dex文件,從所述dex文件中獲取第一dexElements數(shù)組,以及從未修復(fù)版本中獲取第二dexElements數(shù)組。將所述第一dexElements數(shù)組和第二dexElements數(shù)組拼接,得到第三dexElements數(shù)組,并將所述dex文件置于所述第三dexElements數(shù)組的首位,最后將所述第三dexElements數(shù)組通過反射的方式設(shè)置給熱修復(fù)補丁列表再賦值回類加載器。所述類加載器在遍歷PathList時則首先載入放置在所述第三dexElements數(shù)組第一位上的dex文件,所述dex文件里面包含了修復(fù)后的class文件。對于所述第三dexElements數(shù)組后面dex文件中相同類的class文件,所述類加載器將不再加載。在所述預(yù)設(shè)應(yīng)用運行findclass時,則查找并執(zhí)行修復(fù)后的class文件,未修復(fù)的class文件不再執(zhí)行,從而完成對所述預(yù)設(shè)應(yīng)用的異常修復(fù)。整個修復(fù)過程動態(tài)靜默執(zhí)行,無需用戶進行任何操作,也無需中斷用戶當(dāng)前業(yè)務(wù),極大地提升了用戶體驗感;且本發(fā)明只對發(fā)生異常的地方進行修復(fù),有效地降低了發(fā)布和升級成本,修復(fù)效率高。
圖2示出了本發(fā)明實施例提供的應(yīng)用程序的熱修復(fù)方法的實現(xiàn)流程。
在本發(fā)明實施例中,所述應(yīng)用程序的熱修復(fù)方法應(yīng)用于上述圖1實施例中所述的應(yīng)用程序的熱修復(fù)系統(tǒng)。
參閱圖2,所述應(yīng)用程序的熱修復(fù)方法包括:
在步驟S201中,第一終端將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包。
在本發(fā)明實施例中,第一終端為開發(fā)者側(cè)的計算機設(shè)備,包括但不限于服務(wù)器、電腦等。所述第一終端通過比對所述預(yù)設(shè)應(yīng)用的已修復(fù)版本和未修復(fù)版本得到所述修復(fù)代碼。其中,所述未修復(fù)版本和已修復(fù)版本都是針對所述預(yù)設(shè)應(yīng)用來定義的,所述未修復(fù)版本是指存在問題待修復(fù)的當(dāng)前線上版本,所述已修復(fù)版本是指問題已修復(fù)完畢的將要發(fā)布的版本。
可選地,所述修復(fù)代碼包括普通代碼,所述普通代碼未與未修復(fù)版本中的原有代碼混淆。對于此類修復(fù)代碼,本發(fā)明實施例通過比較未修復(fù)版本和已修復(fù)版本的哈希文件來獲取。圖3示出了本發(fā)明實施例提供的應(yīng)用程序的熱修復(fù)方法中步驟S201的實現(xiàn)流程。
參閱圖3,所述步驟S201包括:
在步驟S301中,所述第一終端對所述預(yù)設(shè)應(yīng)用的已修復(fù)版本中的每一個類進行哈希運算,得到第一哈希文件。
在步驟S302中,將所述第一哈希文件與所述預(yù)設(shè)應(yīng)用的未修復(fù)版本的第二哈希文件進行比對,得到修復(fù)后的類并生成所述類的class文件。
在步驟S303中,根據(jù)所述class文件生成dex文件,并將所述dex文件打包為熱修復(fù)補丁包。
在這里,對于普通代碼,本發(fā)明實施例首先遍歷已修復(fù)版本中的全部類,對每個類進行哈希運算,即hash運算,并將運算結(jié)果寫入到所述已修復(fù)版本對應(yīng)的hashFile中,得到第一哈希文件。然后比較所述第一哈希文件與未修復(fù)版本對應(yīng)的第二哈希文件,得到所有發(fā)生過修復(fù)的類,并生成所述類的class文件;最后將所述class文件轉(zhuǎn)換成dex文件,并將所述dex文件打包為熱修復(fù)補丁包,從而完成對普通代碼的熱修復(fù)補丁包的制作。
可選地,所述修復(fù)代碼還包括混淆代碼,所述混淆代碼與未修復(fù)版本中的原有代碼混淆。對于此類修復(fù)代碼,本發(fā)明實施例通過比較未修復(fù)版本和已修復(fù)版本中所有class文件的消息摘要信息來獲取。圖4示出了本發(fā)明實施例提供的應(yīng)用程序的熱修復(fù)方法中步驟S201的實現(xiàn)流程。
參閱圖4,所述步驟S201包括:
在步驟S401中,所述第一終端保存所述預(yù)設(shè)應(yīng)用的未修復(fù)版本中class文件的消息摘要信息,使用未修復(fù)版本的mapping文件來編譯已修復(fù)版本,生成消息摘要信息。
在步驟S402中,將編譯后的所述消息摘要信息與所述預(yù)設(shè)應(yīng)用的已修復(fù)版本中class文件的消息摘要信息進行比對,得到修復(fù)后的class文件。
在步驟S403中,根據(jù)所述修復(fù)后的class文件生成dex文件,并將所述dex文件打包為熱修復(fù)補丁包。
對于混淆代碼,本發(fā)明實施例首先保存未修復(fù)版本中所有的class文件的消息摘要信息。其中,所述消息摘要信息可選為MD5信息,即通過消息摘要算法第五版(Message Digest Algorithm MD5)算出的摘要信息。然后使用已修復(fù)版本的mapping文件對所述未修復(fù)版本的消息摘要信息進行編譯,將編譯后的所述消息摘要信息與已修復(fù)版本的消息摘要信息進行比對,取出已修復(fù)版本與未修復(fù)版本中不相同的class文件,得到修復(fù)后的class文件。最后將該修復(fù)后的class文件轉(zhuǎn)換為dex文件,并將所述dex文件打包為熱修復(fù)補丁包,從而完成對混淆代碼的熱修復(fù)補丁包的制作。
示例性地,所述dex文件為patch.dex文件,所述熱修復(fù)補丁包為patch_dex.jar或者patch_dex.apk文件,因此可以使用dx工具,將所述class文件轉(zhuǎn)換成patch.dex,然后將所述patch.dex打包成patch_dex.jar或者patch_dex.apk文件。
綜合上述圖3和圖4示例,可見本發(fā)明實施例只對發(fā)生異常的地方進行修復(fù),只對修復(fù)代碼進行打包生成熱修復(fù)補丁包,極大地簡化了熱修復(fù)補丁包的制作過程,有效地降低了版本發(fā)布和升級成本。
在步驟S202中,所述第一終端將所述熱修復(fù)補丁包下發(fā)至已安裝所述預(yù)設(shè)應(yīng)用的第二終端。
在這里,制作好的熱修復(fù)補丁包,可以通過預(yù)設(shè)的推送協(xié)議框架下發(fā)至第二終端。所述預(yù)設(shè)的推送協(xié)議框架包括但不限于比如可擴展通訊和表示協(xié)議(Extensible Messaging and Presence Protocol,簡稱XMPP)或者云到端消息框架(Android Cloud to Device Messaging,簡稱C2DM)等。
在步驟S203中,所述第二終端接收并保存所述熱修復(fù)補丁包,當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù)。
在這里,第二終端接收第一終端下發(fā)的熱修復(fù)補丁包,并存儲在指定路徑下,以供所述預(yù)設(shè)應(yīng)用啟動時加載。圖5示出了本發(fā)明實施例提供的應(yīng)用程序的熱修復(fù)方法中步驟S203的具體實現(xiàn)流程。
參閱圖5,所述步驟S203包括:
在步驟S501中,在所述預(yù)設(shè)應(yīng)用啟動時,將所述熱修復(fù)補丁包寫入到所述預(yù)設(shè)應(yīng)用的私有目錄文件中。
在步驟S502中,從所述熱修復(fù)補丁包的dex文件中獲取第一dexElements數(shù)組,以及從所述預(yù)設(shè)應(yīng)用的未修復(fù)版本中獲取第二dexElements數(shù)組。
在步驟S503中,拼接所述第一dexElements數(shù)組和第二dexElements數(shù)組,得到第三dexElements數(shù)組,并將所述dex文件插入至所述第三dexElements數(shù)組的首位。
示例性地,圖6示給出了本發(fā)明實施例提供的第三dexElements數(shù)組的結(jié)構(gòu)示意圖。
在步驟S504中,將所述第三dexElements數(shù)組通過反射的方式設(shè)置給熱修復(fù)補丁列表再賦值回類加載器,以使得所述類加載器載入所述dex文件。
在這里,所述類加載器為ClassLoader。在所述第三dexElements數(shù)組賦值給類加載器之后,所述類加載器在遍歷熱修復(fù)補丁列表PathList時則首先載入放置在所述第三dexElements數(shù)組第一位上的dex文件,所述dex文件里面包含了修復(fù)后的class文件。對于所述第三dexElements數(shù)組后面dex文件中相同類的class文件,所述類加載器將不再加載。在所述預(yù)設(shè)應(yīng)用運行findclass時,則查找并執(zhí)行修復(fù)后的class文件,未修復(fù)的class文件不再執(zhí)行,從而完成對所述預(yù)設(shè)應(yīng)用的異常修復(fù)。整個修復(fù)過程動態(tài)靜默執(zhí)行,無需用戶進行任何操作,也無需中斷用戶當(dāng)前的業(yè)務(wù),極大地提升了用戶體驗感;且本發(fā)明只對發(fā)生異常的地方進行修復(fù),有效地降低了發(fā)布和升級成本,修復(fù)效率高。
本發(fā)明實施例由第一終端將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包,然后將所述熱修復(fù)補丁包下發(fā)至已安裝所述預(yù)設(shè)應(yīng)用的第二終端;所述第二終端接收并保存所述熱修復(fù)補丁包,當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,則加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù);從而實現(xiàn)了對異常應(yīng)用程序的熱修復(fù),整個修復(fù)過程動態(tài)靜默執(zhí)行,無需用戶進行任何操作,極大地簡化了應(yīng)用程序的修復(fù)操作,也無需中斷用戶的當(dāng)前業(yè)務(wù),提升了用戶體驗感;且本發(fā)明只對發(fā)生異常的地方進行修復(fù),有效地降低了版本發(fā)布和升級的成本,修復(fù)效率高。
圖7示出了本發(fā)明實施例提供的終端的組成結(jié)構(gòu),為了便于說明,僅示出了與本發(fā)明實施例相關(guān)的部分。
在本發(fā)明實施例中,所述終端用于實現(xiàn)上述圖1至圖5實施例中所述的開發(fā)者側(cè)的第一終端1的功能,所述終端包括但不限于電腦、服務(wù)器等計算機設(shè)備。
參閱圖7,所述終端包括:
生成模塊11,用于將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包;
下發(fā)模塊12,用于將所述熱修復(fù)補丁包下發(fā)至已安裝所述預(yù)設(shè)應(yīng)用的第二終端,以使得所述第二終端在所述預(yù)設(shè)應(yīng)用啟動時加載所述熱修復(fù)補丁包并對所述預(yù)設(shè)應(yīng)用進行熱修復(fù)。
進一步地,作為本發(fā)明的一個優(yōu)選示例,所述生成模塊11包括:
運算單元111,用于對所述預(yù)設(shè)應(yīng)用的已修復(fù)版本中的每一個類進行哈希運算,得到第一哈希文件。
第一比對單元112,用于將所述第一哈希文件與所述預(yù)設(shè)應(yīng)用的未修復(fù)版本的第二哈希文件進行比對,得到修復(fù)后的類并生成所述類的class文件。
第一打包單元113,用于根據(jù)所述class文件生成dex文件,并將所述dex文件打包為熱修復(fù)補丁包。
進一步地,作為本發(fā)明的另一個優(yōu)選示例,所述生成模塊11還包括:
編譯單元114,用于保存所述預(yù)設(shè)應(yīng)用的未修復(fù)版本中class文件的消息摘要信息,使用未修復(fù)版本的mapping文件來編譯已修復(fù)版本,生成消息摘要信息。
第二比對單元115,用于將編譯后的所述消息摘要信息與所述預(yù)設(shè)應(yīng)用的已修復(fù)版本中class文件的消息摘要信息進行比對,得到修復(fù)后的class文件。
第二打包單元116,用于根據(jù)所述修復(fù)后的class文件生成dex文件,并將所述dex文件打包為熱修復(fù)補丁包。
圖8示出了本發(fā)明實施例提供的終端的組成結(jié)構(gòu),為了便于說明,僅示出了與本發(fā)明實施例相關(guān)的部分。
在本發(fā)明實施例中,所述終端用于實現(xiàn)上述圖1至圖5實施例中所述的用戶側(cè)的第二終端2的功能,所述終端包括但不限于智能手機、平板電腦、電視機、播放器等智能設(shè)備。
參閱圖8,所述終端包括:
接收模塊21,用于接收并保存第一終端下發(fā)的熱修復(fù)補丁包。
修復(fù)模塊22,用于當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù)。
進一步地,所述修復(fù)模塊22包括:
寫入單元221,用于在所述預(yù)設(shè)應(yīng)用啟動時,將所述熱修復(fù)補丁包寫入到所述預(yù)設(shè)應(yīng)用的私有目錄文件中。
獲取單元222,用于從所述熱修復(fù)補丁包的dex文件中獲取第一dexElements數(shù)組,以及從所述預(yù)設(shè)應(yīng)用的未修復(fù)版本中獲取第二dexElements數(shù)組。
拼接單元223,用于拼接所述第一dexElements數(shù)組和第二dexElements數(shù)組,得到第三dexElements數(shù)組,并將所述dex文件插入至所述第三dexElements數(shù)組的首位。
修復(fù)單元224,用于將所述第三dexElements數(shù)組通過反射的方式設(shè)置給熱修復(fù)補丁列表再賦值回類加載器,以使得所述類加載器載入所述dex文件。
需要說明的是,本發(fā)明實施例中的系統(tǒng)可以用于實現(xiàn)上述方法實施例中的全部技術(shù)方案,其各個功能模塊的功能可以根據(jù)上述方法實施例中的方法具體實現(xiàn),其具體實現(xiàn)過程可參照上述實例中的相關(guān)描述,此處不再贅述。
綜上所述,本發(fā)明實施例由第一終端將預(yù)設(shè)應(yīng)用的修復(fù)代碼打包生成熱修復(fù)補丁包,然后將所述熱修復(fù)補丁包下發(fā)至已安裝所述預(yù)設(shè)應(yīng)用的第二終端;所述第二終端接收并保存所述熱修復(fù)補丁包,當(dāng)所述預(yù)設(shè)應(yīng)用啟動時,則加載所述熱修復(fù)補丁包,對所述預(yù)設(shè)應(yīng)用進行熱修復(fù);從而實現(xiàn)了對異常應(yīng)用程序的熱修復(fù),整個修復(fù)過程動態(tài)靜默執(zhí)行,無需用戶進行任何操作,極大地簡化了應(yīng)用程序的修復(fù)操作,也無需中斷用戶的當(dāng)前業(yè)務(wù),提升了用戶體驗感;且本發(fā)明只對發(fā)生異常的地方進行修復(fù),有效地降低了版本發(fā)布和升級的成本,修復(fù)效率高。
本領(lǐng)域普通技術(shù)人員可以意識到,結(jié)合本文中所公開的實施例描述的各示例的單元及算法步驟,能夠以電子硬件、或者計算機軟件和電子硬件的結(jié)合來實現(xiàn)。這些功能究竟以硬件還是軟件方式來執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計約束條件。專業(yè)技術(shù)人員可以對每個特定的應(yīng)用來使用不同方法來實現(xiàn)所描述的功能,但是這種實現(xiàn)不應(yīng)認為超出本發(fā)明的范圍。
所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統(tǒng)、模塊和單元的具體工作過程,可以參考前述方法實施例中的對應(yīng)過程,在此不再贅述。
在本申請所提供的幾個實施例中,應(yīng)該理解到,所揭露的應(yīng)用程序的熱修復(fù)方法及終端,可以通過其它的方式實現(xiàn)。例如,以上所描述的系統(tǒng)實施例僅僅是示意性的,例如,所述模塊、單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,系統(tǒng)、模塊或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。
另外,在本發(fā)明各個實施例中的各功能單元、模塊可以集成在一個處理單元中,也可以是各個單元、模塊單獨物理存在,也可以兩個或兩個以上單元、模塊集成在一個單元中。
所述功能如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分或者該技術(shù)方案的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、移動硬盤、只讀存儲器(ROM,Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
以上所述,僅為本發(fā)明的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應(yīng)所述以權(quán)利要求的保護范圍為準(zhǔn)。