背景

我们知道,现在市面上有很多应用助手,比如豌豆荚,360手机助手,应用宝等,这些应用基本上都具有省流量下载功能。
由于现在的安卓应用多而大,并且更新频率快,即使现在随处都有wifi覆盖,但总有时候会使用数据流量,这时如果相更新应用就比较老火啦。
而省流量升级的出现正好可以解决这个问题。


省流量升级介绍

  • 介绍
省流量升级又名增量升级,官方称为Smart App Update
自从 Android 4.1 开始,Google引入了应用程序的增量更新
  • 官方说明
Smart app updates is a new feature of Google Play that introduces a better way of delivering app updates to devices.
When developers publish an update, Google Play now delivers only the bits that have changed to devices, rather than the entire APK.
This makes the updates much lighter-weight in most cases, so they are faster to download, save the device’s battery, and conserve bandwidth usage on users’ mobile data plan.
On average,a smart app update is about 1/3 the sizeof a full APK update.
  • 来看应用宝增量升级


原理

以下以应用宝为例来分析

  • 增量升级与手机OTA升级有相似之处,先来简单说下OTA升级吧,对OTA升级比较了解的略过
OTA差分包主要两个版本(两个版本中间包)之间做差异,生成差分包,使用OTA客户端来应用差分包完成升级
可以看看X_HIKe差分包:\\10.120.10.100\ckt_cd_share\SmartPhone\projects\HIKe\Version\X-HIKe\OTA版本
解压差分包update.zip,里面有大量的*.p文件,这些文件就是生成的差分patch文件,在升级时会将原始文件和差分文件生成新的文件,完成OTA升级
android中提供我们用来制作差分增量升级包的工具-->bsdiff,相关介绍:传送卷,源码路径:external/bsdiff,其中bsdiff.c是二进制文件比对的代码;bspatch.c是二进制文件合成的代码
  • 来看应用包增量升级原理
1.得到差分包,这步操作是在应用宝服务器上完成假设,你的apk已经发布了3个版,1.0,2.0,3.0,这时候你要在后台发布4.0,在你上传时,就应该生成 1.0——>4.0的差异包;2.0——>4.0的差异包;3.0——>4.0的差异包;如果版本相差太大就不建议使用增量升级,类似OTA相差3个以上版本使用OTA Full包升级
2.用户下载差分patch文件到手机
3.获取手机原始版本,并与patch合成新的apk,此时apk与新版本一致看看图=>


实现

原理知道了,但这是如何实现的呢?我们可以来做下测试
下载测试包 [\\10.120.10.100\ckt_cd_share\SmartPhone\team\Framework\UED\yong.zou\Doc\Install_App\smart_app_update.zip]

  • 差分patch如何生成的呢?
生成旧版和新版的差分比patch文件,可以借助bsdiff开源库windows版本,源码在external/bsdiff/bsdiff.c
进入到工具包目录bsdiff4.3-win32下,按照如下图所示执行命令,得到*.patch文件
  • 如何合成新版本apk呢?
使用工具包下的bspatch.exe工具来合成,按照如下图所示来执行命令,得到新包,该包就可以正常安装
  • 合成的包和原始的新包一致,可以通过下图看出来

  • 问题来了,测试都使用bsdiff和bspatch的windows工具包,与我们实际需求不符合啊!!
既然源码里有bsdiff和bspatch,那么一定有可以做成linux版本的bsdiff给应用服务器生成patch用,
而合成patch是由应用宝来完成的,那么可以把bspatch稍加修改封装成so库,给应用包调用即可。可参考Android应用增量升级实现方法
  • 生成patch和合成新包都能实现了,那么还有一个问题需要解决,应用包是如何拿到旧版本的安装包的呢?
