一、前言

最近在看热修复相关的框架,之前我们已经看过了阿里的Dexposed和AndFix这两个框架了,不了解的同学可以点击这里进行查看:Dexposed框架原理解析 和 AndFix热修复框架原理解析,然后还有最近很火的一个是腾讯的Tinker热修复框架,再看他的原理实现的时候,发现了他使用到了开源的文件差分工具bsdiff/bspatch,所以就单独用这篇文章来详细介绍一下这个工具,因为这个工具有一个很大的用途就是增量更新,也就是我们看到现在大部分的应用市场推出的省流量更新应用的效果:

看到了吧,会提示你省了很多流量,按照以前常规的思路就是有应用更新了,就直接把更新的apk包下载然后升级安装,那么如果一个apk包很大,如果在非Wifi情况下还是很耗流量的,但是有时候我们会发现一个应用在升级的时候只是改了部分功能,有些功能并没有改,那么就想了如果要是能直接更新变动的功能的话,那么就会下载数据非常少了。这就需要借助我们几天介绍的这个文件差分工具bsdiff/bspatch了。

二、原理解析

上面的省流量更新原理可以这么理解:服务端可以借助bsdiff工具,比对新旧apk包的文件,获取到差分文件之后下发到客户端,而这个差分文件的大小肯定是小于新的apk文件大小的。客户端得到这个差分文件之后,本地在使用bspatch工具进行差分文件和本地已经安装的旧apk包进行合并成新的apk包文件,然后在进行升级安装。

在这个过程中,客户端在访问服务端的时候可能需要携带旧apk包的md5,应用包名,版本号等信息,服务端获取到之后会去数据库中查询其对应的本次需要升级的apk包以及旧版本号对应的旧apk包,然后进行差分处理得到差分文件,在下发到客户端即可。

三、案例代码分析

上面了解了原理之后,下面就直接看通过源码进行操作吧,前面已经说过了,bsdiff和bspatch这个功能源码是开源的,可以从网上查找,关于他们的源码这里不做太多的介绍,因为是纯C代码,分析起来没什么意思,可以自行阅读即可,因为是纯C语言的,所以如果我们想在Android端使用的话那么就需要使用NDK进行开发了,需要在上层用native方法进行关联访问,这个其实也没什么大的问题,而关于服务端那边进行文件差分操作,这个已经有现成的工具了,也是用C语言编译的可执行文件。所以下面第一步先来解决客户端的NDK开发工作:

第一步:定义native方法

这个native方法还是比较简单的,参数也很容易理解,新旧apk包路径,差分包路径。

第二步:使用javah生成头文件

注意:这里的命令是运行在源码src目录下,采用的类全名方式生成的。会在当前目录下生成对应的头文件:

第三步:新建jni目录

右击项目,选择Android Tools=》Add Native Support,点击下一步即可,在项目中会生成一个jni目录,然后我们把上面生成的头文件拷贝到这里,同时把网上找到的bsdiff和bspatch源码也拷贝到这个目录下:

然后记得添加编译脚本mk文件即可。

第四步:编写native层代码

这里代码非常简单,把上层传递的参数直接传入到applypatch函数中即可,相当于我们什么都不用做。

第五步:使用编译之后的bsdiff工具生成差分文件patch

在这个目录下运行命令:bsdiff.exe demo_old.apk demo_new.apk demo.patch;然后生成了demo.patch文件,我们可以将其拷贝到sdcard目录下。

第六步:客户端编写代码进行差分文件合并

这里通过sdcard目录下的旧apk文件和生成的patch文件进行合并工作,生成新的apk文件,生成之后直接进行升级安装。

注意:这里我们为了懒,把旧apk直接拷贝到sdcard目录了,而在实际开发中我们应该通过系统提供的方法直接获取已经安装应用的apk文件路径的:

四、运行结果

上面的代码已经编写完成了,下面就直接运行即可,会自动编译native的代码:

然后运行结果:

这样就简单实现了应用的增量升级了。而这个技术在后面介绍Tinker框架的时候会涉及到,他内部做了差分文件也是借助这个工具来进行操作的。

项目下载地址:https://github.com/fourbrother/android_diffupdate

五、总结

现在的热修复框架都会涉及到修复文件,而这个文件现在都可能叫做差分文件。就是需要真正修复问题的文件包。这个技术在早期应用市场中的省流量升级已经体现出来了。

