程序升級(jí)最快方法?
1. 比較簡單的,通過http協(xié)議,檢測(cè)是否有更新,就是把本地版本號(hào)發(fā)給服務(wù)器,服務(wù)器會(huì)返回一個(gè)配置文件,里面表明是否有新版本,并且?guī)в行掳姹镜南螺d地址,更新程序按照URL下載新版本的安裝程序,然后執(zhí)行這個(gè)安裝程序,用戶根據(jù)安裝程序提示進(jìn)行更新。
2. 再進(jìn)化一步,每次都重新安裝太麻煩,更新程序下載一個(gè)新版本的壓縮包(zip/7z),然后幫用戶解壓縮到安裝目錄。現(xiàn)在客戶端都追求簡單設(shè)計(jì)盡量降低和系統(tǒng)的耦合,基本都是復(fù)制文件就算安裝的那種綠色軟件,所以把新版本的文件一更新就能用。
3. 如果某個(gè)軟件體積已經(jīng)比較大了,比如大于10MB,每次都下載一個(gè)完整的新版本的話,下載就太慢,安裝也慢。既然本地已經(jīng)有個(gè)安裝版本了,每次更新其實(shí)變化的東西也不是很多,那么有個(gè)軟件就下載一個(gè)更新文件的壓縮包,然后解壓縮到安裝目錄覆蓋舊文件。
4. 有的軟件更大,更新也頻繁,每次更新的exe DLL模塊大多都有更新,所以還是要下載很大的更新包,于是有人用 bsdiff算法求新版本和舊版本的二進(jìn)制差異,如果新版本就是修了bug改了幾行代碼,那么bsdiff生產(chǎn)的補(bǔ)丁也就幾KB,下載的二進(jìn)制補(bǔ)丁用bspatch來更新本地版本。bsdiff的算法庫很小,大約才30+KB很容易集成到更新程序里。
5. 有的軟件更更大,即使用bsdiff產(chǎn)生的補(bǔ)丁還是很大,有人搞出了更給力的補(bǔ)丁算法,chrome的方法,http://dev.chromium.org/developers/design-documents/software-updates-courgette
從介紹看,它比bsdiff生成的補(bǔ)丁還要小一個(gè)數(shù)量級(jí),這個(gè)想法相當(dāng)巧妙,對(duì)于那種代碼模塊為主的程序尤其有效。很多時(shí)候我們只改了幾行代碼,但是dll模塊卻改變了很多,主要是因?yàn)榇a優(yōu)化鏈接時(shí)重排造成的,如果比較匯編代碼差異就會(huì)很小,Courgette就把DLL反編譯成匯編碼,然后和舊版本的匯編碼比較得到差異,更新的時(shí)候把舊版本也反編譯打補(bǔ)丁然后再編譯成DLL。這樣的話如果只改了幾行代碼,那么生成的補(bǔ)丁可能就幾十個(gè)字節(jié)。
6. 隨著更新包越來越大,更新下載和安裝的時(shí)間也越來越長,造成用戶長時(shí)間等待,有的軟件采用了后臺(tái)下載后臺(tái)更新的方式。所謂后臺(tái)下載就是無論用戶是否點(diǎn)了立刻更新,只要有新版本就在后臺(tái)偷偷給用戶下載下來,有點(diǎn)流氓,但這也是為了用戶體驗(yàn)?zāi)亍D敲春笈_(tái)更新呢,正在運(yùn)行的程序,每個(gè)文件都是被占用的,是不能更新的。還是Chrome想出來的,雙目錄更新,把就版本先復(fù)制到另一個(gè)目錄,然后更新這份新復(fù)制的,下次用戶啟動(dòng)的時(shí)候就直接啟動(dòng)新版本。
比如 Chrome有如下的目錄結(jié)構(gòu)
Chrome
+Application
+35.0.1916.153
+35.0.1916.114
chrome.exe
它用版本號(hào)做目錄名,每次升級(jí)的時(shí)候更新新版本,舊版本在另一個(gè)目錄運(yùn)行不受影響。下次啟動(dòng)的時(shí)候 Chrome.exe永遠(yuǎn)加載最新版本的dll運(yùn)行就好了。chrome.exe是個(gè)很小的程序,里面的邏輯就是檢測(cè)下版本號(hào)加載最新版本的dll,這樣簡單的程序本身幾乎不需要更新。