如果app依赖本地更新,更新比较频繁的话,每次更新都要让用户下载完整安装包,用户体验会比较差。目前,很多应用商店都实现了apk的增量更新

  • 正常apk更新逻辑:
  1. 打包V1.0版本,大小30M,用户安装完成
  2. 更新V1.1版本,大小31M,上传服务器得到远程链接,用户打开app收到更新提示,下载V1.1的apk,覆盖安装,更新完成
  • 增量更新apk逻辑
  1. 打包V1.0版本,大小30M,用户安装完成
  2. 更新V1.1版本,大小31M,上传服务器得到远程链接 https://www.abc.com/apk/V1.1.apk
  3. 对比V1.1和V1.0,生成差异包 V1.1_1.0.patch ,上传服务器得到远程链接 https://www.abc.com/apk/V1.1_1.0.patch
  4. 用户打开app收到更新提示,获取到patch和apk两个链接,下载patch文件(当然需要做判断,比如V1.1_1.0,需要判断当前安装的是否是1.0版本)
  5. patch文件和本地当前版本apk文件进行合并,生成新的apk文件
  6. 安装新的apk文件
  7. 以上步骤如果出现异常,就再下载安装包执行正常apk更新逻辑;

一、 差异包生成

使用bsdiff工具生成差异包。链接 http://www.daemonology.net/bsdiff/
但是官网好像无法下载了,已经备份了百度网盘 链接:https://pan.baidu.com/s/1SyGG_wsbaPbwHB0d0gwHOA
提取码:8888

准备V1.0和V1.1版本的apk:

使用命令:

bsdiff oldfile newfile patchfile

生成新包。

二、 安卓端代码

1.创建工程,配置好ndk环境

2.添加BSPatchUtil

代码如下:

package com.dxl.testbatch.utilobject BSPatchUtil {/*** @param basePath      基础文件* @param syntheticPath 合成的目标文件* @param patchPath     合成所需要的差分文件* @return main 返回值*/@JvmStaticexternal fun bspatch(basePath: String, syntheticPath: String, patchPath: String): Intinit {System.loadLibrary("bspatch")}
}

3.添加bspatch对应的C代码,我已经整理好了,地址链接:​​​​​​https://pan.baidu.com/s/1czefBklPWz_0zSmS8Zb0AQ
提取码:8888

注意:需要修改bspatch.c文件中的Java_com_dxl_testbatch_util_BSPatchUtil_bspatch方法签名:改为BSPatchUtil 的包名,例如BSPatchUtil对应的路径为com.dxl.testbatch.util.BSPatchUtil,那么native方法签名就是Java_com_dxl_testbatch_util_BSPatchUtil_bspatch

目录结构如下:

4.修改app build.gradle

5.make project