android黑科技系列——应用市场省流量更新(增量升级)原理解析的更多相关文章

  1. android黑科技系列——分析某直播App的协议加密原理以及调用加密方法进行协议参数构造

    一.前言 随着直播技术火爆之后,各家都出了直播app,早期直播app的各种请求协议的参数信息都没有做任何加密措施,但是慢慢的有人开始利用这个后门开始弄刷粉关注工具,可以让一个新生的小花旦分分钟变成网红 ...

  2. android黑科技系列——修改锁屏密码和恶意锁机样本原理分析

    一.Android中加密算法 上一篇文章已经介绍了Android中系统锁屏密码算法原理,这里在来总结说一下: 第一种:输入密码算法 将输入的明文密码+设备的salt值,然后操作MD5和SHA1之后在转 ...

  3. android黑科技系列——微信抢红包插件原理解析和开发实现

    一.前言 自从几年前微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  4. android黑科技系列——Apk的加固(加壳)原理解析和实现

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  5. android黑科技系列——Android中新型安全防护策略

    一.前言 最近有一个同学,发给我一个设备流量访问检测工具,但是奇怪的是,他从GP上下载下来之后安装就没有数据了,而在GP上直接安装就可以.二次打包也会有问题.所以这里就可以判断这个app应该是有签名校 ...

  6. android黑科技系列——爆破一款应用的签名验证问题

    一.前言 在之前的文章中说过Android中的安全和破解是相辅相成的,为了防止被破解,很多应用做了一些防护策略,但是防护策略也是分等级,一般简单的策略就是混淆代码和签名校验,而对于签名校验很多应用都是 ...

  7. android黑科技系列——Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)

    一.前言 在之前一篇文章已经介绍了一款网络访问软件的破解教程,当时采用的突破口是应用程序本身的一个漏洞,就是没有关闭日志信息,我们通过抓取日志获取到关键信息来找到突破口进行破解的.那篇文章也说到了,如 ...

  8. android黑科技系列——破解游戏之修改金币数

    我们在玩游戏的时候总是会遇到一些东东需要进行购买的,但是我们可能又舍不得花钱,那么我们该怎么办呢?那就是用游戏外挂吧!我们这里说的是Android中的游戏,在网上搜索一下移动端游戏外挂,可能会找到一款 ...

  9. android黑科技系列——自动注入代码工具icodetools

    一.前言 在前面已经介绍完了 自动给apk中注入日志代码工具icodetools原理了,在那里我们曾经说过其实离真正的可使用价值有点距离,本篇就对这个工具进行一些优化,让其真正意义上开始能工作量产.当 ...

随机推荐

  1. Codeforces Round #469 Div. 2题解

    A. Left-handers, Right-handers and Ambidexters time limit per test 1 second memory limit per test 25 ...

  2. 蓝桥-区间K大数查询

    问题描述: 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个 ...

  3. 手撸HashMap实现

    前言 HashMap是Java中常用的集合,而且HashMap的一些思想,对于我们平时解决业务上的一些问题,在思路上有帮助,基于此,本篇博客将分析HashMap底层设计思想,并手写一个迷你版的Hash ...

  4. Nginx配置文件的高亮显示设置

    linux系统下vim或者vi编辑器默认是没有对nginx的语法高亮设置. 1.下载vi语法高亮配置到 ~/.vim/syntax,如果不存在则创建该目录,cd ~/.vim/syntax wget ...

  5. 第一节:web爬虫之requests

    Requests库是用Python编写的,并且Requests是一个优雅而简单的Python HTTP库,在使用Requests库时更加方便,可以节约我们大量的工作,完全满足HTTP测试需求.

  6. 『REM』手机屏幕适配

    function adapt(designWidth, rem2px){ var d = window.document.createElement('div'); d.style.width = ' ...

  7. 【codeforces 768E】Game of Stones

    [题目链接]:http://codeforces.com/contest/768/problem/E [题意] NIM游戏的变种; 要求每一堆石头一次拿了x个之后,下一次就不能一次拿x个了; 问你结果 ...

  8. Maven学习总结(3)——使用Maven构建项目

    Maven学习总结(三)--使用Maven构建项目 maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的过程. 一.构建Jave项目 1.1.创建J ...

  9. Android传递Bitmap的两种简单方式及其缺陷

    Android传递Bitmap的几种简单方式 一,通过Intent的Bundle. 比如有两个activity,A,B,从A进入B.先在A中将Bitmap写进去: Resources res=getR ...

  10. 清北学堂模拟赛d4t2 b

    分析:比较复杂的一题. 首先要求k个mod m互不相同且和为n的数ai,我们可以转化为求和为k个bi,并且(Σbi) % m = n % m 其中bi=ai % m,接下来可以用dp求出选了i个b,和 ...