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版本 的生成方式如下:

98751425_2

同时按住Shift+右键,选择“在此处打开命令窗口”,执行命令bsdiff old.apk new.apk patch.patch即可生成patch包,至于脚本怎么执行这些命令,请读者自行发挥。

3. 客户端新apk的合成实现

点击条目1中的链接,下载linux版本的源代码,同时下载bzip2的源代码,文件目录结构如下:

98751425_3

接着将bsdiff.c、bspatch.c文件中的main方法改成 diff、patch

然后编写jni代码,调用bsdiff和bspatch的diff、patch方法

98751425_4

98751425_5

接下来,在外层的Android.mk文件中编写 makefile脚本(gradle里面编译jni我不熟,哈哈哈,还是makefile用着习惯),将bsdiff、bzip2编译成静态库,同时引入 子目录的Android.mk文件。

98751425_6

在jni_bsdiff目录下面的Android.mk 文件中编写生成我们要用的动态库的脚本如下

98751425_7

再接下来,在build.gradle里面编写编译脚本即可:

98751425_8

如果不出意外我们的 libbsdiff_utils.so就可以生成了。然后我们编写Java层的调用代码:

98751425_9

新apk文件的合成我们要用到的是patch方法,它的参数 oldPath表示 当前apk的文件路径,newPath表示 合成后的apk文件路径,patchPath则为 下载的增量包的路径。

oldPath的取值,比较稳妥的做法是把当前安装的apk文件拷贝到一个可读可写的目录,防止bspatch对已安装的apk文件产生破坏。附上获取当前apk文件的路径的代码:

98751425_10

静默安装实现

静默安装这里采用pm install 命令实现,因此应用需要获取到Root权限才能执行成功。

98751425_11

封装

为了打造一个可复用的软件更新库,这里根据软件更新的流程抽象了五个接口,流程与接口的对应关系如下:更新检测(UpdateChecker)

更新检测后的UI提示(UpdateCheckUIHandler)

更新文件下载(Downloader)

文件下载时的UI提示(DownloadUIHandler)

安装文件(AppInstaller)

如果使用者发现哪一步不符合自己的需求,只要实现这个步骤的接口并注入到全局配置中即可,从而实现“万能”的软件更新功能。

具体实现,请参照源码:https://github.com/Money888/LibUpgrade.git

更新库的使用

第一步,在 Application.onCreate 方法中进行初始化

@Override

public void onCreate() {

super.onCreate();

LibUpgradeInitializer.init(this);}

第二步,配置更新库功能

98751425_12

第三步,启用更新检查功能

//此处的Context默认必须为ActivityUpdater.getInstance().check(this);

自定义功能扩展使用

1. 增量更新

98751425_13

2. 全量更新

98751425_14

3. 强制更新

98751425_15

4. 普通安装模式

98751425_16

5. 静默安装模式

98751425_17

6. 修改更新时的提示UI

98751425_18

7. 修改文件下载时的UI

98751425_19

其它二进制差分及合并工具xdelta3

http://xdelta.org/xdelta3.htmljavaxdelta

http://javaxdelta.sourceforge.netcourgette

https://chromium.googlesource.com/chromium/src/courgette更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lambda 分类聚合_使用Java 8 Lambda,流和聚合

lambda 分类聚合总览 在本文中,我们将介绍使用Java 8 lambda,流和聚合来过滤和处理Collection中的对象。 这篇文章中的所有代码都可以在此处的 BitBucket中找到 。 对于此示例,我们将创建许多对象,这些对象代表我们IT基础架构中的…

linux镜像文件不要大于4g,Systemback制做大于4G的Ubuntu系统镜像

1 安装Systemback依此执行以下命令。sudo apt-get updatesudo add-apt-repository ppa:nemh/systembacksudo apt-get update && sudo apt-get install systemback unionfs-fuse安装完成:2 使用Systemback生成镜像文件输入管理员密码,打开后界面以…

黑马2016java_2016年成功的Java开发人员简介

黑马2016java2015年即将结束。 现在该总结过去一年中已完成的工作和未完成的工作。 此外,现在是预测下一个2016年的好时机。 您已经猜到这篇文章是关于2016年理想的Java开发人员的。 我想给你一个惊喜,这次我更改了预测的格​​式。 为了使预测更加客观…

spring一站式开发_Spring开发人员知道的一件事

spring一站式开发在最近的(核心)Spring框架培训课程中,有人问我:“(Java)Spring开发人员应该知道的一件事是什么?” 这个问题使我措手不及。 是的,(核心)Spri…

jax-ws和jax-rs_带有JAX-WS和Spring的Web服务应用程序

jax-ws和jax-rs1.简介 这是一个漫长的等待,但是我最终要发布有关使用Spring创建第一个基于SOAP的Web服务应用程序的教程。 JAX-WS (用于XML Web服务的Java API)是用于以XML格式创建Web服务的一组API,我们最常将其称为基于SOAP的We…

eclipse开发jsf_在Eclipse上创建JSF / CDI Maven项目

