linux 二进制差分工具,打造Android万能的软件更新库
今日科技快讯
阿里星球今天在苹果商店发布的更新动态显示,其将在近期停止APP内的音乐服务,用户可以通过新版本内的指引和说明,导出本地音乐。这意味着上线八个月后,阿里星球做出了一个重大决定:停止音乐服务后,这款由天天动听改版而来、承载了阿里音乐铁三角期望的APP,将彻底与音乐播放器功能告别。
作为宋柯、高晓松以及何炅加盟阿里音乐后准备了大半年推出的平台,阿里星球承载了阿里音乐铁三角对音乐业务的重要期望,但从结果来看并不如人意。上线之初,阿里星球便遭遇大量用户差评。作者简介
本篇来自 hcy 的投稿,分享了他自己封装的软件更新工具。希望能帮助到有需要的朋友。
hcy的博客地址:http://blog.csdn.net/huang_cai_yuan
概述
软件更新功能可以说是APP的标配。以前实现这个功能的时候,自己一行一行代码重复撸,浪费时间。所以我决定实现一个万能的可复用的更新库。让它支持增量更新、全量更新、静默安装、普通方式安装、可以自定义UI。下面就来介绍一下我实现这个库的主要技术点:增量更新、静默安装及如何封装。
软件增量更新处理流程
服务端处理流程
1.验证请求的合法性。
2.如果请求不合法(比如请求是模拟的,非客户端发出的),则拒绝服务。
3.如果请求合法,获取versionCode等信息,根据versionCode判断软件是否更新。
4.如果不需要更新,则返回对应信息。
5.如果需要更新,获取与versionCode对应的客户端文件的MD5,判断该MD5值是否在历史版本文件的MD5列表中,如果在说明支持增量更新。
6.如果不支持增量更新,则返回完整apk文件的下载链接。
7.如果支持增量更新,判断对应的patch文件是否存在。
8.如果对应的patch文件不存在,调用脚本程序生成对应的patch文件,并返回该patch文件的下载链接。
9.如果对应的patch文件存在,则返回该patch文件的下载链接。
客户端处理流程
1.收集apk的基本信息,向服务端发送更新请求。
2.如果没有更新,则做对应的提示操作。
3.如果有更新,判断是否是增量更新还是全量更新。
4.如果是全量更新,则下载对应的apk文件,展示相应的UI,安装apk即可。
5.如果是增量更新,则下载对应的patch文件,展示相应的UI,然后提取客户端的apk文件到指定目录并与patch文件合并成一个新的apk文件,判断新合成的apk文件是否与从服务端获取的完整的apk文件MD5的值一致,若一致说明合成成功,安装新合成的apk文件即可,若不一致说明合成失败,进行安装失败的提示。
增量更新的实现
通过上面的处理流程分析,我们发现实现增量更新的难点主要在于patch文件的生成、新apk文件的合成这两个部分。这里借助开源的bsdiff来实现这两部分的功能。
1.下载二进制差分、合并工具
增量更新的实现用到第三方库bsdiff
http://www.daemonology.net/bsdiff
该库依赖:bzip2
http://www.bzip.org/downloads.html
bsdiff 目前支持Linux、Windows,同时也有Python版本的源码。
2.服务端patch文件的生成
服务端可以根据需要,选择对应的版本进行 patch文件 的生成,比如 Windows版本 的生成方式如下:
同时按住Shift+右键,选择“在此处打开命令窗口”,执行命令bsdiff old.apk new.apk patch.patch即可生成patch包,至于脚本怎么执行这些命令,请读者自行发挥。
3. 客户端新apk的合成实现
点击条目1中的链接,下载linux版本的源代码,同时下载bzip2的源代码,文件目录结构如下:
接着将bsdiff.c、bspatch.c文件中的main方法改成 diff、patch
然后编写jni代码,调用bsdiff和bspatch的diff、patch方法
接下来,在外层的Android.mk文件中编写 makefile脚本(gradle里面编译jni我不熟,哈哈哈,还是makefile用着习惯),将bsdiff、bzip2编译成静态库,同时引入 子目录的Android.mk文件。
在jni_bsdiff目录下面的Android.mk 文件中编写生成我们要用的动态库的脚本如下
再接下来,在build.gradle里面编写编译脚本即可:
如果不出意外我们的 libbsdiff_utils.so就可以生成了。然后我们编写Java层的调用代码:
新apk文件的合成我们要用到的是patch方法,它的参数 oldPath表示 当前apk的文件路径,newPath表示 合成后的apk文件路径,patchPath则为 下载的增量包的路径。
oldPath的取值,比较稳妥的做法是把当前安装的apk文件拷贝到一个可读可写的目录,防止bspatch对已安装的apk文件产生破坏。附上获取当前apk文件的路径的代码:
静默安装实现
静默安装这里采用pm install 命令实现,因此应用需要获取到Root权限才能执行成功。
封装
为了打造一个可复用的软件更新库,这里根据软件更新的流程抽象了五个接口,流程与接口的对应关系如下:更新检测(UpdateChecker)
更新检测后的UI提示(UpdateCheckUIHandler)
更新文件下载(Downloader)
文件下载时的UI提示(DownloadUIHandler)
安装文件(AppInstaller)
如果使用者发现哪一步不符合自己的需求,只要实现这个步骤的接口并注入到全局配置中即可,从而实现“万能”的软件更新功能。
具体实现,请参照源码:https://github.com/Money888/LibUpgrade.git
更新库的使用
第一步,在 Application.onCreate 方法中进行初始化
@Override
public void onCreate() {
super.onCreate();
LibUpgradeInitializer.init(this);}
第二步,配置更新库功能
第三步,启用更新检查功能
//此处的Context默认必须为ActivityUpdater.getInstance().check(this);
自定义功能扩展使用
1. 增量更新
2. 全量更新
3. 强制更新
4. 普通安装模式
5. 静默安装模式
6. 修改更新时的提示UI
7. 修改文件下载时的UI
其它二进制差分及合并工具xdelta3
http://xdelta.org/xdelta3.htmljavaxdelta
http://javaxdelta.sourceforge.netcourgette
https://chromium.googlesource.com/chromium/src/courgette更多
每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。
linux 二进制差分工具,打造Android万能的软件更新库相关推荐
- 视频教程-FFmpeg打造Android万能音频播放器-Android
FFmpeg打造Android万能音频播放器 从事Android移动端开发多年.主导开发过直播.电商.聊天等各种类型APP和游戏SDK:熟悉Android音视频开发.底层NDK开发等:有开源项目:ht ...
- deepin linux截图,Linux Deepin 截图工具将入驻Debian/Ubuntu软件中心
Linux Deepin 截图工具,deepin screenshot,是专为 Linux 用户打造的一款截图工具,目前已默认搭载在 Linux Deepin 11.12(2011年 12月 30日发 ...
- Linux二进制实用工具Binutils工具集解析()
From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/softwa ...
- linux 二进制编辑工具,bz1621.lzh linux
Bz1621.lzh软件是款专业的二进制编辑软件.使用这款软件的人都应该看过<30天自制操作系统>这个书,它就是里面用到的编辑器,功能简单实用,对于刚学习编程的人来说非常不错. [使用方法 ...
- 打造Android万能下拉刷新上拉加载控件
转载请注明出处:http://blog.csdn.net/binbinqq86/article/details/70159782 关于列表刷新加载的自定义控件,网上数不胜数,但别人的用起来始终不是那么 ...
- Android 毛小软件,毛库官方app
毛库官方APP带给大家啦,一款全新上线的薅羊毛应用,只需要通过虚拟喂羊就可以创造收益,羊种类很多,玩法较为新奇.毛库APP全新上线,应用设计较为美观,创新元素较多,微信登录授权就可以提现,感兴趣的朋友 ...
- Android友盟增量更新
1.增量升级的原理 增量更新的原理就是将本地apk与服务器端最新版本比对,并得到差异包.比如现在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M.我们发现两个版本只有0.1M的 ...
- android+仿友盟更新,android友盟增量更新
1.增量升级的原理 增量更新的原理就是将本地apk与服务器端最新版本比对,并得到差异包.比如现在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M.我们发现两个版本只有0.1M的差 ...
- 使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放
前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over1 ...
最新文章
- gif 图片制作和拆解
- iOS快速开发框架Bee-Framework应用和解析(三) - Message, Model, Signal
- Spark SQL之DataSet
- NFS部署及优化(一)
- 能够使用StringBuilder类的常用方法操纵字符串 1215
- 160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- 【caffe-windows】 caffe-master 之 卷积核可视化(利用matlab)
- C#的变量、数据类型转换、转义符
- [转载] c++与python 数据类型对应
- c#语言asp.net实现treeview控件读数据库动态生成树的代码
- mike21 matlab tools,Mike post process with Matlab toolbox
- xshell 5安装教程
- chmod 755 filename
- 笔记本计算机在桌面显示,笔记本电脑开机后不显示桌面该怎么处理
- linux lighttpd,linux下lighttpd服务器的详细安装步骤 以及对flv流媒体的支持配置
- elasticsearch collapse
- SICP中关于兑换零钱的练习
- 关于德鲁伊数据源配置的记录
- 一个月裂变50多万人?商城引流模式玩法——分享购
- OpenCV竟然可以这样学!成神之路终将不远(六)
热门文章
- Vaadin 10+作为CUBA UI的未来
- java中hashmap_HashMap如何在Java中工作
- apache camel_Apache Camel中的断路器模式
- 探索适用于Apache Spark的Spline Data Tracker和可视化工具(第2部分)
- 使用一个命令执行单个Java源文件
- glassfish 4配置_自己构建GlassFish 4.0快照
- GC解释:收集器概述
- 是否可以在最终课程中使用抽象方法?
- gradle maven_Gradle – Maven的观点
- Spring Cloud Zuul支持–配置超时