Android App补丁更新

上一周比较忙,忙的不可开交,写的文章也就两篇,在此希望大家见谅。这周呢,突然闲下来了,有时间了,就重构了下代码,捣鼓点前卫的技术,沉淀沉淀。所以呢,今天就分享下这几天研究的东西。

移动互联网主打的就是用户体验和产品的快速迭代,通过用户反馈和用户行为跟踪及时调整产品方向,这样才能持续保持生命力和创造力。说的接地气点就是,你频繁的升级更新,有时只是修复了几个bug或者微调了下界面,就让用户下载10几兆甚至更大的apk,而且在目前国内这个4G还不是普及的时候,对用户来说是很不友好的。有没有这样一种策略呢,就如windows系统上打补丁一样,通过体积比较小的补丁来完善系统存在的bug或者新功能的实现,如果可以实现的话,用户就再不会苦着脸去更新app了。答案是肯定的,要实现这个功能,需要以下两个步骤。

一、比对新版本与老版本之间的差异,最好只下载差异的部分

思路很简单,也非常清晰,那我们就照着这个目标行进。apk本身其实是一个zip压缩包,你改下后缀名,再双击解压就能得到apk内部的编译打包后的文件,图片音频等文件是直接可以可读的,其他的就得通过反编译工具去查看了。所以我们应用的安装文件apk就是一个二进制文件,如何得到两个二进制文件的差异文件---差异包呢?好消息是已经有前人实现了,它的名字bsdiff,一个差异包比较工具,全称是binary diff,二进制差异的意思。通过bsdiff,我们就能得到两个apk的差异包了,下面我会把整理的命令文件打包到代码中上传Github上供大家使用的。bsdiff为我们提供的仅是一组用C实现的代码,需要自己去编译构建,我已经为大家准备了windows、OSX、Linux不同平台下使用的命令。

由于我的电脑是macbook,执行命令如下

执行命令之后,得到xx.patch,我们下面要下载的就是这个差异包。根据不同版本之间的差异,相对整个apk来说,差异包的体积会小很多。同时如果你的应用老版本有多个的话,你就需要生成对应的多个差异包。如果要想生成的流程自动化的话,找后台的哥们配合下就能轻松解决。

二、手机本地下载差异包,再和旧版本apk进行合并,最后合并成新版本apk。

根据当前版本号,向服务器发起请求,就得下载到对应的差异包。下面就是旧版本apk和patch合并的一步了,由于java本身并没有提供相应的api,我们需要C去帮助实现,然后生成.so包进行调用。相对于生成差异包的bsdiff,也给提供了另一个bspatch,这个就是帮助我们进行文件和平的。如果要在Android中实现这一步,就需要去配置NDK的开发环境了,如果不想的同学可以直接把demo里面的.so文件拿出来用。调用下面的这个方法就可以实现文件的合并

合并出的apk文件,与最新的安装包并无区别,具有同样的特征值。最后通过Intent进行安装。

写在最后:有可能有的用户所使用的版本比较老,与最新的apk相差很大的话,还是建议根据生成差异包的大小进行判定是否去直接下载apk进行更新。同时根据不同版本对应不一样的差异包,和后端的小伙伴合作去自动化生成的话,大大减少了生成差异包时间上的浪费。最后如果只是修复关键性bug或者几个新需求的添加,产生的差异包会很小,也会大大的减少了用户的下载时间和流量消耗。

源码地址:https://github.com/JackCho/AndroidPatchUpdate

如果觉得对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享(ID:android_share)。下面是微信的二维码,为你提供及时高质的Android干货。

Android App补丁更新,布布扣,bubuko.com

时间: 2024-12-22 02:03:33

Android App补丁更新的相关文章

开源 Android App 增量更新库 版本升级

开源 Android App 增量更新库 版本升级 经过几天的重构,我将之前写的一个Android 应用增量更新的示例程序重构为了一个开源库,现在已经push 到 GitHub 上,欢迎大家Watch.Star.Fork. 包含以下内容: 服务器端生成差异包的工程:AppUpdate 客户端使用的开源apk合并库:ApkPatchLibrary 引用ApkPatchLibrary,实现增量更新的ApkPatchLibraryDemo 旧版本的微博Android客户端,以及服务端生成的新旧微博差分

