Android 增量更新和升级
在年初的时候,尝试了一把热修复技术,当时选择的是阿里的andfix,使用起来也很简单,这里就不在多少,如果你对andfix有兴趣请链接:点击打开链接。虽然网上将热修复的文章很多,不过我还是想说原理,然后配合代码,我想这样大家理解更加深刻。
原理
热修复(打补丁)
拷贝资源 | 拷贝旧版本APK以及新版本APK到SD卡。为了后面进行生成差分包 |
安装旧版本APK | 安装旧版本的APK |
生成补丁 | 生成差分包。这个实际上应该是在服务端完成 |
打补丁 | 通过差分包及旧版本APK生成新版本APK |
安装新版本APK | 安装生成的新版本APK |
获取某个应用的APK安装文件 | 在真正的增量更新过程中,旧版本Apk应该从/data/app底下获取,拷贝到SD卡,进行打补丁。当然,也可以不拷贝,直接使用该路径。 |
为了方便,我们就在本地放两个本地,为了方便讲解,我们先定义4个变量。
String srcDir = Environment.getExternalStorageDirectory().toString() + "/DaemonProcess-1.apk"; String destDir1 = Environment.getExternalStorageDirectory().toString() + "/DaemonProcess-2.apk"; String destDir2 = Environment.getExternalStorageDirectory().toString() + "/DaemonProcess-3.apk"; String patchDir = Environment.getExternalStorageDirectory().toString() + "/DaemonProcess.patch";
String appDir = getPackageManager().getApplicationInfo(packageName, 0).sourceDir;
destDir1:新版本的apk路径。
destDir2:新版本的apk路径。通过差分包+旧版本APK合成新版本APK。
patchDir:差分包。通过旧版本APK+新版本APK生成差分包。
public class DiffUtils { static DiffUtils instance; public static DiffUtils getInstance() { if (instance == null) instance = new DiffUtils(); return instance; } static { System.loadLibrary("ApkPatchLibrary"); } /** * native方法 比较路径为oldPath的apk与newPath的apk之间差异,并生成patch包,存储于patchPath */ public native int genDiff(String oldApkPath, String newApkPath, String patchPath); }
合成新包Native方法:
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 */ public native int patch(String oldApkPath, String newApkPath, String patchPath); }
这里用到了一个ndk,如果有需要了解如何生成动态库文件的可以访问下面的点击打开链接
private class CopyTask extends AsyncTask<String, Void, Integer> { @Override protected Integer doInBackground(String... params) { for (int i = 0; i < params.length; i += 2) { try { File file = new File(params[i]); if (!file.exists()) FileUtils.createFile(file); InputStream is; OutputStream os = new FileOutputStream(params[i]); is = getAssets().open(params[i + 1]); byte[] buffer = new byte[1024]; int length = is.read(buffer); while (length > 0) { os.write(buffer, 0, length); length = is.read(buffer); } os.flush(); is.close(); os.close(); } catch (Exception e) { handler.obtainMessage(1).sendToTarget(); return null; } } handler.obtainMessage(0).sendToTarget(); return null; } @Override protected void onPostExecute(Integer integer) { super.onPostExecute(integer); loadding.setVisibility(View.GONE); } }
2,合成新的apk(jni会自动判断是否合成成功)
private class PatchTask extends AsyncTask<String, Void, Integer> { @Override protected Integer doInBackground(String... params) { try { int result = PatchUtils.getInstance().patch(srcDir, destDir2, patchDir); if (result == 0) { handler.obtainMessage(4).sendToTarget(); return WHAT_SUCCESS; } else { handler.obtainMessage(5).sendToTarget(); return WHAT_FAIL_PATCH; } } catch (Exception e) { e.printStackTrace(); } return WHAT_FAIL_PATCH; } @Override protected void onPostExecute(Integer integer) { super.onPostExecute(integer); loadding.setVisibility(View.GONE); } }
3,安装新的apk
private void install(String dir) { String command = "chmod 777 " + dir; Runtime runtime = Runtime.getRuntime(); try { runtime.exec(command); // 可执行权限 } catch (IOException e) { e.printStackTrace(); } Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.parse("file://" + dir), "application/vnd.android.package-archive"); startActivity(intent); }
服务端工具以及源码位于Server目录下。目前只在Linux64位的系统下编译,其他系统大家可自行编译。Linux下的可直接修改makefile,windows下可用VC编译。
Diff工具:生成差分包
<!--命令 oldApk newApk patch--> ./linux-x86_64/Diff DaemonProcess-1.apk DaemonProcess-2.apk dp.patch
Patch工具:合并
<!--命令 oldApk newApk patch--> ./linux-x86_64/Patch DaemonProcess-1.apk DaemonProcess-3.apk dp.patch
代码地址:点击打开链接
Android 增量更新和升级的更多相关文章
- Android 增量更新(BSDiff / bspatch)
Android 增量更新 BSDiff / bspatchhttp://www.daemonology.net/bsdiff/android的代码目录下 \external\bsdiff bsdiff ...
- Android 增量更新研究
Android 增量更新实例(Smart App Updates) http://blog.csdn.net/duguang77/article/details/17676797 Android AP ...
- 一句话的Android增量更新框架(增量更新)
转自:http://www.jianshu.com/p/a9ec8fa780e2 Android应用更新要使用完整的新版本Apk安装,增量更新则是提供一个新旧版本偏差数据的patch包供应用下载,然后 ...
- 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 增量更新完全解析 是增量不是热修复(转)
转自:http://blog.csdn.net/lmj623565791/article/details/52761658 本文在我的微信公众号:鸿洋(hongyangAndroid)首发. 转载请标 ...
- android 增量更新原理
原理如下:服务器端设计增量表,记录数据操作顺序id,和增删改查信息.在进行数据库表操作的时候同时进行将信息保存在增量表. android客户端在请求的时候上传最后保存的id.服务端判断最后的id,返回 ...
- Android增量更新
http://blog.csdn.net/tu_bingbing/article/details/8538592 (转)
- Android studio使用增量更新进行版本升级
今天将Android Studio更新了一下,特此记录一下升级过程,以后可能还会用得着. 首先通过菜单栏进入 Help --> Check for update 查看下当前版本是否需要更新.事实 ...
随机推荐
- bzoj 4870: [Shoi2017]组合数问题
Description Solution 考虑这个式子的组合意义: 从 \(n*k\) 个球中取若干个球,使得球的数量 \(\%k=r\) 的方案数 可以转化为 \(DP\) 模型,设 \(f[i][ ...
- ●SPOJ 8222 NSUBSTR–Substrings
题链: http://www.spoj.com/problems/NSUBSTR/题解: 后缀自动机. 不难发现,对于自动机里面的一个状态s, 如果其允许的最大长度为maxs[s],其right集合的 ...
- 51nod 1770 数数字
1770 数数字 基准时间限制:1 秒 空间限制:262144 KB 分值: 20 难度:3级算法题 收藏 关注 统计一下 aaa ⋯ aaan个a × b 的结果里面 ...
- Codeforces Round #411 (Div. 1) D. Expected diameter of a tree
题目大意:给出一个森林,每次询问给出u,v,问从u所在连通块中随机选出一个点与v所在连通块中随机选出一个点相连,连出的树的直径期望(不是树输出-1).(n,q<=10^5) 解法:预处理出各连通 ...
- codeforces round #419 C. Karen and Game
C. Karen and Game time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...
- Polya计数
Let it Bead Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5365 Accepted: 3585 Descr ...
- Linux设备树语法详解【转】
转自:http://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备 ...
- .Net及C#基础知识,面试宝典
作为你一.Net和C#开发这些知识,你是否掌握了,你是否算的上一名入门的程序员? 技术不行并不可怕,可怕的是你不知道自己还需做哪一方面的提升,本篇文字本人的一些面试时所经常涉及的问题,并且在网上收集了 ...
- python2.7入门---操作mysql数据库增删改查
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: G ...
- IOS和OSX事件传递机制
本文ios部分转载自: http://zhoon.github.io/ios/2015/04/12/ios-event.html iOS的事件有好几种:Touch Events(触摸事件).Motio ...