希信息為存儲在本地的熱更新執(zhí)行代碼的哈希信息;
[0047] 第一確定單元,用于當(dāng)所述第一哈希信息與所述第二哈希信息一致時(shí),確定所述 程序不需要進(jìn)行更新;
[0048] 第二確定單元,用于當(dāng)所述第一哈希信息與所述第二哈希信息不一致時(shí),確定所 述程序需要進(jìn)行更新;
[0049] 所述熱更新裝置還包括哈希信息更替模塊,用于在更新所述變量或函數(shù)的內(nèi)容之 后,存儲所述第一哈希信息,并將所述第一哈希信息覆蓋所述第二哈希信息。
[0050] 作為更優(yōu)選地,所述執(zhí)行代碼運(yùn)行模塊具體包括:
[0051] 哈希信息計(jì)算單元,用于計(jì)算獲取到的熱更新執(zhí)行代碼的哈希信息;
[0052] 第二判斷單元,用于判斷獲取到的熱更新執(zhí)行代碼的哈希信息與所述第一哈希信 息是否一致;
[0053] 執(zhí)行單元,用于當(dāng)獲取到的熱更新執(zhí)行代碼的哈希信息與所述第一哈希信息一致 時(shí),運(yùn)行所述熱更新執(zhí)行代碼,根據(jù)所述標(biāo)識信息查找需要被更新的變量或函數(shù),并將所述 更新內(nèi)容代碼替換所述變量或函數(shù)在內(nèi)存中的本地內(nèi)容代碼,以更新所述變量或函數(shù)的內(nèi) 容。
[0054] 作為更優(yōu)選地,所述熱更新裝置還包括:
[0055] 二次獲取模塊,用于當(dāng)獲取到的熱更新代碼的哈希信息與所述第一哈希信息不一 致時(shí),重新從服務(wù)器獲取用于對所述程序熱更新的熱更新代碼。
[0056] 作為更優(yōu)選地,所述哈希信息為對應(yīng)的熱更新執(zhí)行代碼的MD5值。
[0057]本發(fā)明的有益效果在于:本實(shí)施例提供了一種熱更新方法,在熱更新時(shí)直接替換 模塊中需要更新的變量或函數(shù)的內(nèi)容,使得所述模塊創(chuàng)建的新/舊對象在調(diào)用所述變量或 函數(shù)時(shí)都能以新的內(nèi)容運(yùn)行,從而無需記錄所述模塊的實(shí)例化情況,無需另行對依據(jù)模塊 創(chuàng)建舊對象進(jìn)行追蹤和逐一替換,大大減少了客戶端進(jìn)行程序的熱更新時(shí)的復(fù)雜度;不需 要重新加載模塊以及檢測被加載過的模塊,這對程序的源代碼設(shè)計(jì)沒有特定要求,節(jié)省了 熱更新的耗時(shí)以及降低了出錯(cuò)的可能性,提高了系統(tǒng)的穩(wěn)定性;由于所述更新內(nèi)容代碼時(shí) 用于替換需要更新的變量或函數(shù)的本地內(nèi)容代碼的,因此在獲取熱更新執(zhí)行代碼時(shí)無需獲 取整個(gè)模塊的代碼,只需要獲取需要更新的變量或函數(shù)那部分的代碼,從而大大減少了流 量;由于本方法沒有采用reload的方式進(jìn)行熱更新,因而減少了開發(fā)人員在編寫熱更新代 碼時(shí)受到的限制。同時(shí),由于引入了哈希信息來判斷是否需要進(jìn)行熱更新,因此大大避免了 客戶端由于重復(fù)獲取熱更新執(zhí)行代碼導(dǎo)致的流量的浪費(fèi)。另外,哈希信息的使用也避免了 客戶端利用傳輸過程中出錯(cuò)的熱更新執(zhí)行代碼進(jìn)行熱更新而導(dǎo)致的系統(tǒng)出錯(cuò)、崩潰等現(xiàn)象 的發(fā)生,保證了客戶端系統(tǒng)的穩(wěn)定性以及良好的用戶體驗(yàn)。
【附圖說明】
[0058] 圖1是本發(fā)明實(shí)施例提供的熱更新方法的的流程示意圖;
[0059] 圖2是本發(fā)明實(shí)施例提供的熱更新方法的步驟S1的流程示意圖;
[0060] 圖3是本發(fā)明實(shí)施例提供的熱更新方法的步驟S3的流程示意圖;
[0061 ]圖4是本發(fā)明實(shí)施例提供的熱更新裝置的結(jié)構(gòu)框圖;
[0062] 圖5是本發(fā)明實(shí)施例提供的熱更新裝置的熱更新檢測模塊1的結(jié)構(gòu)框圖;
[0063] 圖6是本發(fā)明實(shí)施例提供的熱更新裝置的執(zhí)行代碼運(yùn)行模塊3的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0064]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完 整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;?本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他 實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0065] 參見圖1,是本發(fā)明實(shí)施例提供的熱更新方法的流程示意圖,包括步驟S1至S4,具 體如下:
[0066] S1,檢測當(dāng)前運(yùn)行中的程序是否需要進(jìn)行熱更新;
[0067] S2,當(dāng)確定所述程序需要進(jìn)行熱更新時(shí),從服務(wù)器中獲取熱更新執(zhí)行代碼;所述熱 更新執(zhí)行代碼包括標(biāo)識信息與更新內(nèi)容代碼;所述標(biāo)識信息用于標(biāo)識所述程序的模塊中需 要被更新的變量或函數(shù);每個(gè)所述的變量或函數(shù)在內(nèi)存中存儲了對應(yīng)的本地內(nèi)容代碼;所 述更新內(nèi)容代碼用于替換需要被更新的變量或函數(shù)在內(nèi)存中的本地內(nèi)容代碼;
[0068] S3,運(yùn)行所述熱更新執(zhí)行代碼,根據(jù)所述標(biāo)識信息查找需要被更新的變量或函數(shù), 并將所述更新內(nèi)容代碼替換所述變量或函數(shù)在內(nèi)存中的本地內(nèi)容代碼,以更新所述變量或 函數(shù)的內(nèi)容;
[0069] S4,當(dāng)通過所述模塊創(chuàng)建的對象調(diào)用所述變量或函數(shù)時(shí),以所述更新內(nèi)容代碼作 為所述變量或函數(shù)的內(nèi)容運(yùn)行。
[0070] 在本實(shí)施例中所述熱更新執(zhí)行代碼可以為但不限于Python代碼。
[0071] 所述熱更新執(zhí)行代碼屬于腳本代碼,用于指導(dǎo)客戶端如何進(jìn)行熱更新。在本實(shí)施 例中,開發(fā)人員先在客戶端中定位到存在問題的模塊,然后單獨(dú)取出所述模塊存在問題的 函數(shù)或者變量,放在熱更新執(zhí)行代碼中進(jìn)行修正。客戶端在接收到所述熱更新執(zhí)行代碼時(shí) 能夠根據(jù)所述熱更新執(zhí)行代碼對所述模塊存在問題的函數(shù)或者變量的內(nèi)容進(jìn)行更新。具體 地,所述運(yùn)行所述熱更新執(zhí)行代碼包括:將所述熱更新執(zhí)行代碼編譯為可執(zhí)行的代碼模塊, 并執(zhí)行編譯好的代碼模塊。對于Python代碼來說,此處提到的編譯以及執(zhí)行可以借助 Python內(nèi)置的compile以及exec方法來實(shí)現(xiàn)。
[0072] 所述標(biāo)識信息用于記錄所述模塊中需要被更新的變量或函數(shù);所述標(biāo)識信息可以 為每個(gè)需要被更新的變量或函數(shù)在客戶端的存儲地址。
[0073] 所述更新內(nèi)容代碼包括N份子代碼,所述N份子代碼一一對應(yīng)于所述標(biāo)識信息所記 錄的N個(gè)需要被更新的變量或函數(shù)。在步驟S3的替換過程中,在確定一個(gè)需要被更新的變量 或函數(shù)時(shí),將所述需要被更新的變量或函數(shù)所對應(yīng)的子代碼覆蓋所述需要被更新的變量或 函數(shù)在內(nèi)存中的本地內(nèi)容代碼存儲,以更新所述變量或函數(shù)的內(nèi)容。
[0074] 需要說明的是,當(dāng)模塊中有變量和函數(shù)都需要更新時(shí),所述標(biāo)識信息同時(shí)記錄需 要被更新的變量和函數(shù);在替換時(shí),變量對應(yīng)于變量替換,而函數(shù)對應(yīng)于函數(shù)替換。
[0075] 在步驟S4中,所述通過所述模塊創(chuàng)建的對象是包括熱更新之前創(chuàng)建的對象,以及 熱更新之后創(chuàng)建的對象。由于變量或函數(shù)的內(nèi)存地址沒有改變,改變的是變量或函數(shù)的內(nèi) 容,因此,無論是舊的對象還是新的對象,在調(diào)用所述變量或函數(shù)時(shí)都能夠以所述變量或函 數(shù)的更新后的內(nèi)容運(yùn)行,從而無需記錄所述模塊的實(shí)例化情況。
[0076]作為更優(yōu)選地,所述步驟S4具體包括:
[0077] 當(dāng)通過所述模塊創(chuàng)建的對象調(diào)用所述變量或函數(shù)時(shí),檢查所述變量或函數(shù)的內(nèi)容 相對于所述對象是否有新增的變量;
[0078] 當(dāng)有新增的變量時(shí),對所述新增的變量初始化賦值,并以所述更新內(nèi)容代碼作為 所述變量或函數(shù)的內(nèi)容運(yùn)行;
[0079] 當(dāng)沒有新增的變量時(shí),直接以所述更新內(nèi)容代碼作為所述變量或函數(shù)的內(nèi)容運(yùn) 行。
[0080] 例如,當(dāng)對一個(gè)模塊中的一個(gè)函數(shù)的內(nèi)容進(jìn)行更新后,在函數(shù)的內(nèi)容中新增加了 一個(gè)變量。在舊的對象調(diào)用所述函數(shù)時(shí),由于不存在所述新增的變量,造成的前后數(shù)據(jù)不一 致而出錯(cuò)。而在本實(shí)施例中,當(dāng)發(fā)現(xiàn)所述變量或函數(shù)的內(nèi)容相對于所述對象有新增的變量 時(shí),對所述新增的變量初始化賦值來修復(fù)新增變量缺失的問題。
[0081] 本實(shí)施例提供了一種熱更新方法,在熱更新時(shí)直接替換模塊中需要更新的變量或 函數(shù)的內(nèi)容,使得所述模塊創(chuàng)建的新/舊對象在調(diào)用所述變量或函數(shù)時(shí)都能以新的內(nèi)容運(yùn) 行,從而無需記錄所述模塊的實(shí)例化情況,無需另行對依據(jù)模塊創(chuàng)建舊對象進(jìn)行追蹤和逐 一替換,大大減少了客戶端進(jìn)行程序的熱更新時(shí)的復(fù)雜度;由于所述更新內(nèi)容代碼時(shí)用于 替換需要更新的變量或函數(shù)的本地內(nèi)容代碼的,因此在獲取熱更新執(zhí)行代碼時(shí)無需獲取整 個(gè)模塊的代碼,只需要獲取需要更新的變量或函數(shù)那部分的代碼,從而大大減少了流量;由 于本方法沒有采用reload的方式進(jìn)行熱更新,因而減少了開發(fā)人員在編寫熱更新代碼時(shí)受 到的限制。
[0082] 作為對本實(shí)施例的進(jìn)一步改進(jìn),所述步驟S1還包括步驟S11~S14。
[0083]參見圖2,是本發(fā)明實(shí)施例提供的熱更新方法的步驟S1的流程示意圖,包括: