為什麼應用程式不透過計算差異來更新?

為什麼應用程式不透過計算差異來更新?

我有 Ubuntu 電腦和 Android 手機,但我一直很困惑為什麼 Ubuntu 和手機上 Google Play 上的預設更新管理器不會透過計算現有版本的應用程式與新版本之間的差異來更新它們。我確信其他作業系統也是如此(這就是為什麼這個問題不在 Ask Ubuntu 或 Android 愛好者中)

例如,考慮最新的更新(次要版本)Google地圖(截至 2012 年 4 月 18 日)。 「新增內容」部分錶示它包括一個關鍵的錯誤修復。可以安全地假設大量程式碼沒有被修改,但是,當您更新應用程式時,它會下載超過 6 MB 的大小,就像全新安裝一樣。

為什麼更新伺服器不能計算已安裝版本的差異(la git)並僅發送差異?對所有版本都做到這一點真的那麼難嗎?節省的頻寬不是主要動機嗎?

編輯 2016 年 12 月 6 日:Google 剛剛宣布他們將使用逐文件修補方式進行 Android APK 更新 -節省資料:將應用程式更新的大小減少 65%

答案1

您可以透過僅傳輸差異來優化下載大小,分為三個等級。

封裝級別僅傳輸更新的包。這已經完成了。如果您查看軟體包的下載大小,您會發現大多數軟體包都非常小。因此,這可以保證最大的頻寬。

包內的文件僅傳輸包內已更改的檔案。套件管理不僅僅是將檔案複製到固定位置。有些設定檔可能已自動適應您的系統。可能會有手動更改。如果不先上傳已安裝的文件,就很難可靠地找出差異。

內部文件差異大多數文件(尤其是大文件)都是二進制的。如果要修補的檔案有很小的變化(例如不同的建置時間戳記),則很難想像二進位檔案的可靠修補演算法。另一方面,對於文字文件,git 應用的舊的 diff 和 patch 演算法可能會很好地工作,但可能不值得付出努力。

另一個問題是您不知道將更新哪個舊版本。使用者可能跳過了中間更新。當然,套件管理器可以請求伺服器發送特定版本的差異,但這會為伺服器帶來巨大的負載來產生差異。我懷疑伺服器維護人員會允許這樣做。

概括: 可以輕鬆可靠地完成的事情已經完成了。剩下的就由套件管理器來製作小套件以保持更新較小。

答案2

主要是,這對開發人員來說在技術上是困難的。而且頻寬很便宜——或者更確切地說,費用是由用戶買單的。

Google Chrome 投入了大量精力來開發 Chrome 二進位檔案的增量更新http://blog.chromium.org/2009/07/smaller-is-faster-and-safer-too.html

Fedora 開發了「delta rpms」來提供增量包更新。有趣的是,因為我的電腦具有快速的網路連線但處理器速度較慢,所以這些對我來說實際上安裝得較慢。

相關內容