軟體的增量更新

2022-01-29 14:49:37 字數 3121 閱讀 7422

因為轉戰c#了,之前很多東西都丟了。現在從頭開始弄基礎服務,首先第乙個就是客戶端的自動更新。之前簡單搜了一下相關功能的實現。有乙個文章我沒有看懂,另一片文章裡邊說的應該是提交本地資料,然後計算差異化包,讓伺服器返回差異化資料報。當然這樣不是不行。肯定是可行的,但是對於伺服器來說這部分工作可能就有點麻煩了。因為你得讓伺服器有這個計算能力。參考cocos2dx 3.9的lua增量更新模組,簡單做了乙個基礎框架模型出來。

- 渣子問題 這種覆蓋安裝一般會存在乙個渣子的問題。比如說,我在安裝目錄裡邊生成了乙個不在後續安裝包的檔案,那麼這個檔案就沒有辦法被清理掉。這就可能很尷尬了,比如說你的專案依賴系統提供的乙個dll,如果你的目錄中直接存在這個dll那麼就會優先使用你對應目錄中的dll(如果我沒記錯應該是這樣),如果是我作為攻擊者的話,我很有可能會給你放乙個我種下病毒的dll。這就很尷尬了

這個原理也比較簡單,其實就是我們都覺得完全安裝太費勁了,那麼我的軟體又需要比較頻繁的更新,比如說某些桌遊可能過個節日要上節日相關的功能,這樣就可以新增新的dll然後又不能出乙個乙個的完整安裝包。那麼我可以在完整安裝包的基礎上打補丁嘛。比如說,我出了版本1.0,過了十天半個月過端午了,我出個龍舟**一類的,那我就可以直接在1.0的基礎上打個龍舟補丁,這樣他就變成了最新的客戶端1.1。如果將來要上別的功能了我就在1.1的基礎上打個補丁,讓客戶端變成1.2。不過這樣也會有他的問題。

- 順序安裝 在安裝的過程中只能以此遞增式安裝,我只能1.0 => 1.1 => 1.2;不能1.0 =》 1.2。因為中間是沒有對應的補丁的。

- 流量問題 其實這種解決方案可能會帶來一些問題,比如說,現在端午節,我需要把房子裝飾成龍舟的樣式;然後五一勞動節,我又需要把房子裝修成五一勞動節的樣子。那麼都是關於房子的**,我是沒有辦法都保留的,因為來年的時候肯定就不能這麼裝修了,因為過時了太low了。那麼關於這部分的內容,如果你想一點一點的公升級上來對於最後的版本來說是沒用的,你占用的流量一點用都沒有。太尷尬了。

其實這個完全是針對於程式設計師的了,一般來說,如果這個事情可以程式來自動完成那麼就肯定交給程式了。比如說完整晚裝包的這種,肯定能夠做到自動打包。打補丁的這種,無非也就是根據上乙個版本生成乙個補丁。或者再生成乙個完整安裝包。上傳到合適的檔案伺服器就好了。其實打補丁也好,完整安裝包也好,都有乙個顯著的優勢就是可以很方便的放到多個伺服器上來進行檔案的負載均衡。

在考慮這個問題的時候,我想到了之前接觸的cocos2dx 3.9 lua 自動更新模組,他是這麼做,通過乙個配置檔案,來說明最新的客戶端中都包含了那些檔案,這些檔案的md5值是什麼,然後網路路徑是什麼。這樣客戶端拿到這個配置清單的時候,就可以輕鬆的判斷本地的那些檔案是可以繼續用的。那些檔案是過時了的,這樣客戶端通過配置心中的網路路徑位置獲取最新的對應檔案就好了嘛。不過那也是很久之前的事情了,不然,我就不需要自己重新規劃了。直接抄乙份**就好了嘛。還是自己整理一套吧。這樣來的更徹底一些,想改什麼就改什麼。

,,]

}

簡單的說明

timestamp:做這個檔案的的時間戳

fileinfos:對應的檔案資訊列表

fileinfos[?]:filemd5:這個檔案的md5值,用來判斷原始的對應位置的檔案是否與網路中的檔案相同

fileinfos[?]:fileurl:這個檔案在網路中存在的位置,當然這個是沒有前邊的url路徑的是serverurl後邊的內容

