android 补丁包增量更新
●功能版本:增量更新是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 补丁包增量更新相关推荐
- Android 版本更新,支持增量更新
AppSmartUpdate 项目地址:itlwy/AppSmartUpdate 简介: a smart lib for updating app / Android 版本更新,支持增量更新 更多:作 ...
- Android APP增量更新
最近项目推进app的增量更新方案,特意看了几篇文章,先来两个博客地址 http://my.oschina.net/liucundong/blog/160436 https://github.com/c ...
- Android 如何实现增量更新
什么是增量更新? 现在的APP安装包体积越来越大,几百兆甚至上G的,当APP更新时不再是消耗大量的流量下载一个完整安装包,而是消耗相对很少的流量下载一个增量包(差分包),采用谷歌Smart App U ...
- android APP自动增量更新
APP自动增量更新 抽取的Android自动更新库,目的是几行代码引入更新功能,含服务端代码,欢迎Star,欢迎Fork,谢谢- 博客同步自:个人博客主页 代码github: https://gith ...
- Android友盟增量更新
1.增量升级的原理 增量更新的原理就是将本地apk与服务器端最新版本比对,并得到差异包.比如现在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M.我们发现两个版本只有0.1M的 ...
- android+仿友盟更新,android友盟增量更新
1.增量升级的原理 增量更新的原理就是将本地apk与服务器端最新版本比对,并得到差异包.比如现在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M.我们发现两个版本只有0.1M的差 ...
- Android应用内增量更新
#Android 增量更新实现 原本来腾讯课堂中了解到了一些关于增量更新的知识,特地写一篇博客来记录下. 手机端实现 https://github.com/ItsFated/DiffPatch-app ...
- iOS开发实现资源包增量更新
所谓资源包的增量更新是指,比如有一个资源包1.0版本, 现在如果升级到1.1本,那么只需要将1.0的版本信息发送给服务端,服务器端返回一个差分包.将这个差分包和本地的1.0的资源包进行合并生成1. ...
- Android NDK实现增量更新
增量跟新,这个词相信大家都听说过,有些人也会增量跟新理解为是热跟新,其实不是,增量跟新比热跟新还要重量级一点,需要用户安装,只是下载不是高版本app的资源包,而是下载高版本app跟现版本的app的差分 ...
最新文章
- Assembly--软件PBcR和Canu
- idea python-IDEA里如何安装Python插件打造开发环境(图文详解)
- 数字图像处理:第二十章 视频编码与压缩
- element-ui 使用table控件绑定的list数据的坑
- ogc是一个非营利性组织_非营利组织的软件资源
- JAVA做一个五星评论打分字体,java中的Font
- 操作系统内核的一些事
- python 自动复制分类_leetcode python 常见分类问题模板(复制粘贴就能用) 更新中......
- Spring Boot学习总结(1)——Spring Boot入门
- final—前后端分离的网站
- Tricks(四十六)—— 四个数中最小值的实现
- 读书:鲁迅的《呐喊》和《彷徨》
- 卸载计算机系统,卸载完360安全卫士及其安装的补丁之后电脑各种系统问题
- vassistx插件
- ADMM算法求解二次项目标函数+l1正则项问题
- linux ssh pem 登陆,Linux 生成pem文件 用于免密登录
- kwgt 歌词_跪求完整版伪物语OP2白金迪斯科的中文,日文,罗马音三合一的歌词!!!...
- 宇宙简史——我们在哪儿
- abp集成abp.Dapper
- --Redis入坑--RedisPipelineException:Pipeline contained one or more invalid commands;WRONGTYPE ...