我们潜意识里,对于user版本来说,三方app是没办法访问/data/app或/mnt/asec的,但实际上三方应用是可以把/data/app下的app拿出来的。方法如下:
public void backupApp(String packageName, Context mContext) throws IOException{// 存放位置String newFile = Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator;String oldFile = null;try {// 原始位置oldFile = mContext.getPackageManager().getApplicationInfo(packageName, 0).sourceDir;Log.i("zy", "oldFile:" + oldFile);} catch (NameNotFoundException e) {Log.e("zy", "Error:" + e.toString());e.printStackTrace();}System.out.println(newFile);System.out.println(oldFile);File in = new File(oldFile);File out = new File(newFile + packageName + ".apk");if (!out.exists()) {out.createNewFile();Toast.makeText(mContext, "文件备份成功!" + "存放于" + newFile + "目录下", 1).show();} else {Toast.makeText(mContext, "文件已经存在!" + "查看" + newFile + "目录下", 1).show();}FileInputStream fis = new FileInputStream(in);FileOutputStream fos = new FileOutputStream(out);int count;// 文件太大的话,我觉得需要修改byte[] buffer = new byte[256 * 1024];while ((count = fis.read(buffer)) > 0){fos.write(buffer, 0, count);}fis.close();fos.flush();fos.close();}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 想知道为啥我们不能访问/data/app目录,却能把里面的apk拿出来呢,看了下面的图就明白了。

/data/app目录访问不了,但是里面的文件有可读权限啊,哈哈~
通过以上方法的思路可以看出,手机无需root,三方应用一样可以把app给拿出来。

OK,通过以上方法和思路是可以来做app的增量升级的,应用宝最终是不是这个思路就不得而知,但总的说来,这也不失为一个方法。


参考链接

浅析android应用增量升级
增量升级(省流量更新)的Android客户端实现
Android应用增量升级

浅析应用助手省流量升级原理相关推荐

  1. Android应用市场省流量更新(增量升级)原理解析

    一.前言 最近在看热修复相关的框架,之前我们已经看过了阿里的Dexposed和AndFix这两个框架了,不了解的同学可以点击这里进行查看:Dexposed框架原理解析 和 AndFix热修复框架原理解 ...

  2. 浅析Mysql InnoDB存储引擎事务原理

    浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021

  3. Android OTA升级原理和流程分析(五)---update.zip包从上层进入Recovery服务

    转载自:http://blog.chinaunix.net/uid-22028566-id-3533854.html 文章开头我们就提到update.zip包来源有两种: 一个是OTA在线下载(一般下 ...

  4. 12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁

    小陈:呼叫老王...... 老王:来了来了,小陈你准备好了吗?今天我们来讲synchronized的锁重入.锁优化.和锁升级的原理 小陈:早就准备好了,我现在都等不及了 老王:那就好,那我们废话不多说 ...

  5. Android Recovery升级原理

    文章目录 Android Recovery升级原理 声明 摘要 1. Recovery相关概念 2. Android系统的启动模式 2.1 Android 各个分区介绍 2.2 Android的启动模 ...

  6. 振镜可以用计算机控制,浅析喷码机配件激光振镜的原理

    浅析喷码机配件激光振镜的原理 简单的来讲振镜系统是一种由驱动板与高速摆动电机组成的一个高精度.高速度伺服控制系统,主要用于激光打标.激光内雕.舞台灯光控制. 激光振镜简单来讲是用在激光行业的一种扫描振 ...

  7. STM32 IAP 在线升级原理全解析

    点击左上角的"关注",定期更新 STM32 最新资讯,总有你想要的信息! STM32 IAP 在线升级原理全解析 1. 什么是 IAP?    IAP(In-Application ...

  8. WIFI生成助手分销流量主小程序开发

    WIFI生成助手分销流量主小程序开发 前端// WiFi管理: 新建WiFi.累计有效次数统计.-编辑WiFi.搜索WiFi.累计连接次数统计.WiFi空码管理批量新建空码. 佣金管理:查看每日佣金记 ...

  9. BBdoc文件管理助手V1.24升级通知 详见官网:http://www.bbdoc.cn

    BBdoc文件管理助手V1.24升级内容    BBdoc文件管理助手 1.BBdoc名称更改为"BBdoc文件管理助手",官网重大升级,新版本提供商业付费版,详见官网. 2.已支 ...

最新文章

  1. Django——2 路由分配设置 re_path正则匹配 include总路由 url传参 name使用 模板渲染render方法 模板渲染方法...
  2. SAP CRM和Cloud for Customer订单中的业务伙伴的自动决定机制
  3. Python基础教程:Python pass语句详解
  4. 功能Java示例 第3部分–不要使用异常来控制流程
  5. linux 下vim文件乱码 cat文件正常处理方法
  6. 接触线叉环插座行业调研报告 - 市场现状分析与发展前景预测
  7. swfobject简单封装
  8. 突破网络执法官封锁的方法及其原理
  9. [BZOJ2286] [Sdoi2011]消耗战
  10. c语言删除字符串中特定字符串,C语言删除字符串中指定字符的例子
  11. 服务器宕机是什么意思?服务器宕机原因及解决方法
  12. Ceres-Solver使用指南
  13. Unity热更新之AssetBundle打包篇
  14. Ubuntu 下 LaTeX 图形环境的配置——使用Kile
  15. c语言程序 强制关机程序,怎么用C或者C++编写一个电脑强制关机程序
  16. 计算机算法在生物信息学中的应用,生物信息学在系统发育分析中的应用(自己原创) - 生物科学 - 小木虫 - 学术 科研 互动社区...
  17. d3dcompiler_47.dll: Access is denied
  18. 数据结构之中缀表达式转为后缀
  19. 用JS将两个数组的数据合并成一个数组对象
  20. 微软CTO谈AI:逃不掉马拉松就准备好跑鞋!30秒自动化妆机;ChatGPT刷爆票圈;剪纸风格的AI绘画 | ShowMeAI资讯日报

热门文章

  1. 【一致性仿真】Fixed-time bipartite consensus of multi-agent systems with disturbances
  2. JAVA园林公司OA系统计算机毕业设计Mybatis+系统+数据库+调试部署
  3. linux磁盘柱面,linux-磁盘,扇面,柱面,文件系统,硬链接,符号链接,du,df
  4. 通讯录c语言编程按字母分组,iOS - 通讯录开发,名字按拼音首字母分组排序
  5. POJ 2785: four values sum is zero
  6. php微信40037,微信公众号发送小程序模板消息提示40037?。
  7. 华为 S7700 arp 绑定
  8. html邮件css 微信兼容,微信浏览器是移动终端的IE6吗?微信升级内核后的HTML5和CSS3兼容性摘要...
  9. 小程序邀请好友和分享到朋友圈
  10. 斯坦福句法分析 java_斯坦福句法分析