Android Apk增量更新

前言

有关APK更新的技术比较多,例如:增量更新、插件式开发、热修复、RN、静默安装。

下面简单介绍一下:

什么是增量更新?

 

增量更新就是原有app的基础上只更新发生变化的地方,其余保持原样。

与原来每次更新都要下载完整apk包的做法相比,这样做的好处显而易见:每次变化的地方总是比较少,因此更新包的体积就会小很多。

增量更新的流程

 

1.APP检测最新版本:把当前版本告诉服务端,服务端进行判断。

如果有新版本,服务端需要对当前版本的APK与最新版本的APK进行一次差分,产生patch差分文件。(或者新版本的APK上传到服务端的时候就已经差分好了)

2.APP在后台下载差分文件,进行文件的MD5校验,在本地进行合并(跟本地的data目录下面的APK文件合并),合并出最新的APK之后,提示用户安装。

3.增量更新的最终目的:省流量地更新宿主APK。

差分的处理比较麻烦的地方就是要针对不同的应用市场渠道和众多不同版本进行差分。

注意:新版本有可能比旧版本小,差分只是把变化的部分记录下来。

服务器端行为(后台工程师操作)

1.下载拆分和合并要用的第三方库(bsdiff、bzip2)

 

我们使用到的第三方库是:Binary diff,简称bsdiff,这个库专门用来实现文件的差分和合并的,它的官网如下:

http://www.daemonology.net/bsdiff/

在这里我们可以点击文中的"here"下载源码,这是Linux源码。也可以下载Windows版本的源码,点击"Windows port"。

建议Windows 下用sbsdiff4.3-win32-src编译

这个库引用了bzip2这个库,官网如下:

http://www.bzip.org/

2.编译第三方库源码生成dll动态库

 

为了方便演示,我在Windows 10平台下用VS2017编译,实际情况服务器大都在Linux系统下运行,这个大家去测试吧。

Windows 下生成dll动态库参考 Android NDK开发之旅10--JNI--JNI开发流程

所用到资源

注意:com_haocai_bsdiff_BsDiff.h 是根据Java文件声明得到的,步骤省略。

编译过程中会有以下错误提示

字符集问题

用了不安全和过时的函数

SDL检查不通过

以下是解决办法:

配置字符集

忽略不安全和过时的函数警告

设置SDL检查形式

另外,可能报头文件找不到的错误,这有可能是编码问题,因为外国人使用的苹果电脑跟Windows电脑的编译不一致产生的。可以通过Notepad++的转码功能进行转码,全部转为UTF-8无BOM格式编码即可,Windows、Linux通用的。

我们项目属性里面的生成配置里面选择DLL,并且修改解决方案为你的电脑的对应平台,然后编译,生成DLL动态库文件。

3.Java代码调用

 

创建Web项目,用来做APP的服务端。创建工具类专门用于产生差分包:

其中JNI的实现如下(该实现写在bsdiff.cpp中):

通过研究bsdiff的源码,我们发现bsdiff.cpp里面的main函数就是入口函数,避免歧义把函数名main改为bsdiff_main,然后通过JNI去调用。

根据bsdiff.cpp中bsdiff_main函数方法中有以下关键语句

if (argc != 4) errx(1, "usage: %s oldfile newfile patchfile\n", argv[0]);

根据提示需要传入4个参数:

argv[0] = "bsdiff";//这个参数没用

argv[1] = oldPath;//旧APK文件路径

argv[2] = newPath;/新APK文件路径

argv[3] = patchPath;//APK差分文件路径

然后我们准备两个APK文件,不同版本的,最好Java代码、资源都不一样。

写一个Java测试类生成差分包:

生成结果如下图所示:

apk.patch为生成的差分包

注意:

test_new.apk、test_old.apk 要先放在目标目录

bsdiff.cpp中生成差分包的程序方法是异步的,所以生成完整的apk.patch可能要等一下。apk.patch体积大小停止增长,表示生成结束。

4.简单搭建后台JavaWeb供Android前端下载apk.patch差分包

 

参考 Intellij idea创建javaWeb以及Servlet简单实现

在浏览器中输入

http://localhost:8080/App_Update_Web/patchfile/apk.patch

如图,提示可以下载

服务器搭建完毕。

Android客户端行为

 

1.编译合并要用的第三方库(bsdiff、bzip2)

 

对应的Java代码如下:

在Android端,我们需要把bzip2以及bsdiff的文件拷贝到jni目录里面,同样的,我们只需要编译一个bspatch.c源文件即可。

ndk-build所需要的文件

由于Android手机本来就是Linux系统,因此我们直接使用bsdiff的Linux版本的库即可。

跟服务器端一样,在这里我们把bspatch.c中的main函数改为bspatch_main,提供JNI调用:

代码v1.0差分包合并核心代码如下:

