標籤:

軟體的升級、更新是個怎樣的過程?

比如我打開某個軟體,點擊幫助里的檢查更新,然後檢測到新版本,然後點擊更新,此軟體更新在後台做了些什麼,具體流程是?每個軟體個都是一樣的流程嗎?軟體更新和直接下載安裝最新版軟體有區別嗎?更新和安裝最新版哪個更好?


感謝 @胡 錦 濤邀請,這個不敢不答啊,說不定已經有數十個快遞員在我家門外蓄勢待發呢。

在互聯網不太普及的時代,很多軟體公司還是會發布離線更新包,這種更新包其實就是個安裝程序,只是安裝的內容是更新的部分,沒有變化的文件直接用已經安裝的版本的。此外這些安裝程序還會修改一些系統配置以適應新版本的功能,比如註冊COM組件,修改註冊表等。

現在互聯網已經十分普及,幾乎所有軟體都採用在線升級,具體實現上,有下列幾種做法。

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,這樣簡單的程序本身幾乎不需要更新。

在需求的推動下,現代客戶端的升級程序已經相當複雜了,包括了支持灰度放量的新版本檢測,http斷點續傳下載,MD5完整性校驗,bsdiff/courgette 二進位補丁更新,雙目錄迭代升級等技術。到了移動app時代,以上這些技術都用不到了,操作系統壟斷了升級機制,只能通過操作系統檢測下載安裝更新,iOS做得相當徹底,Android還給app留了條自己下載apk安裝的路,但是二進位補丁完整性校驗等就徹底不需要app開發者自己操心了。


一早出門看到門口站了兩排抄水表的,才知道粗大事啦

用戶對軟體的更新/升級/降級的操作是:停止和卸載舊的軟體包,下載新的軟體包,安裝新的軟體包。

軟體自己的更新過程也差不多是這樣的,只是它由程序自動完成,不需要用戶去操作,給出了更好的用戶體驗

而且,軟體包本身的更新程序可以對自己的特點進行訂製,比如差異化更新、數據文件升級等,這些@姚冬 說得很專業啦


提供一個增量更新例子,大概的流程如下:

1、獲得本地版本local

2、下載伺服器版本信息remote

3、比較版本

while local& 下載local版本更新信息

顯示更新信息

下載更新包

解壓更新包

刪除本地更新包

local=local+1

end

代碼:

包括更新界面,代碼才260行效果如下:


compare 生成 diff

生成 index 告訴客戶端需要的更新

本地merge

當然也可以直接安裝完整包,或者替換組件


現在好多軟體基本上採用"增量更新"的方式,就是更新包裡面只含有軟體變更的部分。能夠很大程度節約流量和時間。


ios請問一下bsdiff怎麼用?


很多人心目中,最新的就是最好的,一旦有了軟體更新,馬上迫不及待的升級,有些手機APP的升級到了瘋狂的地步,幾乎每天都要更新,不僅僅是軟體,為了體驗和使用科技公司研發的新功能而不得不花錢升級配件,甚至於升級電腦,真是一件值得的交易嗎?

我不是抗拒新技術,只是要提醒自己、認真思考電腦和手機的真正用途是什麼,它們作為人類改造世界的一種工具,假如一味地去嘗鮮,去體驗,去升級,卻忽視了最適合自己東西,這是得不償失的。

在盲目以及不假思索的升級以前,我們不妨考慮如下兩點:

一、軟體的新版本中,究竟有哪些改動和新功能是你必須的,或者是打動你的?

假如更新的軟體中沒有特別打動你的功能,沒有大幅度地優化和增強軟體功能,也沒有修復你所認為的軟體bug,就沒有升級的必要,因為軟體的升級是以犧牲內存和硬碟的大小為代價的。

二、升級之後的軟體真的就更完善嗎?

我就碰到過類似的問題,由於平時使用的e人e本(T4)中android版本較低,升級最新的微信之後就無法打開,每次打開就閃退,最後只好又回到原來的版本。

如今數碼產品是技術迭出、層出不窮,每年備受矚目的蘋果、三星、小米、微軟等科技公司的產品發布會都使人會有換新品的衝動,但是也要考慮自己的預算和實際需要,最新的不一定就是最適合的。一台蘋果公司的Macpro陪伴我好幾年,最早是在這台筆記本上使用finalcut剪輯片子的,那還是在沒有升級系統以前,MacOS
X 10.6運行流暢,一點也不卡頓。

當然我很清楚硬體升級以後要付出的代價,可還是沒有忍受得了誘惑,為此我付出的代價就是電腦運行越來越慢,經常考驗著我的耐性,有時候甚至想把機器甩出窗外,而且電腦發熱嚴重,每當在論壇上看到別人炫耀如何給筆記本升級內存或者更換固態硬碟我就覺得好笑,幹嗎沒事要給電腦升級呢?事實上自己也是一樣,也會步別人的後塵。後來很長時間都在糾結是否要給Macpro升級8G或者16G的內存,這實在是一件可笑的事情,當然升級到MacOS
X
10.10之後確實體驗到了一些蘋果公司開發的新功能,不過同時也喪失了一些原本實用的功能,比如黑莓的桌面管理軟體就無法同步手機,而我恰恰是忠實的黑莓粉絲,假如要體驗到蘋果所說的mac與iphone整合的功能,就必須升級iPhone的系統軟體到iOS8.0,而最新的系統對硬體是有要求的,這就意味著你必須同時升級硬體,要不然蘋果公司靠什麼來賺錢呢!

有時候廠商不斷地更新軟體,就是為了給用戶造成他們在不斷創新的印象,不失為一種商業策略。用戶畢竟不是專業工程與設計人員,只需給他們一些所謂的參數他們就滿足了,比如雙核、四核、八核,似乎參數越高代表產品越好,事實上影響手機和電腦性能的幾個硬體因素為CPU、內存和硬碟容量,這些共同決定了性能,除此以外還有軟體,涉及到用戶體驗以及軟體的優化等問題,蘋果公司就是將硬體與軟體完美結合併發揮各自最大性能的典範,即使iphone的硬體配置比同類產品低得多,可是流暢度和用戶體驗卻比後者要好太多了。

面對越來越多的軟體與硬體升級,時間只會一再告訴我們那個以前就明白現在又不怎麼明白的道理:任何事情都是有利有弊!

歡迎關注微信公眾號:tubenfilm

http://weixin.qq.com/r/9Dvu9rLEdu8JrfaV927m (二維碼自動識別)


推薦閱讀:

如何評價 MATLAB 的新版本 R2016a?
如何將物理實驗數據導入MATLAB並將數據用圖形(如曲線圖)展現出來?
有哪些國產軟體一點也不流氓?
有什麼軟體可以錄製電腦正在播放的聲音嗎?
有什麼好用的文件管理器?求推薦!

TAG:軟體 |