android app内部更新适配到8.0

app 内部跟新是app中必须要有的功能,在app出现改变时,app内部更新能以最快的速度将应用提升到最新版本. 步骤: 1.获取本地app的版本号 int versionCode = 0; try { // 获取软件版本号, versionCode = this.getPackageManager().getPackageInfo( getPackageName(), 0).versionCode; } catch (NameNotFoundException e) { e.printStac

Android热补丁动态更新实践

前言 好几个月之前关于Android App热补丁修复火了一把,源于QQ空间团队的一篇文章安卓App热补丁动态修复技术介绍,然后各大厂的开源项目都出来了,本文的实践基于HotFix,也就是QQ空间技术团队那篇文章所应用的技术,笔者会把整个过程的细节和思路在文章中详说,研究这个的出发点也是为了能紧急修复app的bug,而不需要重复发包,不需要用户重新下载app就能把问题解决,个人觉得这个还是蛮有价值的,虽然老板不知道-.. 项目结构 这里笔者创建一个新的项目"HotFixDemo",带大

[FMX] Android APP 启动黑屏优化补丁

使用说明 *************************************************** Android APP 启动黑屏优化补丁 作者: Swish, YangYxd 2016.01.16 Version: 1.0.0 QDAC官方群: 250530692 *************************************************** [安装方式] 双击Setup.bat安装补丁文件(安装时会作备份) 双击Uninstall.bat可以恢复. [

解决android SDK不能更新,appium测试混合app无法返回webview问题

问题:1.connection to the server is unsuccessful(file:///www/asset/index.html)(原因:android系统问题,需要更新)2.appium测试混合app,没有返回webview(原因:主要由于android版本问题,需要原生系统android4.4)3.android SDK不能更新package 4.android SDK中extra文件更新失败问题 解决:一.更新sdk,步骤如下:1.修改hosts文件打开c:/windo

Android实现APP自动更新功能

现在一般的android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新.该小程序实现的就是这个功能. 该小程序的特点是,当有更新时,会弹出一个提示框,点击确定,则在通知来创建一个进度条进行下载,点击取消,则取消更新. 以下是详细代码: 1.创建布局文件notification_item.xml,用于在通知栏生成一个进度条和下载图标. <?xml version="1.0" encoding="utf-8"?>

6盘(清真云)Android APP 测试版 20181011 每日更新

Android APP 20181011 Daily Build 修复: -  用户无法注册 - 注册用户无法登录 - 下载大文件崩溃问题 - 新用户报错 parent directory not found 新增: - 下载时选择文件夹 延后处理问题 - 离线任务删除 原文地址:https://www.cnblogs.com/6pan/p/9772977.html

Android 热补丁实践之路

大约在15年下半年开始,热补丁方案开始大量涌现,一时间热补丁修复技术在 Android 圈非常火爆,比较有代表性的开源实现有 Dexposed.AndFix.Nuwa 以及前段时间微信开源的 Tinker,至于他们的原理以及优缺点比较并不是本文要讲的,网上已经有一大堆资料进行介绍了,感兴趣的可以看下这几篇文章: 安卓App热补丁动态修复技术介绍 Android热补丁之AndFix原理解析 Instant Run工作原理及用法中文翻译稿 从Instant run谈Android替换Applicat

Android 热补丁技术——资源的热修复

前言 今年真是热补丁框架的洪荒之力爆发的一年,短短几个月内,已经出现了好几个热修复的框架了,基本上都是大同小异,这里我就不过多的去评论这些框架.只有自己真正的去经历过,你才会发现其中的 大写的坑 事实上,现在出现的大多数热修复的框架,稳定性和兼容性都还达不到要求,包括阿里的Andfix,据同事说,我们自己的app原本没有多少crash,接入了andfix倒引起了一部分的crash,这不是一个热修复框架所应该具有的"变态功能".虽然阿里百川现在在大力推广这套框架,我依旧不看好,只是其思路