原链接:http://my.oschina.net/jack1900/blog/301330
移动互联网主打的就是用户体验和产品的快速迭代,通过用户反馈和用户行为跟踪及时调整产品方向,这样才能持续保持生命力和创造力。说的接地气点就是,你频繁的升级更新,有时只是修复了几个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
分享到:
相关推荐
<!--AppInterface — 让JSBridge更简单一点 ...方案一应该是目前(或遗留项目)采用最多的方案,方案二是针对iOS9识别不到方案一而采用的打补丁方案,方案三也有不少人在用,方案四与方案五应该是同级的,同时可以
项目有基于 vue 开发的后台管理端和后台服务,还有支持补丁更新的 iOS 和 Android 客户端,从前端到后端,提供了全栈式的解决方案。 用户在后台管理端创建应用,在应用下面上传每个版本的全量包,后台自动生成针对前...
Zulip Mobile是Zulip的官方移动客户端,同时支持iOS和Android。 下载这个软件 该应用的发行版本可在此处获得: 在iTunes App Store上 Google Play商店上的或者,如果您不使用Google Play,则可以从我们在GitHub上...
Xamarin 是一个 App 应用开发平台,提供跨平台开发能力,开发人员通过 Xamarin 开发工具与程序语言,即可开发出 iOS、Android 与 Windows 等平台的原生 App 应用程序,不须分别使用各自平台的开发工具与程序语言。...
描述使用模拟的本机 GUI 在 iOS 上运行您的补丁。 受 Chris McCormick 的 Android 和(现已解散)原始 RjDj 应用程序的启发。 (图片来自 PdDroidParty)用户指南和作曲家包转到& 下载PdParty Composer Pack ,其中...
Android Native App集成React Native 详情浏览: : React Native与Android通信 详情浏览: : React Native实现热部署,增量热更新 详情浏览: : React Native(最新版本)实现JsBundle预加载,界面秒开优化 详情...
相比于iOS两三天就能达到80%的覆盖速度而言,Android应用版本升级至少需要两周才能达到80%的升级率,严重阻碍了版本迭代速度。也导致,处理bug和投诉等也越来越麻烦。这几个问题是每个App开发同学都必然要面对的。...
Q4:怎么 Android SDK 还需要更新、下载? A4:原版如此;基于国情,直接集成了一个“够用的”(编译工具、虚机映像,但不包括文档、例子);也可以使用 swish 提供的 Android SDK 23.3.4:...
目前已在Linux / Windows上进行了测试,其他平台(如android / ios)也应该可以。 srs-librtmp 基于srs 2.0release,作为单个文件导出,添加了一些平台指定的适应性。 看 SrsQuic/trunk/out/srs_librtmp.h SrsQuic/...
修复 android和ios二维码扫描下载app问题 修复 前台套餐排序字段无效 修复 发布职位默认勾选中接收简历短信通知 修复 简历二维码生成问题 修复 简历详情页自动识别PC/触屏端 修复 触屏版链接错误问题 修复 企业刷新...
例如,您可能要强制所有主要版本更新,但向用户提供选择更新或跳过次要版本或补丁版本的选项。 您还可以指定要在更新发布后多少天显示警报。 先决条件 您需要添加appversion插件才能使该插件正常工作: tns ...
推送插件用于NativeScript... 通过更改应用程序ID以匹配package.json中的包标识符,编辑app/App_Resources/Android/app.gradle文件。 例如: android { // ... defaultConfig { applicationId = " org.nativescript.
只需派生项目,分支并在补丁准备好后提交拉取请求即可。 如果有必要进行任何更改,我们将通过PR注释指导您完成所需的步骤,或者可能要求您直接访问进行评论。 如果您希望成为项目开发人员(允许在项目上创建分支...