高德車載導航的差分更新優化實踐

導讀
隨着車載設備聯網化,越來越多的車載設備從離線走到了線上。高德車載導航也早已從過去的離線安裝包更新演進到了在線迭代更新。但原車載設備的Android硬件配置遠低於手機,主要表現在處理器主頻低、內存和存儲空間有限,導致車載導航在車機上會出現無法下載新版本數據包、更新過程耗時長導致卡頓的情況,對導航應用的性能提出了要求。

爲提高用戶體驗,高德技術團隊立項解決了該問題。本文小結了高德車載導航在版本自更新演進過程中二進制差分解決方案的性能優化實踐。

差分更新方案比較

對於應用程序的版本更新迭代,除了分發全量的安裝包,還有一種更低成本的方式是分發增量包,即通過下發前後兩個版本的差異部分(這個過程下面簡稱Diff),然後在客戶端對原版本進行補丁更新(這個過程下面簡稱Patch)。因此也叫差分更新。

業內比較流行的差分方案主要有: bsdiff、Xdelta3和Courgette。最後一個方案Courgette來自於谷歌,主要解決的是可執行文件的差分,而導航更新資源不僅包含可執行文件,還包含了圖片等各種資源文件。所以,我們主要對比bsdiff和Xdelta3方案。

bsdiff和Xdelta3方案比較

下面是我們對選取的幾個文件做的bsdiff和Xdelta3差分性能對比:

bsdiff的優勢是壓縮比高,生成的差分文件非常小,但Patch過程耗時。而Xdelta3的優勢是Patch過程耗時極短,但內存消耗非常大。

相比高德車載導航自身運行內存開銷不足100MB的情況,Xdelta3的Patch內存消耗無法接受。因此我們選用了bsdiff作爲自更新方案。

原生bsdiff方案缺陷與改進

原生bsdiff方案使得壓縮比問題得到解決,但在車載導航自更新中還存在下面兩個缺陷:

  • 內存消耗大,整個過程會佔用10~35MB左右的內存。
  • 耗時長,整個包更新時間在3分鐘左右。

在對bsdiff的優化探索中我們發現Chromium開源項目中存在一份基於bsdiff的優化版本。該版本將bsidff的默認sufsort算法替換成了divsufsort算法,在Patch時間上有了較大的提升。

 

使用Chromium版本的bsdiff, 高德車載導航的自更新性能如下:

  • 內存消耗在10~20MB。
  • 整個Patch過程耗時仍然長達25秒左右。

耗時依然很長。

由於Patch過程是一個CPU密集型的操作,且車載設備CPU的性能普遍不足,這意味着在整個升級過程中用戶能明顯感受到導航的操作卡頓。同時,更新時間越長意味着遭遇斷電的可能性也越大。

基於以上分析,我們決定對Chromium版本的bsdiff進行CPU和內存上的性能優化。

bsdiff在車載自更新業務中的性能優化實踐

在車載自更新業務上,我們設定的目標是整體更新時間小於6秒,且內存開銷小於2MB。整個優化的過程就是圍繞時間和空間的取捨。

內存優化方案

經過對bsdiff源碼的分析,其Patch內存主要開銷來自文件內容在內存中的讀寫暫存和Bzip2的解壓開銷。通過調整Bzip2參數可以降低部分內存,但無法達到期望。而文件讀寫的內存佔用主要來自於其在內存中的暫存。

基於bsdiff差分Patch包的文件格式,我們增加了滑動窗口緩衝區的Patch特性,使其在文件的流式處理上能夠有更好的內存消耗可控性。每次讀取和寫入指定的滑動窗口大小數據,使數據即來即走。

算法優化方案

經過上述的優化後,Patch過程的主要性能瓶頸在於Bzip2的解壓算法中,即使調整Bzip2參數也無法減少本身的計算量。

bsdiff差分算法的一個特性就是差分出的Patch數據包含了大量連續的01冗餘數據,而Bzip2算法的優點就是對這類數據可以做到高度的壓縮,這也是bsdiff壓縮比高的原因。不過現在是目前的瓶頸。

此外,我們會製作軟件整體的壓縮差分包(即生成tar.bz2或zip格式文件),也就是說針對每個Bzip2壓縮後的差分文件還要再經過一次壓縮歸檔。這也意味着在客戶段要進行兩次的解壓。

替換壓縮算法

類似的冗餘壓縮算法有RLE(Run-length encoding),這個算法也是Bzip2算法的第一步。簡單來說RLE算法就是針對連續多個冗餘字節去掉其冗餘字節,僅保留冗餘的長度信息。這個算法相對更簡單。

因此,我們將Bzip2壓縮算法替換成了RLE算法,實際結果發現生成的Patch文件很大, 壓縮比很低。但是可以通過再次壓縮歸檔製作一次差分包,就可以達到和Bzip2幾乎相同的壓縮比效果。唯一的不足就是在客戶端解壓後會佔用多一些磁盤空間, 而這個代價相對廉價多了。

優化性能對比

經過上述整體優化後,性能對比如下:

經過內存優化後的方案空間複雜度將爲了O(1)。

上面的耗時差異在ARM車機會更明顯:

最終優化收益:內存消耗控制在2MB以內,整體Patch更新耗時3~5秒。

小結
通過對bsdiff的優化,高德車載導航在自更新性能上取得了較大收益。大幅縮短了用戶下載和更新時間,降低了對ARM車機的硬件資源要求。爲推動車載導航OTA更新提供了技術基礎,對未來高德車載導航在分發新功能、新業務上鋪平了道路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章