天天看點

Android 增量更新 bsdiff bspatch

最初的增量更新應該是Google Play在Google IO 2012 上提出來的,現在被各大應用市場廣泛使用。

最近我們也需要用到這個技術,是以研究一下下~

http://kinggoo.com/bsdiffupdate.htm http://blog.csdn.net/hmg25/article/details/8100896 http://my.oschina.net/liucundong/blog/160436 https://github.com/cundong/SmartAppUpdates http://www.eoeandroid.com/thread-307819-1-1.html

這個網址有用戶端和服務端的方法介紹: http://www.csdn.net/tag/android%25E5%25B7%25AE%25E5%25BC%2582%25E5%258C%2596%25E5%258D%2587%25E7%25BA%25A7

http://blog.csdn.net/look_down/article/details/17851791 https://github.com/cczscq/smartupdate

http://www.2cto.com/kf/201401/274436.html http://blog.csdn.net/leilu2008/article/details/10210031 https://github.com/SpecialCyCi/AndroidSmartUpdatesDemo http://blog.leepood.com/android-shi-xian-zeng-liang-geng-xin http://download.csdn.net/download/tibib/5581905

哎~~~ 經過3個小時的慘痛測試後,發現行不通啊,我在linux下編譯bsdiff, 根本編譯不過,總是報錯誤,如下:

bsdiff-4.3$ make 

cc -O3 -lbz2 bsdiff.c -o bsdiff

/tmp/cc3OAqLk.o: In function `main':

bsdiff.c:(.text.startup+0x2b3): undefined reference to `BZ2_bzWriteOpen'

bsdiff.c:(.text.startup+0x968): undefined reference to `BZ2_bzWrite'

bsdiff.c:(.text.startup+0x9b0): undefined reference to `BZ2_bzWrite'

bsdiff.c:(.text.startup+0xa0c): undefined reference to `BZ2_bzWrite'

bsdiff.c:(.text.startup+0xa6b): undefined reference to `BZ2_bzWriteClose'

bsdiff.c:(.text.startup+0xabe): undefined reference to `BZ2_bzWriteOpen'

bsdiff.c:(.text.startup+0xae9): undefined reference to `BZ2_bzWrite'

bsdiff.c:(.text.startup+0xb0f): undefined reference to `BZ2_bzWriteClose'

bsdiff.c:(.text.startup+0xb61): undefined reference to `BZ2_bzWriteOpen'

bsdiff.c:(.text.startup+0xb8c): undefined reference to `BZ2_bzWrite'

bsdiff.c:(.text.startup+0xbb2): undefined reference to `BZ2_bzWriteClose'

collect2: ld 傳回 1

make: *** [bsdiff] 錯誤 1

總是這個錯誤,沒有找到網上有人說解決的~

其實我隻需要2個編譯好的檔案:bsdiff 和 bspatch,就可以在我本地(Ubuntu_linux64的系統)測試了,在無路可走的時候,我突然想起來,在linux的源碼中也有這個bsdiff工具類,于是趕緊打開代碼,找到external/bsdiff目錄下,裡面有android.mk, 于是在這個目錄下直接mm即可編譯,很快就編譯成功了,log資訊如下:

/dev/android4.4/external/bsdiff$ mm

============================================

PLATFORM_VERSION_CODENAME=REL

PLATFORM_VERSION=4.4

TARGET_PRODUCT=aosp_flo

TARGET_BUILD_VARIANT=userdebug

TARGET_BUILD_TYPE=release

TARGET_BUILD_APPS=

TARGET_ARCH=arm

TARGET_ARCH_VARIANT=armv7-a-neon

TARGET_CPU_VARIANT=krait

HOST_ARCH=x86

HOST_OS=linux

HOST_OS_EXTRA=Linux-3.2.0-59-generic-x86_64-with-Ubuntu-12.04-precise

HOST_BUILD_TYPE=release

BUILD_ID=KRT16O

OUT_DIR=out

============================================

make:進入目錄'/android4.4'

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/camera_click.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/camera_click.ogg”的舊指令

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/camera_focus.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/camera_focus.ogg”的舊指令

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/Effect_Tick.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/Effect_Tick.ogg”的舊指令

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/KeypressDelete.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/KeypressDelete.ogg”的舊指令

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/KeypressReturn.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/KeypressReturn.ogg”的舊指令

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/KeypressSpacebar.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/KeypressSpacebar.ogg”的舊指令

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/KeypressStandard.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/KeypressStandard.ogg”的舊指令

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/Lock.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/Lock.ogg”的舊指令

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/LowBattery.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/LowBattery.ogg”的舊指令

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/Unlock.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/Unlock.ogg”的舊指令

build/core/Makefile:32: 警告:覆寫關于目标“out/target/product/flo/system/media/audio/ui/VideoRecord.ogg”的指令

build/core/Makefile:32: 警告:忽略關于目标“out/target/product/flo/system/media/audio/ui/VideoRecord.ogg”的舊指令

No private recovery resources for TARGET_DEVICE flo

Import includes file: out/host/linux-x86/obj/EXECUTABLES/bspatch_intermediates/import_includes

host C: bspatch <= external/bsdiff/bspatch.c

Export includes file: external/bsdiff/Android.mk -- out/host/linux-x86/obj/EXECUTABLES/bspatch_intermediates/export_includes

host Executable: bspatch (out/host/linux-x86/obj/EXECUTABLES/bspatch_intermediates/bspatch)

Install: out/host/linux-x86/bin/bspatch

make:離開目錄“/android4.4”

OK,編譯成功了,那麼去對應的目錄發現,在out/host/linux-x86/bin/目錄下,已經有編譯好的bsdiff,bspatch了,還有很多其它的工具,但是我們暫且不看。

然後我用一個應用的兩個版本的APK測試一下了!補一句,如果你在window下測試的話,其實更友善,這個網址,http://blog.csdn.net/hmg25/article/details/8100896,裡面有windows的測試工具和指令。

指令如下(中間的總是新版本的APK,最後總是差分patch):

  1. bsdiff   iReader1.6.2.0(v35).apk   iReader1.8.0.1(v40).apk   ireader.patch  
  2. bspatch  iReader1.6.2.0(v35).apk   new.apk    ireader.patch  

比如:

A:代表1.0版本  

B:代表2.0版本  

C:代表差分包

D:用A,C生成的新版本,其實就是B

1.用bsdiff生成差分patch(C):發現确實包小了很多

2.用bspatch:用老版本apk(A),剛剛生成的patch(C),生成新版本的apk(D),發現新版本的APK(D)和最原始的APK(B)的大小是一樣的

3.用md5sum 和sha1sum校驗了一下新生成的APK(D),與最原始的版本(B)相比,發現2個值都分别相等

最後補充一下,校驗md5sum, sha1sum 有什麼用呢?md5sum 和 sha1sum 二者多用于計算某個檔案的hash值,其實我也沒搞懂,參考一下:

http://blog.sina.com.cn/s/blog_609dd4970101011f.html

http://www.pvsky.com/blog/20121003/457.html

太強大了,牛逼~

其實不隻用于APK的更新,其它的比如:zip等的更新都可以用這個,因為是二進制的差分麼。

附帶2個bsdiff, bspatch工具,如果你沒有android源碼的話,确實這2個工具很難找,我在ubuntu linxu64位下編譯的:見這個網址:

http://download.csdn.net/detail/song_shi_chao/7035557

繼續閱讀