Android APP增量升级的实现方式
实现原理
增量更新的原理非常简单,就是将本地apk与服务器端最新版本比对,并得到差异包,用户更新App时只需要下载差异包。例如,当前安装新浪微博V3.5,12.8 MB,新浪微博最新版V4.0,15.4MB,经过对两个版本比较之后,发现差异只有7、8M,这时候用户更新的时候只需要下载一个7、8M的差异包便可,不需要整包下载15.4M的新版微博客户端。下载差异包后,在手机端使用旧版apk+差异包,合成得到微博最新版V4.0,提醒用户安装即可。
实现
以新浪微博客户端的升级为例,假设手机上安装的是V3.5,现在最新版是V4.0,用户需要从V3.5升级到V4.0。
弄清楚原理之后,我们就需要解决两个问题:
1.如何比对两个版本的apk生成差异包;
2.如何使用旧的apk+差异包,生成一个新apk;
(1)生成差异包
这一步需要在服务器端来实现,一般来说,apk有新版本之后,需要往后台管理端上传新apk,上传时就应该生成每一个旧版与最新版本的差异包。
假设,你的apk已经发布了3个版,1.0,2.0,3.0,这时候你要在后台发布4.0,在你上传时,就应该生成
1.0——>4.0的差异包;
2.0——>4.0的差异包;
3.0——>4.0的差异包;
选择使用这个开源二进制比较工具来实现:
http://www.daemonology.net/bsdiff/
下载后得到bsdiff-4.3.tar.gz。
其中bsdiff.c是二进制文件比对的代码;bspatch.c是二进制文件合成的代码;
我们将使用这个bsdiff来生成两个apk的patch包,并且使用bspatch.c来合成旧apk与patch包;
使用bsdiff、bspatch时,还需用到bzip2: http://www.bzip.org/downloads.html
下载后得到:bzip2-1.0.6.tar.gz。
我们需要用到bzip2-1.0.6.tar.gz中以下13个文件(这里面可能有的是不需要的,我都拷贝过来了):
blocksort.c
|
02
|
bzip2.c
|
03
|
bzip2recover.c
|
04
|
bzlib_private.h
|
05
|
bzlib.c
|
06
|
bzlib.h
|
07
|
compress.c
|
08
|
crctable.c
|
09
|
decompress.c
|
10
|
dlltest.c
|
11
|
huffman.c
|
12
|
randtable.c
|
13
|
spewG.c
|
将这13个文件拷贝至jni目录下,接下来,我们就调用bsdiff生成差异包,并且调用bspatch合成新包。
我是在Mac下做的,使用java开发,通过jni调用C程序(bsdiff、bzip2)。
调用,com.cundong.utils.DiffUtils.java中genDiff()方法,可以通过传入的新(newApkPath)旧(oldApkPath)apk,得到差异包(patchPath)。
1
public static native int genDiff(String oldApkPath, String newApkPath,String patchPath);调用,com.cundong.utils.PatchUtils.java中patch()方法,可以通过旧apk(oldApkPath)与差异包(patchPath),得到新apk(newApkPath)。
1
public static native int patch(String oldApkPath, String newApkPath,String patchPath);
(2)使用旧apk+差异包,在客户端合成新apk
差异包已经在服务器端生成,我们只需要在客户端提示用户有更新,然后让用户来下载差异包,下载成功之后,
使用本地apk与差异包,生成新版apk。
这一步需要在Android应用中开发。
1.首先NDK编译出一个*.so,APKPatch工程负责生成 libapkpatch so,生成的so文件位于APKPatch/libs/libapkpatch.so下,其他Android工程便可以使用该so文件来合成apk。
2.调用该so文件。
任意一个Android工程,使用该so文件,拷贝至libs\armeabi中,便可以调用patch()方法,来和成旧apk+差异包。
附件中,test工程,就是一个调用该so文件的例子。
注意事项
1.新包和成之后,还需要对合成升级版本的apk包及最新版本apk包进行MD5或SHA1校验,如果校验码不一致,说明合成过程有问题,新合成的包将不能被安装。
2.增量升级成功的前提是,用户手机端必须有能够让你拷贝出来且与你服务器用于差分的版本一致的apk,这样就存在,例如,系统内置的apk无法获取到,无法进行增量升级;对于某些与你差分版本一致,但是内容有过修改的(比如破解版apk),这样也是无法进行增量升级的,为了防止合成补丁错误,最好在补丁合成前对旧版本的apk进行校验,保证基础包的一致性。
Android APP增量升级的实现方式相关推荐
- Android 探索增量升级
一.介绍 Android 的增量升级,不同热修复和热更新,它只是通过和老的 apk 对比,识别出与新 apk 之间的二进制差异,从而生成的补丁包(差量包): 这样的好处在于,不用全部下载所有的文件,比 ...
- Android APP 增量更新demo
随着现在手机硬件不断的提升,分辨率提高手机的安装包也是越来越大了.当年NOKIA,MOTO时代,一个手机APP如果有1MB那都是算大的,2MB已经不得了了.虽然网络.存储都已经大大提升,但是流量还不至 ...
- Android应用增量升级
阅读此文之前请先阅读 http://blog.csdn.net/hmg25/article/details/8100896 何为增量升级,简单说下,当应用版本要更新时通常的做法是重新下载新的版本去覆 ...
- Android apk增量升级
前言 别看本文看上去很简单,实际在实验过程中遇到了很多问题,比如andorid studio下ndk编译报错,而本文呈现给大家的都是最终可行的方法. 所需资源 bzip2 bsdiff ndk 两个不 ...
- 浅析android应用增量升级
2019独角兽企业重金招聘Python工程师标准>>> http://blog.csdn.net/hmg25/article/details/8100896 bsdiff http: ...
- Android增量升级
Android的增量升级原理就是做apk版本之间的差分数据包,得到这个补丁包以后,在客户端合并旧的apk和补丁包,得到一个新的apk,最终通过新的apk实现升级. Android的增量升 ...
- 增量升级(省流量更新)的Android客户端实现
By sgwhp (http://blog.csdn.net/sgwhp)转载请注明出处 用过类似360手机助手应该对省流量更新都很熟悉了.详细资料可以参考以下两个博客: 浅析android应用增量升 ...
- android ota升级服务,android 标准OTA升级流程
标准的OTA升级流程包括一下几个步骤: 1.Android设备首先会与OTA服务器进行交互,如果有更新会推送给客户.推送的信息常常会包含OTA更新包的下载地址和一些版本信息. 2.Update程序会将 ...
- 掌阅Android App插件补丁实践(ZeusPlugin)
掌阅Android App插件补丁实践(ZeusPlugin) 遇到问题 65K方法数超限 随着应用不断迭代,业务线的扩展,应用越来越大,那么很不幸,总有一天,当你编译的时候,会遇到一个类似下面的错误 ...
最新文章
- 蒙古族女孩鲍尔金娜的小说《紫茗红菱》
- C# 用IrisSkin4.dll美化你的WinForm
- linux驱动向不同串口发数据,Linux串口(serial、uart)驱动程序设计
- oracle查找clob中的值,Oracle 查找带有CLOB字段的所有表
- scala运算符_Scala运算符–算术,关系,逻辑,按位,赋值
- 独热向量编码(one-hot encoding)原理详解与实现
- JavaWeb request对象常用操作
- Excel文件解密软件
- Web调用海康威视摄像头
- 计算机图形学实用教程苏小红,计算机图形学实用教程(第4版)
- 傅里叶变换及拉普拉斯变换直观理解总结
- PHP医学上什么意思,apache医学上表示什么
- 小孩孩子应用题计算机错误,为什么一二年级的孩子数学应用题总出错?家长该怎么办?...
- python生成树状图_使用python的分层聚类树状图
- python猜数字统计游戏次数_猜数字游戏的实现(Python3.5)
- 图像的几种变换简单介绍
- IDEA jjsp 404_IDEA 卡住半天,buid(编译)不动——解决办法(适用于maven和gradle)及定位全过程 - CoderBaby
- C语言编程题:用泰勒级数求自然数e的近似值
- 云原生 · DevOps`01 | 光速初识DevOps
- GIS二次开发:实验二 地图数据访问与渲染