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


導讀
隨着車載設備聯網化,越來越多的車載設備從離線走到了線上。高德車載導航也早已從過去的離線安裝包更新演進到了在線迭代更新。但原車載設備的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更新提供了技術基礎,對未來高德車載導航在分發新功能、新業務上鋪平了道路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM