今日科技快讯

阿里星球今天在苹果商店发布的更新动态显示,其将在近期停止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万能的软件更新库相关推荐

  1. 视频教程-FFmpeg打造Android万能音频播放器-Android

    FFmpeg打造Android万能音频播放器 从事Android移动端开发多年.主导开发过直播.电商.聊天等各种类型APP和游戏SDK:熟悉Android音视频开发.底层NDK开发等:有开源项目:ht ...

  2. deepin linux截图,Linux Deepin 截图工具将入驻Debian/Ubuntu软件中心

    Linux Deepin 截图工具,deepin screenshot,是专为 Linux 用户打造的一款截图工具,目前已默认搭载在 Linux Deepin 11.12(2011年 12月 30日发 ...

  3. Linux二进制实用工具Binutils工具集解析()

    From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/softwa ...

  4. linux 二进制编辑工具,bz1621.lzh linux

    Bz1621.lzh软件是款专业的二进制编辑软件.使用这款软件的人都应该看过<30天自制操作系统>这个书,它就是里面用到的编辑器,功能简单实用,对于刚学习编程的人来说非常不错. [使用方法 ...

  5. 打造Android万能下拉刷新上拉加载控件

    转载请注明出处:http://blog.csdn.net/binbinqq86/article/details/70159782 关于列表刷新加载的自定义控件,网上数不胜数,但别人的用起来始终不是那么 ...

  6. Android 毛小软件,毛库官方app

    毛库官方APP带给大家啦,一款全新上线的薅羊毛应用,只需要通过虚拟喂羊就可以创造收益,羊种类很多,玩法较为新奇.毛库APP全新上线,应用设计较为美观,创新元素较多,微信登录授权就可以提现,感兴趣的朋友 ...

  7. Android友盟增量更新

    1.增量升级的原理  增量更新的原理就是将本地apk与服务器端最新版本比对,并得到差异包.比如现在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M.我们发现两个版本只有0.1M的 ...

  8. android+仿友盟更新,android友盟增量更新

    1.增量升级的原理 增量更新的原理就是将本地apk与服务器端最新版本比对,并得到差异包.比如现在的版本是1.1.4,大小是7.2M,新版本是1.1.5.大小是7.3M.我们发现两个版本只有0.1M的差 ...

  9. 使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放

    前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over1 ...

最新文章

  1. gif 图片制作和拆解
  2. iOS快速开发框架Bee-Framework应用和解析(三) - Message, Model, Signal
  3. Spark SQL之DataSet
  4. NFS部署及优化(一)
  5. 能够使用StringBuilder类的常用方法操纵字符串 1215
  6. 160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
  7. 【caffe-windows】 caffe-master 之 卷积核可视化(利用matlab)
  8. C#的变量、数据类型转换、转义符
  9. [转载] c++与python 数据类型对应
  10. c#语言asp.net实现treeview控件读数据库动态生成树的代码
  11. mike21 matlab tools,Mike post process with Matlab toolbox
  12. xshell 5安装教程
  13. chmod 755 filename
  14. 笔记本计算机在桌面显示,笔记本电脑开机后不显示桌面该怎么处理
  15. linux lighttpd,linux下lighttpd服务器的详细安装步骤 以及对flv流媒体的支持配置
  16. elasticsearch collapse
  17. SICP中关于兑换零钱的练习
  18. 关于德鲁伊数据源配置的记录
  19. 一个月裂变50多万人?商城引流模式玩法——分享购
  20. OpenCV竟然可以这样学!成神之路终将不远(六)

热门文章

  1. Vaadin 10+作为CUBA UI的未来
  2. java中hashmap_HashMap如何在Java中工作
  3. apache camel_Apache Camel中的断路器模式
  4. 探索适用于Apache Spark的Spline Data Tracker和可视化工具(第2部分)
  5. 使用一个命令执行单个Java源文件
  6. glassfish 4配置_自己构建GlassFish 4.0快照
  7. GC解释:收集器概述
  8. 是否可以在最终课程中使用抽象方法?
  9. gradle maven_Gradle – Maven的观点
  10. Spring Cloud Zuul支持–配置超时