本申請實(shí)施例涉及計(jì)算機(jī)技術(shù),尤其涉及一種應(yīng)用程序加載方法、服務(wù)器及終端。
背景技術(shù):
隨著互聯(lián)網(wǎng)的發(fā)展,應(yīng)用程序(application,app)等的種類和數(shù)量越來越多。開發(fā)人員通過開發(fā)各種app來滿足用戶需求。
目前,開發(fā)人員通過reactnative(rn)熱更新平臺(tái)開發(fā)app,一個(gè)app包括多個(gè)捆綁(bundle)文件。終端的app需要更新一些內(nèi)容(如運(yùn)營的彈窗或者功能模塊)時(shí),可以直接從熱更新平臺(tái)的服務(wù)器下載該app的多個(gè)bundle文件,然后該app解析并加載下載的多個(gè)bundle文件,在無需下載安裝新版本的app的同時(shí),實(shí)現(xiàn)更新該app的內(nèi)容的功能。
然而,一個(gè)app包含多個(gè)業(yè)務(wù),每個(gè)業(yè)務(wù)都有對應(yīng)的bundle文件,如何從多個(gè)bundle文件中找到當(dāng)前業(yè)務(wù)對應(yīng)的bundle文件并加載,實(shí)為業(yè)界亟待解決的問題。
技術(shù)實(shí)現(xiàn)要素:
本申請實(shí)施例提供一種應(yīng)用程序加載方法、服務(wù)器及終端,通過根據(jù)待加載業(yè)務(wù)對應(yīng)的bundle文件的標(biāo)識(shí)讀取配置文件,快速獲得待加載業(yè)務(wù)對應(yīng)的bundle文件,實(shí)現(xiàn)快速加載bundle文件的目的。
第一方面,本申請實(shí)施例提供一種應(yīng)用程序加載方法,包括:
服務(wù)器將n個(gè)捆綁文件中的每個(gè)捆綁文件拆分為公共部分和業(yè)務(wù)部分,以得到1個(gè)公共部分和n個(gè)業(yè)務(wù)部分,n≥1,且為整數(shù);
所述服務(wù)器根據(jù)所述1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到壓縮文件,所述壓縮文件從外到內(nèi)依次為所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分,所述屬性配置文件用于描述1個(gè)公共部分的屬性和n個(gè)業(yè)務(wù)部分中每個(gè)業(yè)務(wù)部分的屬性;
所述服務(wù)器向終端發(fā)送所述壓縮包。
在一種可行的設(shè)計(jì)中,所述n個(gè)捆綁文件包含第一捆綁文件,所述第一捆綁文件包含所述公共部分和第一業(yè)務(wù)部分,所述n個(gè)業(yè)務(wù)部分包含所述第一業(yè)務(wù)部分,所述服務(wù)器向終端發(fā)送所述壓縮包之后,還包括:
所述服務(wù)器更新所述第一業(yè)務(wù)部分,得到第一更新業(yè)務(wù)部分;
所述服務(wù)器向所述終端發(fā)送所述第一更新業(yè)務(wù)部分。
在一種可行的設(shè)計(jì)中,所述服務(wù)器向終端發(fā)送所述壓縮包之后,還包括:
所述服務(wù)器更新所述公共部分,得到更新公共部分;
所述服務(wù)器向所述終端發(fā)送所述更新公共部分。
在一種可行的設(shè)計(jì)中,所述服務(wù)器根據(jù)所述1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到壓縮文件,包括:
所述服務(wù)器將所述n個(gè)業(yè)務(wù)部分打包成n個(gè)補(bǔ)丁文件;
所述服務(wù)器根據(jù)所述1個(gè)公共部分、所述n個(gè)補(bǔ)丁文件和所述屬性配置文件得到所述壓縮文件。
第二方面,本申請實(shí)施例提供一種應(yīng)用程序加載方法,包括:
終端接收服務(wù)器發(fā)送的壓縮文件,所述壓縮文件從外到內(nèi)依次為1個(gè)公共部分、屬性配置文件以及n個(gè)業(yè)務(wù)部分,所述屬性配置文件用于描述所述1個(gè)公共部分的屬性和所述n個(gè)業(yè)務(wù)部分中每個(gè)業(yè)務(wù)部分的屬性,所述1個(gè)公共部分和n個(gè)業(yè)務(wù)部分為所述服務(wù)器對n個(gè)捆綁文件中的每個(gè)捆綁文件進(jìn)行拆分得到的;
所述終端根據(jù)所述屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分;
所述終端合并所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和所述1個(gè)公共部分,以加載所述待加載業(yè)務(wù)。
在一種可行的設(shè)計(jì)中,所述終端根據(jù)所述屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分,包括:
所述終端解壓縮所述壓縮文件,依次釋放所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分;
所述終端根據(jù)所述配置文件構(gòu)建bundle目錄,根據(jù)所述bundle目錄存儲(chǔ)所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分;
所述終端根據(jù)所述bundle目錄,確定所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分。
在一種可行的設(shè)計(jì)中,所述n個(gè)捆綁文件包含第一捆綁文件,所述第一捆綁文件包含所述公共部分和第一業(yè)務(wù)部分,所述n個(gè)業(yè)務(wù)部分包含所述第一業(yè)務(wù)部分,所述終端合并所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和所述1個(gè)公共部分之后,還包括:
所述終端接收所述服務(wù)器發(fā)送的第一更新業(yè)務(wù)部分,所述第一更新業(yè)務(wù)部分為所述服務(wù)器對所述第一業(yè)務(wù)部分進(jìn)行更新得到;
所述終端根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分。
在一種可行的設(shè)計(jì)中,所述終端根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分,包括:
所述終端判斷是否需要更新所述公共部分,若需要,則先更新所述公共部分,再根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分;若不需要,則根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分。
在一種可行的設(shè)計(jì)中,所述終端合并所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和所述1個(gè)公共部分之后,還包括:
所述終端接收所述服務(wù)器發(fā)送的更新公共部分,所述更新公共部分為所述服務(wù)器對所述公共部分進(jìn)行更新得到;
所述終端根據(jù)所述更新公共部分更新所述公共部分。
第三方面,本申請實(shí)施例提供一種服務(wù)器,包括:
處理模塊,用于將n個(gè)捆綁文件中的每個(gè)捆綁文件拆分為公共部分和業(yè)務(wù)部分,以得到1個(gè)公共部分和n個(gè)業(yè)務(wù)部分,n≥1,且為整數(shù);根據(jù)所述1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到壓縮文件,所述壓縮文件從外到內(nèi)依次為所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分,所述屬性配置文件用于描述1個(gè)公共部分的屬性和n個(gè)業(yè)務(wù)部分中每個(gè)業(yè)務(wù)部分的屬性;
收發(fā)模塊,用于向終端發(fā)送所述壓縮包。
在一種可行的設(shè)計(jì)中,所述n個(gè)捆綁文件包含第一捆綁文件,所述n個(gè)業(yè)務(wù)部分包含所述第一業(yè)務(wù)部分,所述第一捆綁文件包含所述公共部分和第一業(yè)務(wù)部分,所述處理模塊,在所述收發(fā)模塊向終端發(fā)送所述壓縮包之后,還用于更新所述第一業(yè)務(wù)部分,得到第一更新業(yè)務(wù)部分;
所述收發(fā)模塊,還用于向所述終端發(fā)送所述第一更新業(yè)務(wù)部分。
在一種可行的設(shè)計(jì)中,所述處理模塊,在所述收發(fā)模塊向終端發(fā)送所述壓縮包之后,還用于更新所述公共部分,得到更新公共部分;
所述收發(fā)模塊,還用于向所述終端發(fā)送所述更新公共部分。
在一種可行的設(shè)計(jì)中,所述處理模塊,在根據(jù)所述1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到壓縮文件時(shí),具體用于將所述n個(gè)業(yè)務(wù)部分打包成n個(gè)補(bǔ)丁文件;根據(jù)所述1個(gè)公共部分、所述n個(gè)補(bǔ)丁文件和所述屬性配置文件得到所述壓縮文件。
第四方面,本申請實(shí)施例提供一種終端,包括:
收發(fā)模塊,用于接收服務(wù)器發(fā)送的壓縮文件,所述壓縮文件從外到內(nèi)依次為1個(gè)公共部分、屬性配置文件以及n個(gè)業(yè)務(wù)部分,所述屬性配置文件用于描述所述1個(gè)公共部分的屬性和所述n個(gè)業(yè)務(wù)部分中每個(gè)業(yè)務(wù)部分的屬性,所述1個(gè)公共部分和n個(gè)業(yè)務(wù)部分為所述服務(wù)器對n個(gè)捆綁文件中的每個(gè)捆綁文件進(jìn)行拆分得到的;
處理模塊,用于根據(jù)所述屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分;合并所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和所述1個(gè)公共部分,以加載所述待加載業(yè)務(wù)。
在一種可行的設(shè)計(jì)中,所述處理模塊,在根據(jù)所述屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分時(shí),具體用于解壓縮所述壓縮文件,依次釋放所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分;根據(jù)所述配置文件構(gòu)建bundle目錄,根據(jù)所述bundle目錄存儲(chǔ)所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分;根據(jù)所述bundle目錄,確定所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分。
在一種可行的設(shè)計(jì)中,所述n個(gè)捆綁文件包含第一捆綁文件,所述第一捆綁文件包含所述公共部分和第一業(yè)務(wù)部分,所述n個(gè)業(yè)務(wù)部分包含所述第一業(yè)務(wù)部分,所述收發(fā)模塊,在所述處理模塊合并所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和所述1個(gè)公共部分之后,還用于接收所述服務(wù)器發(fā)送的第一更新業(yè)務(wù)部分,所述第一更新業(yè)務(wù)部分為所述服務(wù)器對所述第一業(yè)務(wù)部分進(jìn)行更新得到;
所述處理模塊,還用于根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分。
在一種可行的設(shè)計(jì)中,所述處理模塊,在根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分時(shí),具體用于判斷是否需要更新所述公共部分,若需要,則先更新所述公共部分,再根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分;若不需要,則根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分。
在一種可行的設(shè)計(jì)中,所述收發(fā)模塊,在所述處理模塊合并所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和所述1個(gè)公共部分之后,還用于接收所述服務(wù)器發(fā)送的更新公共部分,所述更新公共部分為所述服務(wù)器對所述公共部分進(jìn)行更新得到;
所述處理模塊,還用于根據(jù)所述更新公共部分更新所述公共部分。
本申請實(shí)施例提供的應(yīng)用程序加載方法、服務(wù)器及終端,服務(wù)器將對應(yīng)同一個(gè)業(yè)務(wù)的n個(gè)bundle文件中的每個(gè)bundle文件拆分為公共部分和業(yè)務(wù)部分,得到1個(gè)公共部分和n個(gè)業(yè)務(wù)部分,根據(jù)該1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到從外到內(nèi)依次為1個(gè)公共部分、屬性配置文件以及n個(gè)業(yè)務(wù)部分的壓縮文件并發(fā)送給終端,使得終端根據(jù)屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分,進(jìn)而合并待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和1個(gè)公共部分,以加載待加載業(yè)務(wù)。該過程中,終端根據(jù)待加載業(yè)務(wù)對應(yīng)的bundle文件的標(biāo)識(shí)讀取屬性配置文件,快速獲得待加載業(yè)務(wù)對應(yīng)的bundle文件,實(shí)現(xiàn)快速加載bundle文件的目的。
附圖說明
圖1為本申請應(yīng)用程序加載方法實(shí)施例一的信令圖;
圖2為本申請應(yīng)用程序加載方法中壓縮文件的結(jié)構(gòu)示意圖;
圖3為本申請應(yīng)用程序加載方法中的bundle目錄的示意圖;
圖4為本申請應(yīng)用程序加載方法的一個(gè)舉例示意圖;
圖5為本申請應(yīng)用程序加載方法所適用的更新過程示意圖;
圖6為本申請服務(wù)器的結(jié)構(gòu)示意圖;
圖7為本申請終端的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本申請實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本申請實(shí)施例中的附圖,對本申請實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本申請一部分實(shí)施例,而不是全部的實(shí)施例?;诒旧暾堉械膶?shí)施例,本領(lǐng)域技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本申請保護(hù)的范圍。以下內(nèi)容為結(jié)合附圖及較佳實(shí)施例,對依據(jù)本申請申請的具體實(shí)施方式、結(jié)構(gòu)、特征及其功效的詳細(xì)說明。
本申請的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”、“第三”、“第四”等(如果存在)是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本申請的實(shí)施例例如能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤?。此外,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
reactnative是臉書(facebook)開源的,可同時(shí)用來開發(fā)ios和android應(yīng)用的技術(shù)。開發(fā)人員通過reactnative(rn)熱更新平臺(tái)開發(fā)app,一個(gè)app包括多個(gè)捆綁(bundle)文件。終端的app需要更新一些內(nèi)容(如運(yùn)營的彈窗或者功能模塊)時(shí),可以直接從熱更新平臺(tái)的服務(wù)器下載該app的多個(gè)bundle文件,然后該app解析并加載下載的多個(gè)bundle文件,在無需下載安裝新版本的app的同時(shí),實(shí)現(xiàn)更新該app的內(nèi)容的功能。
通常來說,移動(dòng)互聯(lián)網(wǎng)行業(yè)應(yīng)用可分為兩種,一種是基于本地操作系統(tǒng),如ios或android操作系統(tǒng)運(yùn)行的app,稱之為nativeapp;一種是基于智能終端的瀏覽器運(yùn)行的webapp。開發(fā)人員通過reactnative(rn)熱更新平臺(tái)開發(fā)app,一個(gè)app包括多個(gè)捆綁(bundle)文件。下載app時(shí),終端從熱更新平臺(tái)的服務(wù)器下載該app的多個(gè)bundle文件,然后安裝app并使用。
然而,一個(gè)app包含多個(gè)業(yè)務(wù),每個(gè)業(yè)務(wù)都有對應(yīng)的bundle文件,如何從多個(gè)bundle文件中找到當(dāng)前業(yè)務(wù)對應(yīng)的bundle文件并加載,實(shí)為業(yè)界亟待解決的問題。
因此,如何快速加載app,實(shí)為業(yè)界亟待解決的問題。
有鑒于此,本申請實(shí)施例提供一種應(yīng)用程序加載方法、服務(wù)器及終端,通過對多個(gè)bundle文件進(jìn)行配置,實(shí)現(xiàn)快速加載bundle文件的目的。具體的,可參加圖1。
圖1為本申請應(yīng)用程序加載方法實(shí)施例一的信令圖,本實(shí)施例從服務(wù)器與終端交互的角度對本申請應(yīng)用程序下載方法進(jìn)行詳細(xì)說明。具體的,本實(shí)施例包括:
101、服務(wù)器將n個(gè)捆綁文件中的每個(gè)捆綁文件拆分為公共部分和業(yè)務(wù)部分。
本申請實(shí)施例中,一個(gè)app可支持多種業(yè)務(wù),如58同城app中包括的租房、招聘、二手、黃頁等多個(gè)業(yè)務(wù),每個(gè)業(yè)務(wù)具有不同的特征,并且每個(gè)業(yè)務(wù)對應(yīng)n個(gè)捆綁(bundle)文件,對應(yīng)同一個(gè)業(yè)務(wù)的n個(gè)bundle文件中,每個(gè)bundle文件可拆分為公共部分和業(yè)務(wù)部分,n個(gè)bundle文件的公共部分相同,業(yè)務(wù)部分不同。其中,公共部分指bundle文件中和熱更新平臺(tái)自身邏輯有關(guān)的部分,業(yè)務(wù)部分時(shí)指bundle文件中和業(yè)務(wù)邏輯相關(guān)的部分。對應(yīng)同一個(gè)業(yè)務(wù)的n個(gè)bundle文件的公共部分與rn熱更新平臺(tái)自身邏輯相關(guān)的部分相同,而對應(yīng)同一個(gè)業(yè)務(wù)的n個(gè)bundle文件的業(yè)務(wù)部分不同。因此,本步驟中,熱更新平臺(tái)的服務(wù)器將對應(yīng)同一個(gè)業(yè)務(wù)的n個(gè)bundle文件中的每個(gè)bundle文件拆分為公共部分和業(yè)務(wù)部分,由于n個(gè)bundle文件的公共部分相同,因此可視為1個(gè)公共部分,從而得到1個(gè)公共部分和n個(gè)業(yè)務(wù)部分。
102、所述服務(wù)器根據(jù)所述1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到壓縮文件。
本步驟中,服務(wù)器對1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件進(jìn)行壓縮,得到壓縮文件。該壓縮文件從外到內(nèi)依次為所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分,所述屬性配置文件用于描述1個(gè)公共部分的屬性和n個(gè)業(yè)務(wù)部分中每個(gè)業(yè)務(wù)部分的屬性。
103、服務(wù)器向終端發(fā)送所述壓縮包。
壓縮完畢后,服務(wù)器將該壓縮文件發(fā)送給終端。相應(yīng)的,終端接收該壓縮文件。
104、終端根據(jù)所述屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分。
接收到壓縮文件后,終端釋放壓縮文件,根據(jù)待加載業(yè)務(wù)對應(yīng)的bundle的標(biāo)識(shí),讀取屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分。
105、所述終端合并所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和所述1個(gè)公共部分,以加載所述待加載業(yè)務(wù)。
在確定出待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分后,終端合并待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和1個(gè)公共部分,以加載待加載業(yè)務(wù)。
本申請實(shí)施例提供的應(yīng)用程序加載方法,服務(wù)器將對應(yīng)同一個(gè)業(yè)務(wù)的n個(gè)bundle文件中的每個(gè)bundle文件拆分為公共部分和業(yè)務(wù)部分,得到1個(gè)公共部分和n個(gè)業(yè)務(wù)部分,根據(jù)該1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到從外到內(nèi)依次為1個(gè)公共部分、屬性配置文件以及n個(gè)業(yè)務(wù)部分的壓縮文件并發(fā)送給終端,使得終端根據(jù)屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分,進(jìn)而合并待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和1個(gè)公共部分,以加載待加載業(yè)務(wù)。該過程中,終端根據(jù)待加載業(yè)務(wù)對應(yīng)的bundle文件的標(biāo)識(shí)讀取屬性配置文件,快速獲得待加載業(yè)務(wù)對應(yīng)的bundle文件,實(shí)現(xiàn)快速加載bundle文件的目的。
圖2為本申請應(yīng)用程序加載方法中壓縮文件的結(jié)構(gòu)示意圖。請參照圖2,本申請實(shí)施例中,壓縮文件例如為zip壓縮包,屬性配置文件包含的屬性數(shù)據(jù)用于描述1個(gè)公共部分的屬性和n個(gè)業(yè)務(wù)部分中每個(gè)業(yè)務(wù)部分的屬性,如公共部分的標(biāo)識(shí)、公共部分的版本號(hào)、業(yè)務(wù)部分的標(biāo)識(shí)、業(yè)務(wù)部分的版本號(hào)、業(yè)務(wù)部分對應(yīng)的公共部分等。下面,假設(shè)一個(gè)bundle文件的標(biāo)識(shí)為bundleid,該bundle文件的公共部分表示為“common.bundle”、公共部分相同的多個(gè)bundle文件中,每個(gè)bundle文件的業(yè)務(wù)部分經(jīng)過打包得到補(bǔ)丁文件(patch),屬性配置文件表示為“config.json”,則config.json的一個(gè)示例為:
根據(jù)該屬性配置文件可知:一個(gè)bundle文件的標(biāo)識(shí),即bundleid為456,改bundle文件的版本號(hào)為789。
終端在接收到服務(wù)器發(fā)送的zip壓縮包后,解壓縮該zip壓縮包,并釋放該zip壓縮包。釋放過程中,建立不同的文件夾,并在不同的文件夾中放置不同的文件,從而將zip壓縮包的各個(gè)文件釋放到磁盤并存儲(chǔ)。具體的,終端根據(jù)bundle文件的id命名并建立文件夾,在每個(gè)文件夾中再命名并建立patch文件夾,用于放置對應(yīng)的patch,commcon.bundle和屬性配置文件放置在最外層。例如,終端根據(jù)該壓縮包中的公共部分的標(biāo)識(shí)建立一級(jí)文件夾,不同的公共部分對應(yīng)不同的一級(jí)文件夾。對于一個(gè)具體的公共部分,在該公共部分對應(yīng)的一級(jí)文件夾中放置屬性配置文件,并建立至少一個(gè)二級(jí)文件夾,二級(jí)文件夾的名稱根據(jù)bundleid命名,也就是說,公共部分相同、業(yè)務(wù)部分不同的各個(gè)bundle文件分別對應(yīng)不同的二級(jí)文件夾,而公共部分相同。業(yè)務(wù)部分不同的bundle文件具有不同的bundleid,因此,一級(jí)文件夾中,每個(gè)bundleid對應(yīng)一個(gè)二級(jí)文件夾。對于一個(gè)具體的bundleid,在該bundleid對應(yīng)的二級(jí)文件夾中建立三級(jí)文件夾,每個(gè)三級(jí)文件夾用于放置patch,該三級(jí)文件夾的名稱根據(jù)放置的patch命名。根據(jù)一級(jí)文件夾、二級(jí)文件夾以及三級(jí)文件夾的放置順序,可知:zip壓縮包從外到內(nèi)依次為1個(gè)公共部分、屬性配置文件以及n個(gè)業(yè)務(wù)部分。
終端第一次加載應(yīng)用程序時(shí),所述終端解壓縮所述壓縮文件,依次釋放所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分;所述終端根據(jù)所述配置文件構(gòu)建bundle目錄,根據(jù)所述bundle目錄存儲(chǔ)所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分;所述終端根據(jù)所述bundle目錄,確定所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分。
具體的,終端先解壓縮zip包,讀取屬性配置文件,根據(jù)屬性配置文件中記錄的屬性數(shù)據(jù),將common.bundle和各個(gè)patch是否到磁盤存儲(chǔ)。commcon.bundle以“base_version.bundle”命名;patch則以“version.patch”命名。patch和commcon.bundle合并得到的bundle文件則以“bundle_version.bundle”命名。假設(shè)bundleid分別為106和112,則構(gòu)建出的bundle目錄可參見圖3。
圖3為本申請應(yīng)用程序加載方法中的bundle目錄的示意圖。請參照圖3,commcon.bundle為“base_7.bundle”,補(bǔ)丁文件(patch)有兩個(gè),分別為“31.patch”、“2.patch”,bundleid有兩個(gè),分別為106和107,該兩個(gè)bundleid的公共部分相同,均為“base_7.bundle”,bundleid為106的bundle文件是對“base_7.bundle”和“31.patch”進(jìn)行合并得到的,如圖中的“106_31bundle”,bundleid為112的bundle文件是對“base_7.bundle”和“2.patch”進(jìn)行合并得到的,如圖中的“112_2bundle”。
另外,根據(jù)圖3可知,根據(jù)該bundle目錄,只要知道待加載bundle文件的bundleid,查詢該bundle目錄,就能過快速查找到bundle文件的路徑,并獲取到待加載的bundle文件。而且,根據(jù)patch名稱以及common.bundle的文件名稱,就能夠快速確定出bundle文件以及common.bundle的版本號(hào)。
圖4為本申請應(yīng)用程序加載方法的一個(gè)舉例示意圖。請參照圖4,包括:
201、終端判斷資源是否已經(jīng)釋放,若是,則執(zhí)行208;若否,則執(zhí)行202;
202、終端判斷是否存在壓縮文件,若是,則執(zhí)行204;若否,則執(zhí)行208。
203、解壓縮壓縮文件。
204、釋放公共部分。
205、讀取屬性配置文件。
206、釋放patch。
207、根據(jù)待加載bundle文件的標(biāo)識(shí),讀取屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分,并合并待加載bundle文件的業(yè)務(wù)部分和公共部分。
208、標(biāo)記資源釋放完畢。
app被開發(fā)出來后,不可避免的需要更新?,F(xiàn)有的采用用插件技術(shù)更新app時(shí),不需要發(fā)布新版本app就能夠?qū)崿F(xiàn)對app的頁面和功能的更新,但是更新后必須重啟app使得插件代碼生效。為避免重啟app,本申請實(shí)施例中,開發(fā)人員通過reactnative(rn)熱更新平臺(tái)對app進(jìn)行更新。下面,對本申請實(shí)施例中如何更新應(yīng)用程序進(jìn)行詳細(xì)說明。
具體的,app的一個(gè)業(yè)務(wù)對應(yīng)多個(gè)bundle文件,對該app進(jìn)行更新,實(shí)質(zhì)上是對該app包含的bundle文件進(jìn)行更新。而一個(gè)bundle文件可以被拆分為公共部分和業(yè)務(wù)部分,因此,對一個(gè)bundle文件的更新,是指對該bundle文件的公共部分進(jìn)行更新、對該bundle文件的業(yè)務(wù)部分進(jìn)行更新,或者對該bundle文件的公共部分和業(yè)務(wù)部分都進(jìn)行更新。下面,對該些情況分別進(jìn)行詳細(xì)說明。
首先,對公共部分進(jìn)行更新。
具體的,對于同一個(gè)業(yè)務(wù)對應(yīng)的n個(gè)bundle文件,該n個(gè)bundle文件的公共部分相同。當(dāng)需要對該公共部分進(jìn)行更新時(shí),服務(wù)器更新所述公共部分,得到更新公共部分;接著,所述服務(wù)器向所述終端發(fā)送所述更新公共部分。相應(yīng)的,終端接收該公共部分,根據(jù)所述更新公共部分更新所述公共部分,即用更新公共部分替換公共部分。然后,終端將n個(gè)業(yè)務(wù)部分中的每個(gè)業(yè)務(wù)部分和更新公共部分合并,得到對應(yīng)一個(gè)業(yè)務(wù)的n個(gè)bundle文件,從而實(shí)現(xiàn)對n個(gè)bundle文件的更新。
其次,對業(yè)務(wù)部分進(jìn)行更新。
具體的,對于同一個(gè)業(yè)務(wù)對應(yīng)的n個(gè)bundle文件,該n個(gè)bundle文件的業(yè)務(wù)部分不相同。該n個(gè)捆綁文件包含第一捆綁文件,所述第一捆綁文件包含所述公共部分和第一業(yè)務(wù)部分,所述n個(gè)業(yè)務(wù)部分包含所述第一業(yè)務(wù)部分。當(dāng)需要對第一捆綁文件的第一業(yè)務(wù)部分進(jìn)行更新時(shí),所述終端將所述n個(gè)業(yè)務(wù)部分中的每個(gè)業(yè)務(wù)部分與所述1個(gè)公共部分合并之后,當(dāng)需要對第一捆綁文件的第一業(yè)務(wù)部分進(jìn)行更新時(shí),服務(wù)器更新所述第一業(yè)務(wù)部分,得到第一更新業(yè)務(wù)部分;接著,所述服務(wù)器向所述終端發(fā)送所述第一更新業(yè)務(wù)部分。相應(yīng)的,終端接收該第一更新業(yè)務(wù)部分,根據(jù)所述第一更新業(yè)務(wù)部分更新所述第一業(yè)務(wù)部分,即用第一更新業(yè)務(wù)部分替換第一業(yè)務(wù)部分。然后,終端將第一業(yè)務(wù)部分和公共部分合并,得到更新后的第一bundle文件,從而實(shí)現(xiàn)對第一bundle文件的更新。
最后,對公共部分和業(yè)務(wù)部分都進(jìn)行更新。
本申請實(shí)施例中,對于app的同一個(gè)業(yè)務(wù),終端第一次該業(yè)務(wù)的bundle文件時(shí),將該業(yè)務(wù)的bundle文件的1個(gè)公共部分和n個(gè)業(yè)務(wù)部分都進(jìn)行下載。后續(xù),當(dāng)需要對公共部分和n個(gè)業(yè)務(wù)部分中的至少一個(gè)業(yè)務(wù)部分進(jìn)行更新時(shí),由于更新后的每個(gè)業(yè)務(wù)部分需要和更新后的公共部分進(jìn)行合并。因此,本申請實(shí)施例中,當(dāng)需要對公共部分和業(yè)務(wù)部分都進(jìn)行更新時(shí),先對公共部分進(jìn)行更新,再對業(yè)務(wù)部分進(jìn)行更新,避免先對業(yè)務(wù)部分進(jìn)行更新、再對公共部分進(jìn)行更新后,需要繼續(xù)對更新后的業(yè)務(wù)部分和更新后的公共部分進(jìn)行合并的弊端。
下面,結(jié)合圖3,對本申請實(shí)施例中如何更新應(yīng)用程序進(jìn)行詳細(xì)說明。具體的,可參見圖5,圖5為本申請應(yīng)用程序加載方法所適用的更新過程示意圖,包括:
301、終端接收大服務(wù)器發(fā)送的bundle更新信息。
302、終端判斷是否需要更新公共部分,若是,則執(zhí)行303;否則,執(zhí)行307。
303、下載公共部分。
304、對公共部分進(jìn)行完整性驗(yàn)證。
305、解壓縮公共部分。
306、用最新下載的公共部分替換舊版本的公共部分。
307、判斷patch是否更新,若是,執(zhí)行308;否則,執(zhí)行301
308、終端判斷是否需要強(qiáng)制更新patch,若是,則執(zhí)行309;否則,執(zhí)行310;
309、提示用戶,之后執(zhí)行310。
例如,彈出指示用戶需要強(qiáng)制更新patch的窗口,強(qiáng)制用戶更新。
310、下載patch。
311、對patch進(jìn)行完整性驗(yàn)證。
312、解壓縮patch。
313、合并最新下載的patch和公共部分。
上述步驟310~313中,假設(shè)bundleid為106的bundle文件包含的patch由31版本更新為32版本。則服務(wù)器向終端指示bundleid為106的bundle文件包含的patch文件的最新版本號(hào)為32,終端將最新的版本號(hào)為32的patch下載并保存到/106/patch/目錄下,以32.patch命名。然后將32.patch和base_7.bundle進(jìn)行合并生成106_32.bundle,用106_32.bundle替換106_31.bundle,使得終端加載bundled為106的bundle文件時(shí),加載106_32.bundle。另外,patch文件夾下面會(huì)保存所有下載的patch版本,以增加容錯(cuò)機(jī)制。例如,當(dāng)106_32.bundle合并成功后,由于研發(fā)人員的粗心,使得32版本的patch文件有問題(bug),導(dǎo)致終端加載106_32.bundle對應(yīng)的bundle文件失敗,此時(shí),拋出異常,將將31.patch和base_7.bundle進(jìn)行合并生成106_31.bundle,使得終端重新加載bundled為106的bundle文件時(shí),加載106_31.bundle。
另外,上述實(shí)施例中,當(dāng)公共部分和業(yè)務(wù)部分都有更新時(shí),為保證公共部分的下載優(yōu)先級(jí)高于業(yè)務(wù)部分,本申請實(shí)施例中,通過rxjava,將公共部分交由行為科目(behaviorsubject)執(zhí)行,將業(yè)務(wù)部的下載合并任務(wù)交由科目(subject)通過concatmap連接,若公共部分有更新,則先執(zhí)行behaviorsubject,否則,behaviorsubject將公共部分的路徑發(fā)送給后面執(zhí)行的觀察模式(observable)。
另外,上述實(shí)施例中,所述服務(wù)器將所述n個(gè)業(yè)務(wù)部分打包成n個(gè)補(bǔ)丁文件;所述服務(wù)器根據(jù)所述1個(gè)公共部分、所述n個(gè)補(bǔ)丁文件和所述屬性配置文件得到所述壓縮文件。
圖6為本申請服務(wù)器的結(jié)構(gòu)示意圖,包括:
處理模塊11,用于將n個(gè)捆綁文件中的每個(gè)捆綁文件拆分為公共部分和業(yè)務(wù)部分,以得到1個(gè)公共部分和n個(gè)業(yè)務(wù)部分,n≥1,且為整數(shù);根據(jù)所述1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到壓縮文件,所述壓縮文件從外到內(nèi)依次為所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分,所述屬性配置文件用于描述1個(gè)公共部分的屬性和n個(gè)業(yè)務(wù)部分中每個(gè)業(yè)務(wù)部分的屬性;
收發(fā)模塊12,用于向終端發(fā)送所述壓縮包。
本申請實(shí)施例提供的服務(wù)器,將對應(yīng)同一個(gè)業(yè)務(wù)的n個(gè)bundle文件中的每個(gè)bundle文件拆分為公共部分和業(yè)務(wù)部分,得到1個(gè)公共部分和n個(gè)業(yè)務(wù)部分,根據(jù)該1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到從外到內(nèi)依次為1個(gè)公共部分、屬性配置文件以及n個(gè)業(yè)務(wù)部分的壓縮文件并發(fā)送給終端,使得終端根據(jù)屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分,進(jìn)而合并待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和1個(gè)公共部分,以加載待加載業(yè)務(wù)。該過程中,終端根據(jù)待加載業(yè)務(wù)對應(yīng)的bundle文件的標(biāo)識(shí)讀取屬性配置文件,快速獲得待加載業(yè)務(wù)對應(yīng)的bundle文件,實(shí)現(xiàn)快速加載bundle文件的目的。
可選的,在本申請一實(shí)施例中,所述n個(gè)捆綁文件包含第一捆綁文件,所述n個(gè)業(yè)務(wù)部分包含所述第一業(yè)務(wù)部分,所述第一捆綁文件包含所述公共部分和第一業(yè)務(wù)部分,所述處理模塊11,在所述收發(fā)模塊12向終端發(fā)送所述壓縮包之后,還用于更新所述第一業(yè)務(wù)部分,得到第一更新業(yè)務(wù)部分;
所述收發(fā)模塊12,還用于向所述終端發(fā)送所述第一更新業(yè)務(wù)部分。
可選的,在本申請一實(shí)施例中,所述處理模塊11,在所述收發(fā)模塊12向終端發(fā)送所述壓縮包之后,還用于更新所述公共部分,得到更新公共部分;
所述收發(fā)模塊12,還用于向所述終端發(fā)送所述更新公共部分。
可選的,在本申請一實(shí)施例中,所述處理模塊11,在根據(jù)所述1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到壓縮文件時(shí),具體用于將所述n個(gè)業(yè)務(wù)部分打包成n個(gè)補(bǔ)丁文件;根據(jù)所述1個(gè)公共部分、所述n個(gè)補(bǔ)丁文件和所述屬性配置文件得到所述壓縮文件。
圖7為本申請終端的結(jié)構(gòu)示意圖,包括:
收發(fā)模塊21,用于接收服務(wù)器發(fā)送的壓縮文件,所述壓縮文件從外到內(nèi)依次為1個(gè)公共部分、屬性配置文件以及n個(gè)業(yè)務(wù)部分,所述屬性配置文件用于描述所述1個(gè)公共部分的屬性和所述n個(gè)業(yè)務(wù)部分中每個(gè)業(yè)務(wù)部分的屬性,所述1個(gè)公共部分和n個(gè)業(yè)務(wù)部分為所述服務(wù)器對n個(gè)捆綁文件中的每個(gè)捆綁文件進(jìn)行拆分得到的;
處理模塊22,用于根據(jù)所述屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分;合并所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和所述1個(gè)公共部分,以加載所述待加載業(yè)務(wù)。
本申請實(shí)施例提供的終端,接收服務(wù)器發(fā)送的壓縮文件,該壓縮文件為服務(wù)器將對應(yīng)同一個(gè)業(yè)務(wù)的n個(gè)bundle文件中的每個(gè)bundle文件拆分為公共部分和業(yè)務(wù)部分,得到1個(gè)公共部分和n個(gè)業(yè)務(wù)部分,根據(jù)該1個(gè)公共部分、n個(gè)業(yè)務(wù)部分和屬性配置文件得到從外到內(nèi)依次為1個(gè)公共部分、屬性配置文件以及n個(gè)業(yè)務(wù)部分的壓縮文件,終端根據(jù)屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分,進(jìn)而合并待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和1個(gè)公共部分,以加載待加載業(yè)務(wù)。該過程中,終端根據(jù)待加載業(yè)務(wù)對應(yīng)的bundle文件的標(biāo)識(shí)讀取屬性配置文件,快速獲得待加載業(yè)務(wù)對應(yīng)的bundle文件,實(shí)現(xiàn)快速加載bundle文件的目的。
可選的,在本申請一實(shí)施例中,所述處理模塊22,在根據(jù)所述屬性配置文件,確定待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分時(shí),具體用于解壓縮所述壓縮文件,依次釋放所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分;根據(jù)所述配置文件構(gòu)建bundle目錄,根據(jù)所述bundle目錄存儲(chǔ)所述1個(gè)公共部分、所述屬性配置文件以及所述n個(gè)業(yè)務(wù)部分;根據(jù)所述bundle目錄,確定所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分。
可選的,在本申請一實(shí)施例中,所述n個(gè)捆綁文件包含第一捆綁文件,所述第一捆綁文件包含所述公共部分和第一業(yè)務(wù)部分,所述n個(gè)業(yè)務(wù)部分包含所述第一業(yè)務(wù)部分,所述收發(fā)模塊21,在所述處理模塊22合并所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和所述1個(gè)公共部分之后,還用于接收所述服務(wù)器發(fā)送的第一更新業(yè)務(wù)部分,所述第一更新業(yè)務(wù)部分為所述服務(wù)器對所述第一業(yè)務(wù)部分進(jìn)行更新得到;
所述處理模塊22,還用于根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分。
可選的,在本申請一實(shí)施例中,所述處理模塊22,在根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分時(shí),具體用于判斷是否需要更新所述公共部分,若需要,則先更新所述公共部分,再根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分;若不需要,則根據(jù)所述第一更新業(yè)務(wù)部分,更新所述第一業(yè)務(wù)部分。
可選的,在本申請一實(shí)施例中,所述收發(fā)模塊21,在所述處理模塊22合并所述待加載業(yè)務(wù)對應(yīng)的業(yè)務(wù)部分和所述1個(gè)公共部分之后,還用于接收所述服務(wù)器發(fā)送的更新公共部分,所述更新公共部分為所述服務(wù)器對所述公共部分進(jìn)行更新得到;
所述處理模塊22,還用于根據(jù)所述更新公共部分更新所述公共部分。
本領(lǐng)域普通技術(shù)人員可以理解:實(shí)現(xiàn)上述各方法實(shí)施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成。前述的程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。該程序在執(zhí)行時(shí),執(zhí)行包括上述各方法實(shí)施例的步驟;而前述的存儲(chǔ)介質(zhì)包括:rom、ram、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。