6.测试

    override fun onTouchEvent(event: MotionEvent?): Boolean {if (event?.action == MotionEvent.ACTION_UP) {//当前apk路径,实际开发中用这个,当前没有使用val sourceDir =packageManager.getApplicationInfo(BuildConfig.APPLICATION_ID, 0).sourceDirval file = File(sourceDir)thread {val old = getExternalFilesDir("apk")!!.absolutePath + "/239.apk"val new = getExternalFilesDir("apk")!!.absolutePath + "/new.apk"val patch = getExternalFilesDir("apk")!!.absolutePath + "/1.patch"val time = measureTimeMillis {BSPatchUtil.bspatch(old, new, patch)}runOnUiThread {Toast.makeText(this, "打包成功,用时$time~", Toast.LENGTH_SHORT).show()}}return true}return super.onTouchEvent(event)}

6.生成so包

编译一次之后,会自动生成so文件,路径如下:

将指定的so文件移动到指定目录中:

删除build.gradle中添加的编译配置

   externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"}}

删除cpp目录,重新编译即可。

代码:https://github.com/limpid100/TestBatch
参考: bspatch tools for android https://github.com/krmao/bspatch
Android增量更新原理和实践 Android增量更新原理和实践 - 简书

转载于:https://www.jianshu.com/p/853af8224648

Android 增量更新实现相关推荐

  1. android cpp做成so库,Android增量更新(二)—制作合成文件so库

    ###前言 在上节中,我们已经学习了`Android增量更新`的实现原理,那么在Android开发的移动端,我们需要涉及到的其实是`文件合成`的这个流程. 那么,今天就来讲讲增量更新合成流程的实现吧. ...

  2. Android增量更新框架

    Android增量更新框架 框架介绍 功能简介 简易效果图 增量更新配置 快速使用 Api详解 项目地址 框架介绍 功能简介 Android App更新框架,包含增量更新.多线程下载等功能.一句代码链 ...

  3. android中热更新模式,热更新再牛,也少不了Android 增量更新

    码个蛋(codeegg)第 785 次推文 作者: C_YQ 原文: https://juejin.im/post/5da845cdf265da5b7244c63e 码妞看世界 接骨草~ 虽然没有增量 ...

  4. Android 增量更新实例(Smart App Updates)

    http://892848153.iteye.com/blog/2022851 转自:http://my.oschina.net/liucundong/blog/160436 目录[-] 官方说明 实 ...

  5. Android增量更新——bsdiffbspatch

    原址 现在公司对于app增量更新的需求越来越多,因为增量更新不仅仅可以节省流量,更重要的一点是减少用户更新app的时间,有益于用户体验.    这篇文章将介绍运用patch差分包的形式实现增量更新.为 ...

  6. Android 增量更新

    随着社会的发展,虽然对于一个用户而言,流量不值钱,每个用户的手机会有多少个G的流量,或者不限制流量,或者经常使用wifi.所以目前在Android端流量的优化,可能没有那么重要了.但是当我们的用户更新 ...

  7. android增量更新详细解读

    1 增量更新的意义 a 神马是增量更新? 这个概念很早就被提出,但是目前的形式,小厂用的很少,大厂用的比较多:企鹅的QQ和微信里面都有增量更新着玩意:到底神马是增量更新? 首先增量更新主要用于新版本a ...

  8. Android 增量更新完全解析 是增量不是热修复

    本文在我的微信公众号:鸿洋(hongyangAndroid)首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/5276165 ...

  9. android差分升级原理,BigNews Android 增量更新框架差分包升级 @codeKK c开源站

    支持增量包/差分包/升级包 原理:在服务器端使用 bsdiff 工具将新老安装包的差异打包为一个体积较小的差分包/升级包,然后在 App 端通过 bspatch 工具(和 bsdiff 配套的)用差分 ...

最新文章

  1. 网络慢是带宽不足?优化网络带宽的5个小窍门
  2. JavaScript的Cookie操作
  3. 2018 亚太数学建模大赛B题解题思路
  4. oracle 同义词_Oracle迁移到MySQL,必须要搞明白这几个问题
  5. 多模光纤收发器的应用领域及适用领域
  6. django 模板两次for循环_Django模板之基本的 for 循环 和 List内容的显示方式
  7. php实现git服务器,如何搭建和配置Git服务器
  8. Android问题-selection contains a component,button7,introduced in an ancestor and cannot be deleted....
  9. 转 java synchronized详解
  10. 南邮ctf mysql_南邮ctf知识点汇总 - Crypto篇
  11. 国外工程师这样分析女人
  12. 如何正确卸载天锐绿盾客户端
  13. 通达信标记符号_通达信49个图标,高手指教,通达信软件里的股票标记符号,能增加吗...
  14. mybatis + spring + PostgreSQL使用中的问题一例
  15. Apache Flink®极简教程: 架构及原理 Stateful Computations over Data Streams
  16. CentOS 7 时区设置
  17. AI人才缺口上百万:应届生年薪50万!计算机相关专业就业情况大盘点!
  18. hdu 校赛 油菜花王国
  19. 期货开户公司行情资讯及时高效
  20. ZooKeeper源码分析之完整网络通信流程(一)

热门文章

  1. 这一波人工智能泡沫将会怎么破灭?
  2. Comparator 接口中方法里面的 (ComparatorT Serializable) 是什么意思?
  3. 数字图像处理: 一 (上交)
  4. H.264/AVC 片——slice
  5. LV4500R二维码扫描器在酒店入住自助机的应用案例,打造高效快速的扫码入住体验
  6. 大数据 是把“双刃剑”
  7. 微信公众号添加关注后自动回复图文信息(素材)
  8. 计算机网络线上复试,线上复试实锤?在线复试技巧拿走不谢!
  9. 2020福布斯中国富豪榜公布前20
  10. 一个文件的开源项目,开启你的开源之旅