一、前言

最近在看热修复相关的框架,之前我们已经看过了阿里的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. Linux之强大的selinux

    简单点说,SELinux就是用来加强系统安全性的.它给一些特定程序(这些程序也在不断增加)做了一个沙箱,它将文件打上了一个安全标签,这些标签属于不同的类,也只能执行特定的操作,也就是规定了某个应用程序 ...

  2. PHP排序算法之快速排序

    原理:找到当前数组中的任意一个元素(一般选择第一个元素),作为标准,新建两个空数组left.rignt,遍历整个数组元素,如果遍历到的元素比当前的元素小就放到数组left,比当前的元素大放到rignt ...

  3. Pyhon信息采集 - 喜马拉雅专辑歌曲

    目录 Pyhon信息采集 - 喜马拉雅专辑歌曲 Pyhon信息采集 - 喜马拉雅专辑歌曲 setting.py # 喜马拉雅URL XMLY_URL = "https://www.ximal ...

  4. camera placement (paraview)

    # 'renderView1' is the view name# current camera placement for renderView1 renderView1.CameraPositio ...

  5. hdu2012 素数判定【C++】

    素数判定 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. hadoop在线重启namenode+在线扩展集群

    1.执行步骤 修改dfs.namenode.handler.count=150 () NameNode 有一个工作线程池用来处理客户端的远程过程调用及集群守护进程的调用.处理程序数量越多意味着要更大的 ...

  7. [poj1698]Alice's Chance[网络流]

    [转]原文:http://blog.csdn.net/wangjian8006/article/details/7926040 题目大意:爱丽丝要拍电影,有n部电影,规定爱丽丝每部电影在每个礼拜只有固 ...

  8. float在内存中的存放

    一个float型实数在内存中占4个字节,即32个二进制bit,从低位到高位依次叫第0位到第31位.这32位可以分为3个部分:符号位(第31位),阶码(第30位到第23位共8位),尾数(最低23位). ...

  9. C - 剪花布条

    一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?  Input输入中含有一些数据,分别是成对出现的花布条和 ...

  10. cogs 826. [Tyvj Feb11] GF打dota

    826. [Tyvj Feb11] GF打dota ★★☆   输入文件:dota.in   输出文件:dota.out   简单对比时间限制:1 s   内存限制:128 MB 众所周知,GF同学喜 ...