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
Android Apk增量更新的更多相关文章
- android studio增量更新
一.概述 1.1 概念 增量更新即是通过比较 本机安装版本 和 想要安装版本 间的差异,产生一个差异安装包,不需要从官网下载并安装全量安装包,更不需要将本机已安装的版本下载,而仅仅只是安装此差异安装包 ...
- Android应用增量更新
Original:https://github.com/cundong/SmartAppUpdates Backup:https://github.com/eltld/SmartAppUpdates
- Android 增量更新研究
Android 增量更新实例(Smart App Updates) http://blog.csdn.net/duguang77/article/details/17676797 Android AP ...
- Android 增量更新(BSDiff / bspatch)
Android 增量更新 BSDiff / bspatchhttp://www.daemonology.net/bsdiff/android的代码目录下 \external\bsdiff bsdiff ...
- Android 增量更新实例(Smart App Updates)
原地址:http://my.oschina.net/liucundong/blog/160436 官方说明 实现原理 实现 (1)生成差异包 (2)使用旧apk+差异包,在客户端合成新apk 注意事项 ...
- Android 增量更新
title: Android NDK之增量更新 1.增量更新使用到的库bsdiff和bzip2 bsdiff库是一个开源的二进制差分工具,通过对比Apk的二进制,从而进行差分包的生成. bsdiff库 ...
- Android友盟增量更新
1.增量升级的原理 增量更新的原理就是将本地apk与服务器端最新版本比对,并得到差异包.比如现在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M.我们发现两个版本只有0.1M的差 ...
- Android studio 2.0--android增量更新的那些事
用了这么久的AS 2.0预览版本号.4.7日谷歌最终公布了android studio 2.0正式版,小编当日便下载了.玩了一下.感觉第二次build编译明显快了,并且好像并没有又一次部署apk.经过 ...
- android游戏的增量更新(资源及代码的热更新)
需求当游戏需要更新时,不必让用户下载新的完整包,只需要通过游戏内部的更新系统自动更新差异包,达到节约用户流量和时间的目的. 大体思路:1.(游戏逻辑用lua等脚本编写的情况)这种方式的增量更新非常简单 ...
随机推荐
- hive与hbase的整合
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点学习成本低,可以通过类S ...
- (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)
原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...
- (转)MySQL 加锁处理分析
MySQL 加锁处理分析 原文:http://hedengcheng.com/?p=771 1 背景 1 1.1 MVCC:Snapshot Read vs Current Read ...
- Aop学习笔记系列一
一.Aop解决了什么问题? 1.在说解决了什么问题之前,先介绍一些关键的知识点 a.功能需求:功能需求指项目中的增值需求,比如业务逻辑,UI,持久化(数据库). b.非功能需求:项目中次要的,但却不可 ...
- 再学Java 之 解决No enclosing instance of type * is accessible
深夜,临睡前写了个小程序,出了点小问题 public class Test_drive { public static void main(String[] args){ A a = new A(); ...
- 使用canvas绘制渐变色矩形和使用按键控制人物移动
使用canvas绘制渐变色矩形和使用按键控制人物移动 1.使用canvas绘制渐变色矩形 效果演示 相关代码: <!DOCTYPE html> <html lang="en ...
- org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="hadoop": hadoop:supergroup:rwxr-xr-x
这时windows远程调试hadoop集群出现的这里 做个记录 我用改变系统变量的方法 修正了错误 网上搜索出来大概有三种: 1.在系统的环境变量或java JVM变量里面添加HADOOP_USE ...
- Okhttp3上传多张图片同时传递参数
之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片. 最近做项目,打算换个方法上传图片. Android发展到现在,Okhttp显得越来越重要,所以,这次我选择用Okhttp上传图片. ...
- Android 开发工具类 16_NotificationActivity
在前台运行的 Activity 可以通过Dialog.Toast 向用户发出提示信息,而后台运行的程序,如下载.收到信息等 Service 应用,则需要使用 Notification(通知)向用户发出 ...
- CVPR2019 | Libra R-CNN 论文解读
作者 | 文永亮 学校 | 哈尔滨工业大学(深圳) 研究方向 | 目标检测.GAN 推荐理由 这是一篇发表于CVPR2019的paper,是浙江大学和香港中文大学的工作,这篇文章十分有趣,网友戏称 ...