●功能版本:增量更新是Google 4.1增加的新功能
●功能背景:

现在的安卓Apk越来越大,而在此之前如果用户发现有新版本的话,需要重新把对应程序的新版本下载下来,有时候并不是重大更新,仅仅只是优化了一下,用户就需要重新下载apk,不仅浪费流量而且浪费时间(等同于浪费生命啊,亲!!!),有这样的问题,便会出现更优的功能迭代即增量更新或增量升级,或者叫差异化更新,目前很多应用商店已经对接了此功能:比如谷歌官方,小米等等。。。

●实现原理:

客户端与服务端对比,并生成版本之间的差异包,用户不用下载整个apk文件,只用下载差异包就可以了,比如用户微博2.0升级到微博3.0,本来微博3.0版本应该是10M,服务器通过生成差异包4M,用户直接下载4M文件并在本地进行合并生成微博3.0版本,安装,对于网络环境较差的用户绝对提高用户体验,节省流量和时间

(服务端+客户端)实现思路:

1.客户端带着VerisionCode发送请求给服务端

2.服务端判断VersionCode是否是最新版本,如果不是检测是否有此版本和最新版本的差异包,如果没有则在后台生成(旧VersionCode-新VersionCode).patch文件

3.客户端收到返回数据,判断是否最新,如果不是弹出升级的Dilog对话框

4.点击立即升级,再次发送请求

5.服务端返回给客户端对应版本差异包的Url地址

6.客户端拿到URL地址下载到SD卡中,并从客户端data/app 目录下拷贝本程序的apk安装包,

7.客户端通过调用JNI编译的.so动态链接库中的方法合并旧版本和差异包,生成新版本,调用Intent方法安装最新的apk包

用到的知识点:

1.JNI相关(重点)

2.Http协议相关(次重点)

3.工厂设计模式_调用接口实现类(次重点)

●实现

假设,你的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。
将所有文件拷贝至jni目录下,接下来,我们就调用bsdiff生成差异包,并且调用bspatch合成新包。

客户端解决问题:

1) 在客户端把下载的.patch(差异包) 与旧版apk就行合并

一. 获取旧版本apk地址
二. 从服务端获取patch文件,存储到旧版本apk文件夹路径