eclipse开发jsf当我在研究JSF和CDI示例时,我认为提到创建JSF和CDI Maven项目所需的步骤会很有用。 您可以找到以下步骤。 工具类 默认情况下,M2E插件随附的Eclipse Luna。 因此,无需自己安装插件。 WildFlye8.x。 从主菜单中选择文件->…

apache camel_Apache Camel的性能调整思路

apache camel时不时地,我会以Camel速度较慢的观点来询问有关优化Camel应用程序的问题。 骆驼只是连接不同系统的粘合剂,路由引擎全部在内存中,并且不需要任何持久状态。 因此,在99%的情况下,性能问题是由于…

xmanager linux,教您用xmanager启动Linux上的图形界面程序-Go语言中文社区

对于习惯实体化的开发人员来说,还是界面化用着比较习惯,所以这就涉及到掌握使用Xmanager启动Linux上的图形界面程序,为了方便大家的使用,本集小编就详细的为大家讲解具体操作。具体步骤如下:1、首先下载Xmanager并安装…

android开发 文件分享到应用,Android 实现文件分享功能(共享多个文件)

效果如图:神一样的代码:针对image代码如下:IntentsharenewIntent(Intent.ACTION_SEND);share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));//此处一定要用Uri.fromFile(file),其中file为File类型,否则附件无法发送成功。s…

android 4.4.2截屏方法,android4.4.2 使用 uiautoviewer 截屏报错

1、正常启动后,使用 uiautomatorviewer 没有问题2、由于要使用 uiautomator,每次启动 uiautomator 服务后再使用 uiautomatorviewer 就会图片错误,启动 uiautomator 服务的步骤如下:1、Download jar files from uiautomator jsonr…

javaone_JavaOne 2015:为JDK 9做准备– blog @ CodeFX

javaoneJavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的,并且充满了宝贵的信息,我敦促每个Java开发人员都注意它们。 除此之外,我想给社区一种搜索和引用它们的方法,因此我在这里总…

kafka spark_您在2016年会做什么? Apache Spark,Kafka,Drill等

kafka spark让我们玩得开心。 这是新的一年的开始-我们正处于新事物的门槛上-因此让我们期待您在2016年可能会做的事情。现在我知道做出预测的风险,尤其是有记录的预测,但是我很高兴您能在一年后回访,看看我对2016年的预测是如何完成的。 您…

android ini文件格式,ini是什么格式的文件?ini文件怎么操作?

类型:Android平台大小:622KB语言:中文 评分:5.0标签:立即下载ini文件主要存放用户所做的选择以及系统的各种参数。用户可以通过修改INI文件,来改变应用程序和系统的很多配置。自定义一个文件,会成一个deskt…

华为p6电信版 android 4.5,华为P6电信版系统应用apk补全教程 完整EMUI

现在要说的是华为P6电信版的系统应用apk补全教程,给你一个非阉割版的完整EMUI系统。大家应该都知道,电信定制版由于华为系统服务与电信的定制APP功能重叠,语音助手、云同步、云端备份、手机找回等系统应用apk全被“阉割”掉了,这几…

黑马ee在职进阶视频_进阶– Java EE 7前端5强

黑马ee在职进阶视频系列继续。 在初步概述和Arjan关于最重要的后端功能的文章之后 ,我现在非常高兴让Ed Burns( edburns )使用他最喜欢的Java EE 7前端功能完成本系列。 感谢Markus Eisele让我有机会在他非常受欢迎的博客上发表帖子。 我和M…

如何构建股票ChatGPT查询全球股票市场以及常用Prompt

Blog:4 ways to use ChatGPT Stock Chatbot for stock analysis of Global Stock Markets NASDAQ NYSE LSE HKEX TSE NSE HANGHAI SHENZHEN 地址:http://deepnlp.org/blog/chatgpt-stock-global-market 全球股票市场:NASDAQ 纳斯达克, NYSE…

jvm高并发_JVM上的高并发HTTP客户端

jvm高并发HTTP可能是最流行的应用程序级别协议,并且有许多库在网络I / O之上实现它,这是常规I / O的一种特殊(面向流)情况。 由于所有I / O都有很多共同点1 ,所以让我们开始对其进行一些讨论。 我将集中讨论具有大量并…

jmeter 采样器作用_实施自定义JMeter采样器

jmeter 采样器作用随着我们采用不同的体系结构和实现方式,对通用压力测试工具的需求不断增长。 关于负载测试, Apache Jmeter是最知名的工具之一。 它支持许多协议,例如ftp http tcp,并且可以轻松地用于分布式测试。 Jmeter还为…

xp系统 javafx_使用JavaFX构建React系统

xp系统 javafxJavaFX是用于在Java中构建图形应用程序的新标准库,但是许多程序员仍然对Swing甚至(高音)AWT感到困惑。 在Java诞生20年来,发生了很多事情。 两年前,当我开始研究Speedment UI的JavaFX库时,我发…

html手机端图片点击放大缩小快捷键,PS放大缩小图片的快捷键是什么?PS放大缩小图片的操作技巧...

PS放大缩小图片的快捷键是什么?PS怎么放大缩小图片?使用PS处理图片可是个精细的活儿,为了让图片处理得更加完美,我们经常需要将图片放大来处理,修改好之后又要缩小图片看下整体效果,这样来回切换其实挺麻烦…