其實嘛整個專案最複雜的地方時這個更新的想法與這個檔案的制定。剩下的內容其實就比較簡單了,就是具體的**的實現了。**方便我就懶得講了,直接把專案的位址扔上來了事。

客戶端服務端

省流量、跟其他軟體結合方便、伺服器發布方便。省流量這個上邊提到了我就說了。

跟其他軟體結合方便

其實很容易理解,就是這個軟體跟被更新的軟體一毛錢關係沒有。所以我可以直接跑起來就行了,不需要關係具體被更新的軟體是怎麼搞得。最多採用這個的專案。重新改一下我們這邊的ui就行了。

伺服器發布方便

其實最麻煩的事情就是伺服器這邊。需要生成這個配置檔案,我這邊伺服器端其實並沒有在執行指的就是生成這個檔案的工具。我可以指定乙個目錄。然後生成這個檔案,將對應目錄的所有檔案匯出到乙個輸出目錄。不過對於很多cdn不支援多級目錄(比如七牛),所以我將所有的檔案都換掉了名字,讓他們盡量的不重複,程式可讀就行了。

首先使用我寫好的服務端生成對應的配置檔案和改名檔案。

生成的目錄結構是這樣色的,配置檔案放到乙個固定的目錄裡邊去。upload資料夾上傳到某乙個檔案伺服器上,這裡我是用的七牛雲

然後把upload目錄中的檔案全都上傳上來

上傳完了就是這個樣子的。

致辭伺服器就部署好了,等有了新版本重複一遍這個操作就行。其實上傳伺服器的這部分工作可以整合到服務端中。上傳內容就好了嘛,其實很簡單的。當然了,這個我懶。之前也沒有研究七牛的sdk這個可以作為乙個功能上的擴充套件,反正專案我已經開源了,感興趣的人可以自己擴充套件這部分功能。好吧我們繼續來說客戶端怎麼弄吧。

怎麼用客戶端呢

autoupdatehelper helper = new autoupdatehelper();

helper.webxmlurl = "";

helper.configxmlpath = "synchronizeversions.xml";

helper.tempxmlpath = "synchronizeversions_temp.xml";

helper.filepath = "client";

helper.callback = obj =>}};

trycatch (exception ex)

其實就是乙個簡單的設定**跟配置檔案。其實呢這個地方應該吧配置也放到配置檔案裡邊去,為什麼沒放呢?因為我懶,哈哈哈。

客戶端的執行圖

客戶端跑完了就關了,其實應該是跑完了執行某乙個具體的檔案,然後自動更新的邏輯就完成了,這部分我會之後繼續完善。

其實到目前為止我只是實現了最基礎的功能。甚至還不全,比如之後的檔案啟動,不過大體的框架已經搭建起來了。至於後邊有很多實現不是很合理的地方,我先簡單列一列,方便之後維護。

完成了之後沒有啟動對應的檔案

現在沒有快速啟動的功能(現在每次啟動都需要重新校驗所有檔案,其實可以避免這個問題的。)

雖然這個專案只是乙個並不完善的框架。但是這種更新方式應該會讓更新變得更有意思。讓我們一塊來完善這個框架吧。比較希望做乙個成功的開源專案,不忘初心。

kettle 增量更新

後面的乙個問號就是表示它需要接受乙個引數,你在這個table input 下面需要指定replace variable in script 選項和execute for each row 為選中狀態,這樣,kettle就會迴圈執行這個sql 執行的次數為前面引數步驟傳入的資料集的大小。kettle執...

hive增量更新

很多資料需要進行更新,如使用者資訊修改。hive0.11之後開始支援update和delete。但是hive頻繁更新與hive的設計原則相反,並且hive增量更新很緩慢。為實現增量更新,我們可以採用union all進行關聯或在乙個分割槽表中求最新的日期的資料。select b.id,b.conte...

Android 增量更新

現在國內的主流應用市場都支援應用的增量更新.增量更新的原理 就是將手機上已安裝apk 與伺服器最新的apk進行二進位制對比,得到差分包,使用者在更新程式時,只需要已安裝,合成新版apk.apk 檔案差分,合成,可以通過開源二進位制比較工具bsdiff 來實現,又因為bsdiff 依賴bzip2,所以...