回覆列表
  • 1 # 使用者4076265832055

    1. 比較簡單的,透過http協議,檢測是否有更新,就是把本地版本號發給伺服器,伺服器會返回一個配置檔案,裡面表明是否有新版本,並且帶有新版本的下載地址,更新程式按照URL下載新版本的安裝程式,然後執行這個安裝程式,使用者根據安裝程式提示進行更新。

    2. 再進化一步,每次都重新安裝太麻煩,更新程式下載一個新版本的壓縮包(zip/7z),然後幫使用者解壓縮到安裝目錄。現在客戶端都追求簡單設計儘量降低和系統的耦合,基本都是複製檔案就算安裝的那種綠色軟體,所以把新版本的檔案一更新就能用。

    3. 如果某個軟體體積已經比較大了,比如大於10MB,每次都下載一個完整的新版本的話,下載就太慢,安裝也慢。既然本地已經有個安裝版本了,每次更新其實變化的東西也不是很多,那麼有個軟體就下載一個更新檔案的壓縮包,然後解壓縮到安裝目錄覆蓋舊檔案。

    4. 有的軟體更大,更新也頻繁,每次更新的exe dll模組大多都有更新,所以還是要下載很大的更新包,於是有人用 bsdiff演算法求新版本和舊版本的二進位制差異,如果新版本就是修了bug改了幾行程式碼,那麼bsdiff生產的補丁也就幾KB,下載的二進位制補丁用bspatch來更新本地版本。bsdiff的演算法庫很小,大約才30+KB很容易整合到更新程式裡。

    5. 有的軟體更更大,即使用bsdiff產生的補丁還是很大,有人搞出了更給力的補丁演算法,Chrome的方法,http://dev.chromium.org/developers/design-documents/software-updates-courgette

    從介紹看,它比bsdiff生成的補丁還要小一個數量級,這個想法相當巧妙,對於那種程式碼模組為主的程式尤其有效。很多時候我們只改了幾行程式碼,但是DLL模組卻改變了很多,主要是因為程式碼最佳化連結時重排造成的,如果比較彙編程式碼差異就會很小,Courgette就把DLL反編譯成彙編碼,然後和舊版本的彙編碼比較得到差異,更新的時候把舊版本也反編譯打補丁然後再編譯成DLL。這樣的話如果只改了幾行程式碼,那麼生成的補丁可能就幾十個位元組。

    6. 隨著更新包越來越大,更新下載和安裝的時間也越來越長,造成使用者長時間等待,有的軟體採用了後臺下載後臺更新的方式。所謂後臺下載就是無論使用者是否點了立刻更新,只要有新版本就在後臺偷偷給使用者下載下來,有點流氓,但這也是為了使用者體驗呢。那麼後臺更新呢,正在執行的程式,每個檔案都是被佔用的,是不能更新的。還是Chrome想出來的,雙目錄更新,把就版本先複製到另一個目錄,然後更新這份新複製的,下次使用者啟動的時候就直接啟動新版本。

    比如 Chrome有如下的目錄結構

    Chrome

    +Application

    +35.0.1916.153

    +35.0.1916.114

    chrome.exe

    它用版本號做目錄名,每次升級的時候更新新版本,舊版本在另一個目錄執行不受影響。下次啟動的時候 Chrome.exe永遠載入最新版本的dll執行就好了。chrome.exe是個很小的程式,裡面的邏輯就是檢測下版本號載入最新版本的dll,這樣簡單的程式本身幾乎不需要更新。

  • 中秋節和大豐收的關聯?
  • 晶片是怎樣損壞的?