本發(fā)明涉及應(yīng)用軟件安裝包處理技術(shù)領(lǐng)域,特別涉及一種應(yīng)用軟件安裝包差分存儲方法及系統(tǒng)。
背景技術(shù):
隨著移動互聯(lián)網(wǎng)的飛速發(fā)展,智能設(shè)備的應(yīng)用軟件開發(fā)廠商研發(fā)出各式各樣的應(yīng)用并不斷推陳出新,以最大限度滿足用戶群體的個性化需求。應(yīng)用軟件開發(fā)廠商在發(fā)布應(yīng)用時,根據(jù)市場投放需求,會打包出帶有不同渠道號的應(yīng)用軟件安裝包,以投放到相應(yīng)的渠道。然而,應(yīng)用軟件開發(fā)廠商所投放出去的同一個批次的應(yīng)用軟件安裝包,雖然二進(jìn)制內(nèi)容是不一致的,但是應(yīng)用軟件安裝包內(nèi)不一致的數(shù)據(jù)僅僅是很少的幾個。
應(yīng)用商店為了支持增量更新,為用戶節(jié)省流量的應(yīng)用更新方式,須保證在服務(wù)端有與用戶端手機(jī)中,完全一致的同一應(yīng)用的安裝包,才能支持增量更新。所以,應(yīng)用商店通常都會通過各種應(yīng)用分發(fā)渠道,抓取大量的應(yīng)用軟件安裝包并存儲,這樣就會導(dǎo)致出現(xiàn)同一款應(yīng)用的同一版本,會存儲幾十上百份的應(yīng)用軟件安裝包。海量的應(yīng)用軟件安裝包存儲空間問題,給承擔(dān)應(yīng)用軟件分發(fā)重任的應(yīng)用商店帶來不小的負(fù)擔(dān)。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明旨在解決相關(guān)技術(shù)中的上述技術(shù)問題,提供一種可以有效節(jié)約存儲空間,且不會額外增加運(yùn)算負(fù)荷的應(yīng)用軟件安裝包差分存儲方法及系統(tǒng)。
一種應(yīng)用軟件安裝包差分存儲方法,包括步驟:
判斷接收并存儲的安裝包文件是否為待壓縮安裝包文件,若是待壓縮安裝包文件,則:
獲取待壓縮安裝包文件依賴的基礎(chǔ)安裝包文件包;
對待壓縮安裝包文件進(jìn)行差分處理,生成差分包,并存儲所述差分包;
更新差分處理后的差分包相應(yīng)的文件名字與存儲地址的新的映射關(guān)系。
進(jìn)一步的,在接收到安裝包文件時,還包括步驟:
接收應(yīng)用軟件元信息和安裝包文件;
申請分配全局唯一的文件名字和存儲空間;
根據(jù)分配的存儲空間存儲安裝包文件;
存儲所述存儲地址,應(yīng)用軟件元信息及其映射關(guān)系;
進(jìn)一步的,還包括步驟:
根據(jù)用戶的讀取請求,判斷讀取的資源文件為安裝包文件還是差分包;
若讀取的資源文件為安裝包文件,讀取安裝包文件并返回給客戶端或者用戶;
若讀取的資源文件是差分包,對差分包進(jìn)行還原處理后,返回還原后的安裝包文件給客戶端或者用戶。
進(jìn)一步的,所述對待壓縮安裝包文件進(jìn)行差分處理,包括步驟:
S1,解析基礎(chǔ)的安裝包文件,生成第一文件集;
S2,解析待壓縮的安裝包文件,生成第二文件集;
S3,對比第一文件集和第二文件集中的記錄,生成差分包文件。
進(jìn)一步的,所述對待壓縮安裝包文件進(jìn)行差分處理的步驟S3,包括步驟:
選取最優(yōu)的共性文件列表;
將指令和數(shù)據(jù)寫入差分包文件。
進(jìn)一步的,所述對差分包進(jìn)行還原處理,包括步驟:
讀取差分包文件;
讀取基礎(chǔ)的安裝包文件;
根據(jù)差分包文件的指令合并生成壓縮前的安裝包文件。
一種應(yīng)用軟件安裝包差分存儲系統(tǒng),包括寫入服務(wù)器,元信息服務(wù)器,數(shù)據(jù)服務(wù)器以及差分處理引擎,其中,
寫入服務(wù)器,用于接收應(yīng)用軟件元信息和安裝包文件,并根據(jù)根據(jù)元信息服務(wù)器分配的存儲空間將安裝包文件存儲在數(shù)據(jù)服務(wù)器中;
元信息服務(wù)器,用于根據(jù)請求的應(yīng)用軟件元信息給對應(yīng)的安裝包文件分配文件名字以及分配存儲空間,還用于存儲所述存儲地址、應(yīng)用軟件元信息及其映射關(guān)系;
差分處理引擎,用于獲取待壓縮安裝包文件依賴的基礎(chǔ)安裝包文件包,以及對待壓縮安裝包文件進(jìn)行差分處理,生成差分包,并將所述差分包存儲數(shù)據(jù)服務(wù)器中,還用于在元信息服務(wù)器中更新差分處理后的差分包相應(yīng)的文件名字與存儲地址的新的映射關(guān)系。
進(jìn)一步的,該應(yīng)用軟件安裝包差分存儲系統(tǒng)還包括讀取服務(wù)器,用于根據(jù)用戶的讀取請求,判斷讀取的資源文件為安裝包文件還是差分包;在讀取的資源文件為安裝包文件時,讀取安裝包文件并返回給客戶端或者用戶;在讀取的資源文件是差分包時,對差分包進(jìn)行還原處理,返回還原后的安裝包文件給客戶端或者用戶;其中,所述還原處理包括:讀取差分包文件;讀取基礎(chǔ)的安裝包文件;根據(jù)差分包文件的指令合并生成壓縮前的安裝包文件。
進(jìn)一步的,差分處理引擎用于對待壓縮安裝包文件進(jìn)行差分處理,包括:解析基礎(chǔ)的安裝包文件,生成第一文件集;解析待壓縮的安裝包文件,生成第二文件集;對比第一文件集和第二文件集中的記錄,生成差分包文件。
進(jìn)一步的,差分處理引擎用于對待壓縮安裝包文件進(jìn)行差分處理,還包括:選取最優(yōu)的共性文件列表;將指令和數(shù)據(jù)寫入差分包文件以生成所述差分包文件。
在本發(fā)明中,采用差分存儲的方案,相比于常規(guī)的全量存儲,在存儲時僅保留差異的資源文件,減少了存儲開銷,并且因?yàn)槲募€原采用順序的合并方式,整個合并過程基本不增加任何運(yùn)算開銷,能基本保持與原來全量存儲時的讀取效率。
附圖說明
圖1是本發(fā)明一實(shí)施方式中的應(yīng)用軟件安裝包差分存儲系統(tǒng)的模塊架構(gòu)示意圖。
圖2是本發(fā)明一實(shí)施方式中的應(yīng)用軟件安裝包的差分處理方法步驟流程圖。
圖3是為本發(fā)明一實(shí)施方式中的應(yīng)用軟件安裝包的還原方法步驟流程圖。
圖4是為本發(fā)明一實(shí)施方式中的應(yīng)用軟件安裝包差分存儲系統(tǒng)的文件寫入方法步驟流程圖。
圖5是為本發(fā)明一實(shí)施方式中的應(yīng)用軟件安裝包差分存儲系統(tǒng)的安裝包差分處理方法的步驟流程圖。
圖6是為本發(fā)明一實(shí)施方式中的應(yīng)用軟件安裝包差分存儲系統(tǒng)的安裝包的讀取方法步驟流程圖。
具體實(shí)施方式
下面結(jié)合附圖1~6,詳細(xì)說明本發(fā)明的具體實(shí)施方式。
在以下實(shí)施例中,僅以常見的應(yīng)用安卓(Android)操作系統(tǒng)的智能設(shè)備上的AndroidPackage(apk)格式的應(yīng)用軟件安裝包(以下簡稱“apk”)為例,來說明本發(fā)明中的應(yīng)用軟件安裝包差分存儲方法與系統(tǒng)。在其他的智能設(shè)備操作系統(tǒng)下的應(yīng)用軟件安裝包差分存儲方法與此類似,不做贅述。
請參考圖1,在本實(shí)施方式中,應(yīng)用軟件安裝包差分存儲系統(tǒng)100包括寫入服務(wù)器(WriteServer)101,元信息服務(wù)器(MetaServer)102,數(shù)據(jù)服務(wù)器(DataServer)103,讀取服務(wù)器(ReadServer)104以及差分處理引擎(DiffEngine)105。
寫入服務(wù)器101用于接收應(yīng)用軟件元信息和apk文件,并將應(yīng)用軟件元信息提交給元信息服務(wù)器102來申請分配全局唯一的文件名字和存儲空間。具體的,寫入服務(wù)器101將接收到應(yīng)用軟件元信息暫存在內(nèi)存中,然后將應(yīng)用軟件元信息提交給元信息服務(wù)器102,并對接收的apk文件的做簽名校驗(yàn)。
元信息服務(wù)器102根據(jù)請求中的應(yīng)用軟件元信息給apk文件分配文件名字以及分配存儲空間。元信息服務(wù)器102還用于存儲該應(yīng)用軟件的元信息。
寫入服務(wù)器101根據(jù)元信息服務(wù)器102分配的文件名字以及存儲空間,將apk文件存入對應(yīng)的數(shù)據(jù)服務(wù)器103。
差分處理引擎105用于讀取元信息服務(wù)器102中存儲應(yīng)用軟件的元信息,判斷該apk文件是否需要做壓縮處理,對需要做壓縮處理的apk文件做差分處理,生成補(bǔ)丁(patch)差分包(以下簡稱“patch差分包”),并將patch差分包存入數(shù)據(jù)服務(wù)器103,刪除原apk文件。差分處理引擎105還將patch差分包在數(shù)據(jù)服務(wù)器103中的存儲地址提交至元信息服務(wù)器102,用于在元信息服務(wù)器102中更新差分處理后的patch差分包相應(yīng)的文件名字與存儲地址的新的映射關(guān)系。
數(shù)據(jù)服務(wù)器103用于存儲apk文件和patch差分包文件。
讀取服務(wù)器104用于響應(yīng)用戶或者客戶端的讀取請求,若請求讀取的資源文件為apk文件,直接從數(shù)據(jù)服務(wù)器103中讀取apk文件并返回給客戶端或者用戶;若請求讀取的資源文件為patch差分包文件,則對patch差分包文件進(jìn)行還原后,返回還原后的apk文件給客戶端或者用戶。
請一并結(jié)合圖2,為本發(fā)明一實(shí)施方式中的應(yīng)用軟件安裝包差分處理方法步驟流程圖,根據(jù)具體的情況,該流程圖步驟的順序可以改變,某些步驟可以省略。以同一應(yīng)用軟件的不同版本的apk文件:apk1,apk2為例,apk1為基礎(chǔ)apk文件,apk2為待壓縮處理的apk文件。其中,基礎(chǔ)的apk文件,為待壓縮apk文件計算差分包所依賴的基礎(chǔ)包文件。該差分處理方法包括:
步驟S10,解析基礎(chǔ)的apk文件apk1,生成第一文件集files1。具體的,apk文件是zip文件格式,zip文件由三個部分組成,分別是壓縮源文件數(shù)據(jù)區(qū)、壓縮文件目錄區(qū)、壓縮源文件目錄結(jié)束標(biāo)志,其中壓縮源文件數(shù)據(jù)區(qū)和壓縮源文件目錄區(qū)分別存儲的是apk文件的文件內(nèi)容和目錄。在本實(shí)施方式中,對apk1文件進(jìn)行解析,按順序提取其中各文件內(nèi)容和目錄,并記錄相應(yīng)數(shù)據(jù)在apk1文件中的偏移量(offset)、文件大小(size)、文件名或目錄名(path)、數(shù)據(jù)的簽名(sign)、數(shù)據(jù)類型(type)。將apk1包文件解析后,生成的第一文件集files1如下:
files1[0]={offset:0,size:100,path:path001,sign:sign001,type:0}
files1[1]={offset:100,size:200,path:path002,sign:sign002,type:0}
files1[2]={offset:300,size:300,path:path003,sign:sign003,type:0}
files1[3]={offset:600,size:200,path:path004,sign:sign004,type:0}
files1[4]={offset:800,size:100,path:path005,sign:sign005,type:0}
files1[5]={offset:900,size:300,path:path006,sign:sign006,type:0}
files1[6]={offset:1200,size:400,path:path007,sign:sign007,type:0}
files1[7]={offset:1600,size:500,path:path008,sign:sign008,type:0}
files1[8]={offset:2100,size:900,path:path009,sign:sign009,type:0}
步驟S20,解析待壓縮的apk文件apk2,生成第二文件集files2。對apk2的解析方法與步驟S1中對apk1的解析方法相同,僅僅是針對處理的數(shù)據(jù)源不同而已,在此不再贅述。將apk2包文件解析后生成的第二文件集files2如下:
files2[0]={offset:0,size:100,path:path001,sign:sign001,type:0}
files2[1]={offset:100,size:300,path:path010,sign:sign010,type:0}
files2[2]={offset:400,size:300,path:path003,sign:sign003,type:0}
files2[3]={offset:700,size:500,path:path008,sign:sign008,type:0}
files2[4]={offset:1200,size:900,path:path009,sign:sign009,type:0}
步驟S30,對比files1和files2中的記錄,生成patch差分包文件。
在本實(shí)施方式中,步驟S3包括:
子步驟S301,選取最優(yōu)的共性文件列表。具體的,可以是選取出的文件列表所包含的文件內(nèi)容的總長度是最大的,以最大限度的減少寫入差分包文件patch的大小,在本實(shí)施方式中,所選出的最優(yōu)共性文件列表如下:
sames[‘0’]={base_offset:0,size:100}
sames[‘2’]={base_offset:300,size:300}
sames[‘3’]={base_offset:1600,size:500}
sames[‘4’]={base_offset:2100,size:900}
子步驟S302,將指令和數(shù)據(jù)寫入patch差分包文件。對在共性文件列表中的數(shù)據(jù)寫入指令,指示從apk1的某位置offset開始復(fù)制長度size的數(shù)據(jù),不在共性文件列表中的數(shù)據(jù),寫入一條帶數(shù)據(jù)的指令,并apk2中的數(shù)據(jù)拷貝至指令之后。具體的,流程如下:
for i=0 to m=files2集合大??;
if i exists in sames共性文件集合;then
將數(shù)據(jù)在files1中的offset和size,以指令的方式寫入patch;
else
首先向patch寫入一條指令,表明接下來從patch中拷貝指定長度的數(shù)據(jù);
其次從apk2中的files2[i][‘offset’]位置開始拷貝files2[i][‘size’]大小的數(shù)據(jù)至patch文件中;
fi
輸出到patch文件中指令和數(shù)據(jù)如下:
patch[0]={command_type:0,offset:0,size:100}
patch[1]={command_type:1,size:300,data:300字節(jié)數(shù)據(jù)}
patch[2]={command_type:0,offset:300,size:300}
patch[3]={command_type:0,offset:1600,size:500}
patch[4]={command_type:0,offset:2100,size:900}
請一并結(jié)合圖3,為本發(fā)明一實(shí)施方式中的應(yīng)用軟件安裝包還原方法步驟流程圖,根據(jù)具體的情況,該流程圖步驟的順序可以改變,某些步驟可以省略。以同一應(yīng)用軟件的不同版本的apk文件:apk1,apk2為例,apk1為基礎(chǔ)apk文件,patch差分包為apk2差分壓縮處理后的文件。其中,基礎(chǔ)的apk文件,為待壓縮apk文件計算差分包所依賴的基礎(chǔ)包文件。該應(yīng)用軟件安裝包還原方法包括:
步驟S11,讀取patch差分包文件。
步驟S21,讀取基礎(chǔ)的apk文件apk1。
步驟S31,根據(jù)patch差分包文件的指令合并生成壓縮前的apk文件apk2。具體的文件還原流程如下:
for i=0 to m=patch集合大?。?/p>
if patch[i][‘command_type’]==0;then
從apk1文件的位置patch[i][‘offset’]讀取大小patch[i][‘size’]的數(shù)據(jù);
else
從patch當(dāng)前位置開始讀取大小patch[i][‘size’]的數(shù)據(jù);
fi
請一并參考圖4,為本發(fā)明一實(shí)施方式中的應(yīng)用軟件安裝包差分存儲系統(tǒng)中的文件寫入方法的步驟流程圖,根據(jù)具體的情況,該流程圖步驟的順序可以改變,某些步驟可以省略。該應(yīng)用軟件安裝包差分存儲系統(tǒng)的文件寫入方法步驟流程包括:
步驟S12,接收應(yīng)用軟件元信息和apk文件。具體的,寫入服務(wù)器101接收應(yīng)用軟件元信息和apk文件,寫入服務(wù)器101將接收到應(yīng)用軟件元信息暫存在內(nèi)存中,然后將應(yīng)用軟件元信息提交給元信息服務(wù)器102,并對接收的apk文件的做簽名校驗(yàn)。
步驟S22,申請分配全局唯一的文件名字和存儲空間。具體的,將應(yīng)用軟件元信息提交給元信息服務(wù)器102,申請分配全局唯一的文件名字和存儲空間。
步驟S32,根據(jù)分配的存儲空間存儲安裝包文件。具體的,寫入服務(wù)器101根據(jù)元信息服務(wù)器102分配的文件名字以及存儲空間將apk文件存入該分配的數(shù)據(jù)服務(wù)器103,數(shù)據(jù)服務(wù)器103將存儲地址返回至元信息服務(wù)器102。
步驟S42,存儲所述存儲地址,應(yīng)用軟件元信息及其映射關(guān)系。其中,應(yīng)用元信息包括:應(yīng)用名稱、包名稱、開發(fā)者簽名、版本號、版本名稱等。元信息服務(wù)器102存儲數(shù)據(jù)服務(wù)器103所返回的存儲地址,寫入服務(wù)器101所提交的應(yīng)用軟件元信息及其映射關(guān)系。
步驟S52,反饋所述分配的文件名字。
請一并參考圖5,為本發(fā)明一實(shí)施方式中的應(yīng)用軟件安裝包差分存儲系統(tǒng)中的安裝包差分處理方法的步驟流程圖,根據(jù)具體的情況,該流程圖步驟的順序可以改變,某些步驟可以省略。以同一應(yīng)用軟件的不同版本的apk文件:apk1,apk2為例,apk1為基礎(chǔ)apk文件,apk2為待壓縮處理的apk文件,patch差分包為apk2差分壓縮處理后的文件。該應(yīng)用軟件安裝包差分存儲系統(tǒng)的文件寫入方法步驟流程包括:
步驟S13,判斷寫入的apk文件是否為待壓縮apk文件,若否,結(jié)束;若是,則進(jìn)入步驟S23。具體的,在圖4中應(yīng)用軟件安裝包差分存儲系統(tǒng)中的文件寫入流程執(zhí)行完成后,apk文件被全量存入數(shù)據(jù)服務(wù)器103中,若數(shù)據(jù)服務(wù)器103存儲有與該apk文件對應(yīng)的應(yīng)用軟件版本號相同的其他apk文件,或者預(yù)定時間段內(nèi)有其他版本的該應(yīng)用軟件apk文件存入,則判斷該apk文件為待壓縮apk文件包;若數(shù)據(jù)服務(wù)器103沒有存儲與該apk文件對應(yīng)的應(yīng)用軟件版本號相同的其他apk文件,或者預(yù)定時間段內(nèi)沒有其他版本的該應(yīng)用軟件apk文件存入,則判斷該apk文件新的apk文件包??紤]預(yù)定時間段內(nèi)有其他版本的該應(yīng)用軟件apk文件存入的原因,主要是因?yàn)橄嗖顣r間太久發(fā)布的版本之間的相同文件大大減少,該預(yù)定時間段,可以是查看近一個月,三個月或者半年內(nèi)同款應(yīng)用是否有應(yīng)用存入。
步驟S23,獲取待壓縮apk文件依賴的基礎(chǔ)apk文件。所述基礎(chǔ)apk文件為該待壓縮apk文件對應(yīng)的相同的版本號的其他apk文件,或者預(yù)定時間段內(nèi)有其他版本的該應(yīng)用軟件apk文件。
步驟S33,對待壓縮apk文件進(jìn)行差分處理,生成patch差分包,并存儲所述patch差分包。具體的,差分處理引擎105對需要做壓縮處理的apk文件做差分處理,該差分處理步驟與圖2中的apk差分處理方法相同,在此不再贅述。差分處理引擎105對需要做壓縮處理的apk文件做差分處理生成補(bǔ)丁patch差分包后,將patch差分包存入數(shù)據(jù)服務(wù)器103,差分處理引擎105還將patch差分包存入數(shù)據(jù)服務(wù)器103的存儲地址提交至元信息服務(wù)器102。
步驟S43,更新差分處理后的patch差分包相應(yīng)的文件名字與存儲地址的新的映射關(guān)系。差分處理引擎105將patch差分包存入數(shù)據(jù)服務(wù)器103的存儲地址提交至元信息服務(wù)器102,用于在元信息服務(wù)器102中更新差分處理后的patch差分包相應(yīng)的文件名字與存儲地址的新的映射關(guān)系,同時刪除原apk文件,釋放原來全量存儲所占用的空間。
請一并參考圖6,在本實(shí)施方式中,應(yīng)用軟件安裝包差分存儲系統(tǒng)還包括安裝包的讀取方法,圖6為本發(fā)明一實(shí)施方式中的安裝包讀取方法包括步驟流程圖,根據(jù)具體的情況,該流程圖步驟的順序可以改變,某些步驟可以省略。以同一應(yīng)用軟件的不同版本的apk文件:apk1,apk2為例,apk1為基礎(chǔ)apk文件,apk2為待壓縮處理的apk文件,patch差分包為apk2差分壓縮處理后的文件。該應(yīng)用軟件安裝包差分存儲系統(tǒng)的安裝包讀取方法步驟流程包括:
步驟S14,根據(jù)用戶的讀取請求,判斷讀取的資源文件為apk文件還是patch差分包文件。
步驟S24,若讀取的資源文件為apk文件,讀取apk文件并返回給客戶端或者用戶。
步驟S34,若讀取的資源文件是patch差分包文件,對patch差分包文件進(jìn)行還原后,返回還原后的apk文件給客戶端或者用戶。具體的,讀取服務(wù)器104對patch差分包文件進(jìn)行還原處理,還原處理步驟與圖3中的apk還原方法相同,在此不再贅述。
在本發(fā)明的上述實(shí)施方式中,利用同一款應(yīng)用軟件之間的共性部分比較大,應(yīng)用廠商在發(fā)布的同一批次帶有不同渠道號的apk文件雖然二進(jìn)制內(nèi)容是不一致的,但是apk文件內(nèi)不一致的數(shù)據(jù)僅僅是很少的幾個,采用差分存儲的方案,存儲多份apk文件相比存儲一份apk所增加的存儲空間基本可以忽略不計。因此,相比于常規(guī)的全量存儲,采用差分存儲的方案,在存儲時僅保留差異的資源文件,減少了存儲開銷,并且因?yàn)槲募€原采用順序的合并方式,整個合并過程基本不增加任何運(yùn)算開銷,能基本保持與原來全量存儲時的讀取效率。
本技術(shù)領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)認(rèn)識到,以上的實(shí)施方式僅是用來說明本發(fā)明,而并非用作為對本發(fā)明的限定,只要在本發(fā)明的實(shí)質(zhì)精神范圍之內(nèi),對以上實(shí)施例所作的適當(dāng)改變和變化都落在本發(fā)明要求保護(hù)的范圍之內(nèi)。