主要的逻辑在fileDownload方法中,我们先下载差分包,然后在本地合成,最后提示用户安装。

为了达到明显的效果,两个版本可以增删一些资源文件、修改Java代码、布局文件等。

注意:这里7.0可能会有问题,把路径暴露给别的app,需要FileProvider去实现(不难,这个留给大家去做吧)。

源码下载:https://github.com/kpioneer123/DiffInstallApp

时间: 2024-11-07 15:53:07

Android Apk增量更新的相关文章

开源 Android App 增量更新库 版本升级

开源 Android App 增量更新库 版本升级 经过几天的重构,我将之前写的一个Android 应用增量更新的示例程序重构为了一个开源库,现在已经push 到 GitHub 上,欢迎大家Watch.Star.Fork. 包含以下内容: 服务器端生成差异包的工程:AppUpdate 客户端使用的开源apk合并库:ApkPatchLibrary 引用ApkPatchLibrary,实现增量更新的ApkPatchLibraryDemo 旧版本的微博Android客户端,以及服务端生成的新旧微博差分

android 客户端增量更新

首先我们需要了解什么是增量更新,增量更新通俗点说就是客户端只需要下载新版本与旧版本的差分包,客户端再把差分包与旧版本进行合成得到一个新apk,在安装这个新的apk,这个新的apk其实新版本,实现更新,注意增量更新与热修复的区别. 原理大家可以查看:详情请见这篇文章Android 增量更新完全解析 是增量不是热修复 我们需要了解ndk,jni,以及.so如何生成,下面是我们windows的准备过程 1.下载bsdiff 下载地址:http://www.daemonology.net/bsdiff/

【Android-功能】Android应用增量更新

很久没有更新博客了,真是堕落啊,几次想提起笔,却总是被各种琐事耽搁,以后会多写文章记录点滴. 背景 随着android应用体积的不断增大,以及应用版本发布的不断更迭,用户的升级成了一个问题,google也意识到不断更新应用对用户流量的损耗,在Google I/O 上提及的 Smart App update,即应用增量升级,或者叫做差分升级的做法,并在新版本的Google Play中得到支持,某天在和群友聊天是扯到这方面的话题,好奇就稍微研究了一下. 增量升级的原理 今天我们就来实现类似的应用的增

Android apk增量升级

前言 别看本文看上去很简单,实际在实验过程中遇到了很多问题,比如andorid studio下ndk编译报错,而本文呈现给大家的都是最终可行的方法. 所需资源 bzip2 bsdiff ndk 两个不同版本的测试apk 原理 在服务器端,生成最新版与之前所有版本的差分包,为什么是所有版本,因为我们无法知道用户当前版本是什么版本 在手机客户端更新程序时,下载差分包,使用已安装的旧版apk与这个差分包,合成为一个新版apk 校验新合成的apk文件是否完整,检验合成版本的签名是否和已安装客户端一致,如

Android应用增量更新

Original:https://github.com/cundong/SmartAppUpdates Backup:https://github.com/eltld/SmartAppUpdates

最全的增量更新入门 包含linux端和Android

简介 增量更新大量用于 Android各大应用市场.本文想做网络上从服务器到app客户端完整讲解.app用eclipse和android studio 最新版cmark开发ndk 如下图: 以前一直好奇怎么做的直到知道了bsdiff库. 地址附上: bsdiff源码地址和简介 大家可以从简介看到bsdiff是基于bzip2源码(bsdiff和bspatch一个用于生成差异文件补丁,另一个用于差异文件和旧文件合成新文件) 下载地址说明 应用市场原理说明 假设你用的是"XXX市场"点击更新

Android 增量更新实例(Smart App Updates)

目录[-] 官方说明 实现原理 实现 (1)生成差异包 (2)使用旧apk+差异包,在客户端合成新apk 注意事项 demo 自从 Android 4.1 开始,Google引入了应用程序的增量更新. 官方说明 Smart app updates is a new feature of Google Play that introduces a better way of delivering app updates to devices. When developers publish an

转Android开发之增量更新

一.使用场景 apk升级,节省服务器和用户的流量 二.原理 自从 Android 4.1 开始, Google Play 引入了应用程序的增量更新功能,App使用该升级方式,可节省约2/3的流量. 现在国内主流的应用市场也都支持应用的增量更新了,最常见的应用宝省流量更新. 增量更新的原理,就是将手机上已安装apk与服务器端最新apk进行二进制对比,得到差分包(即两个版本的差异文件),用户更新程序时,只需要下载差分包,并在本地使用差分包与已安装apk,合成新版apk. 例如,当前手机中已安装微博V

android增量更新(打补丁方式)

自从 Android 4.1 开始,Google引入了应用程序的增量更新. 官方说明 Smart app updates is a new feature of Google Play that introduces a better way of delivering app updates to devices. When developers publish an update, Google Play now delivers only the bits that have change