/**
* 差分包合成APK*/
private class PatchTask extends AsyncTask<String, Void, Integer> {@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overrideprotected Integer doInBackground(String... params) {String appDir, newDir, patchDir;try {// 指定包名的程序源文件路径appDir = Environment.getExternalStorageDirectory().toString() + "/yyh/DaemonProcess-1.apk";newDir = Environment.getExternalStorageDirectory().toString() + "/yyh/DaemonProcess-3.apk";patchDir = Environment.getExternalStorageDirectory() + "/yyh/YixinCall.patch";//文件名由服务端获得int result = PatchUtils.getInstance().patch(appDir, newDir, patchDir);if (result == 0) {runOnUiThread(new Runnable() {@Overridepublic void run() {       Toast.makeText(getApplicationContext(), "合成APK成功",Toast.LENGTH_SHORT).show();}});return WHAT_SUCCESS;} else {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(), "合成APK失败", Toast.LENGTH_SHORT).show();}});return WHAT_FAIL_PATCH;}} catch (Exception e) {e.printStackTrace();}return WHAT_FAIL_PATCH;}
}
/** APK Patch工具类*/
public class PatchUtils {static PatchUtils instance;public static PatchUtils getInstance() {if (instance == null)instance = new PatchUtils();return instance;}static {System.loadLibrary("ApkPatchLibrary");}/*** native方法 使用路径为oldApkPath的apk与路径为patchPath的补丁包,合成新的apk,并存储于newApkPath* * 返回:0,说明操作成功* * @param oldApkPath*            示例:/sdcard/old.apk* @param newApkPath*            示例:/sdcard/new.apk* @param patchPath*            示例:/sdcard/xx.patch* @return*/public native int patch(String oldApkPath, String newApkPath, String patchPath);
}

这样就实现了差分包的生成与新的APK的合成,那么我们得到新的APK之后,就调用以下代码进行安装。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
startActivity(intent);  

服务端解决问题:
1.获得客户端发来的版本号,取老版本apk与新版本apk生产分差包
2.将分差包发送给客户端

“`
/**
* 生成差分包
*/
private class DiffTask extends AsyncTask

android 补丁包增量更新相关推荐

  1. Android 版本更新,支持增量更新

    AppSmartUpdate 项目地址:itlwy/AppSmartUpdate 简介: a smart lib for updating app / Android 版本更新,支持增量更新 更多:作 ...

  2. Android APP增量更新

    最近项目推进app的增量更新方案,特意看了几篇文章,先来两个博客地址 http://my.oschina.net/liucundong/blog/160436 https://github.com/c ...

  3. Android 如何实现增量更新

    什么是增量更新? 现在的APP安装包体积越来越大,几百兆甚至上G的,当APP更新时不再是消耗大量的流量下载一个完整安装包,而是消耗相对很少的流量下载一个增量包(差分包),采用谷歌Smart App U ...

  4. android APP自动增量更新

    APP自动增量更新 抽取的Android自动更新库,目的是几行代码引入更新功能,含服务端代码,欢迎Star,欢迎Fork,谢谢- 博客同步自:个人博客主页 代码github: https://gith ...

  5. Android友盟增量更新

    1.增量升级的原理  增量更新的原理就是将本地apk与服务器端最新版本比对,并得到差异包.比如现在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M.我们发现两个版本只有0.1M的 ...

  6. android+仿友盟更新,android友盟增量更新

    1.增量升级的原理 增量更新的原理就是将本地apk与服务器端最新版本比对,并得到差异包.比如现在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M.我们发现两个版本只有0.1M的差 ...

  7. Android应用内增量更新

    #Android 增量更新实现 原本来腾讯课堂中了解到了一些关于增量更新的知识,特地写一篇博客来记录下. 手机端实现 https://github.com/ItsFated/DiffPatch-app ...

  8. iOS开发实现资源包增量更新

      所谓资源包的增量更新是指,比如有一个资源包1.0版本, 现在如果升级到1.1本,那么只需要将1.0的版本信息发送给服务端,服务器端返回一个差分包.将这个差分包和本地的1.0的资源包进行合并生成1. ...

  9. Android NDK实现增量更新

    增量跟新,这个词相信大家都听说过,有些人也会增量跟新理解为是热跟新,其实不是,增量跟新比热跟新还要重量级一点,需要用户安装,只是下载不是高版本app的资源包,而是下载高版本app跟现版本的app的差分 ...

最新文章

  1. Assembly--软件PBcR和Canu
  2. idea python-IDEA里如何安装Python插件打造开发环境(图文详解)
  3. 数字图像处理:第二十章 视频编码与压缩
  4. element-ui 使用table控件绑定的list数据的坑
  5. ogc是一个非营利性组织_非营利组织的软件资源
  6. JAVA做一个五星评论打分字体,java中的Font
  7. 操作系统内核的一些事
  8. python 自动复制分类_leetcode python 常见分类问题模板(复制粘贴就能用) 更新中......
  9. Spring Boot学习总结(1)——Spring Boot入门
  10. final—前后端分离的网站
  11. Tricks(四十六)—— 四个数中最小值的实现
  12. 读书:鲁迅的《呐喊》和《彷徨》
  13. 卸载计算机系统,卸载完360安全卫士及其安装的补丁之后电脑各种系统问题
  14. vassistx插件
  15. ADMM算法求解二次项目标函数+l1正则项问题
  16. linux ssh pem 登陆,Linux 生成pem文件 用于免密登录
  17. kwgt 歌词_跪求完整版伪物语OP2白金迪斯科的中文,日文,罗马音三合一的歌词!!!...
  18. 宇宙简史——我们在哪儿
  19. abp集成abp.Dapper
  20. --Redis入坑--RedisPipelineException:Pipeline contained one or more invalid commands;WRONGTYPE ...

热门文章

  1. kl距离 java_KL距离,Kullback-Leibler Divergence
  2. nginx工作原理和实现高并发请求的原因
  3. 浅谈项目结项后的移交问题
  4. FineReport 7.0:帆软报表展示数据时,数据只有一页,但是多出一页空白页。
  5. delphi中值滤波算法
  6. STM32F29显示中文汉字
  7. Android中ListView的优化
  8. Linux 安装与配置服务器版jre7
  9. 助力 VR/AR 等复杂图像场景极致高清,火山引擎夺得 NTIRE 大赛双料冠军
  10. 【MATLAB数字图像处理】四叉树分割图像