文档章节

友盟自动更新技术解决方案(安卓版)

Skqing
 Skqing
发布于 2016/05/16 17:15
字数 1541
阅读 29
收藏 0

系统结构 友盟自动更新系统的示意图如下: 示意图

图中手机代表客户端。服务端的各个模块描述如下:

WebConsole:提供上传更新包的网站操作界面。 FS:文件系统,存储apk文件和增量更新包,增量更新的原理后文会提到。 DB:用于存储文件的属性,例如版本号,更新描述,文件的md5等。 Server: 接收客户端请求,返回文件下载链接。 CDN:提供文件下载服务(友盟用到的是阿里云的CDN服务)。

基本流程 1 用户在WebConsole上传更新包、填写更新版本和更新日志,程序将更新包存储到FS,版本(version-code)、更新日志、文件md5及其他配置信息存储到DB。 2 客户端请求Server,传入客户端的appkey、版本号、md5等信息。Server与DB存储的信息比较,如果需要更新则返回更新包的url,否则返回不更新。 3 客户端收到服务器端的返回结果后判断是否需要更新,如果需要更新,则弹窗提示用户有新版本更新,用户确认后下载安装包,安装新版本。

交互协议(示例) 客户端和Server之间使用https接口通信。使用POST请求方式,交互的信息都在http的content中,格式为json。以下简单示例协议中的关键字段。

Request: [Java] 纯文本查看 复制代码 ? 1 2 3 4 5 { "appkey":"xxxxxxxxxx", "version_code":1, "old_md5":"xxxxxxxxxxxxxxxxx" } 其中version_code是客户端软件的版本号,old_md5是客户端apk文件的md5值。

Response: 如果不需要更新则返回下面的response [Java] 纯文本查看 复制代码 ? 1 2 3 { "update": "No" }

如果需要更新, 则返回下面的reponse: [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 // 全量更新 { "update":"Yes", "new_version":"xxxxx", "apk_url":"http://cdn.the.url.of.apk/or/patch", // CDN链接下载地址 "update_log":"xxxx", // 更新日志,用于在界面上显示 "delta":false, "new_md5":"xxxxxxxxxxxxxx", "target_size":"601132" }[/p][p=21, null, left] [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 // 增量更新 { "update":"Yes", "new_version":"xxxxx", "apk_url":"http://cdn.the.url.of.apk/or/patch", // CDN链接下载地址 "update_log":"xxxx", // 更新日志,用于在界面上显示", "delta":true, "new_md5":"xxxxxxxxxxxxxx", // full-apk的md5 "target_size":"601132", // full-apk的size "patch_md5":"xxxxxxxxxxxxxxxxx", // patch文件的size "size":"337852" // patch文件的md5 }

服务端处理流程 流程图如下: 流程图

  1. 客户端发送请求至服务端,请求内容除了必要的验证信息以外,最重要的信息就是version_code,或者类似的用于比较版本号以判断是否需要升级的字段信息。
  2. 服务端接收到请求后,验证请求的有效性。
  3. 若请求有效,则对比请求中的version_code是否是最新的。
  4. 若不是最新的version_code,则说明需要进行更新,此时需要首先判断是否能够进行增量更新。如果请求中version_code对应的apk文件在服务端存在且md5一致,则可以进行增量更新,否则不能。 5 如果不能增量更新,则直接返回apk文件的CDN下载链接。 6 如果能进行增量更新,首先判断对应的patch文件是否存在,如果不存在则调用bsdiff命令生成patch文件后返回patch文件的CDN链接;如果存在就直接返回patch文件CDN链接。

客户端处理流程 1.客户端首先请求server,获得是否有新版本的更新信息。 2. 如果没有更新,则客户端不进行更新动作。 3. 如果服务端返回的是有更新,客户端会根据全量更新和增量更新两种情况来处理: 如果服务器端返回的是全量更新,则会开启service下载完整版的apk文件; 如果服务器端返回的是增量更新,则会开启service下载patch文件到本地,然后使用JNI进行bspatch,给原apk文件打补丁,生成新版本的apk文件,生成的apk文件要进行MD5校验,如果与后台上传的apk文件的MD5值相等,则认为bspatch成功。 更新对话框如下: 对话框 4. 客户端在下载完成后,会提示安装,若用户忽略,则会在下次检测更新的时候,首先判断本地是否已经存在最新版的apk文件,若已存在,则会提示安装。

一些经验 0. 客户端与服务器端之间的数据传输要进行加密处理,推荐使用https协议。

  1. 建议使用全量更新,目前已知增量更新方案在部分系统厂商上不能正常工作。
  2. 当遇到apk有较大改动时,可能会出现差分包和新apk大小相差不大的情况。这种情况下,建议进行全量升级。因为合并差分包的耗费的时间可能会超过全量升级所花费的时间。
  3. 当apk本身较小时,全量更新更加合适
  4. 若系统内置的apk文件无法获取到,则无法进行增量更新(bspatch是根据系统内置的apk文件与patch文件来合并生成新版本的apk文件)。
  5. 为防止增量更新合成的apk文件有误,需要对合成的apk文件和最新版的apk文件进行MD5校验。

What's more 渠道更新 在本文描述的处理流程基础上,增加很少的扩展就可以实现分渠道更新。具体的做法是: 1 在上传安装文件时分不同渠道存储,相应的DB里面存储的时候也增加channel的字段。 2 客户端请求中增加一个字段channel,用于标识客户端的渠道。 3 服务端根据不同的渠道返回不同的下载链接。

iOS自动更新 参见http://bbs.umeng.com/thread-11135-1-1.html

参考资料 bsdiff & bspatch:http://www.daemonology.net/bsdiff/

本文转载自:http://bbs.umeng.com/thread-15012-1-1.html

共有 人打赏支持
Skqing

Skqing

粉丝 36
博文 196
码字总数 22875
作品 0
深圳
后端工程师
私信 提问
Android-微信浏览器/qq浏览器内如何实现调用并打开手机第三方应用?

背景: 公司app有个需求,分享的新闻链接能用自己的app打开浏览,未安装时引导用户安装; 平台:android/ios; 分享SDK:友盟社会化分享SDK 目前方案: android客户端使用intent-filter过滤设...

清风烈酒-
2015/05/13
12.3K
2
Android Gradle 常用使用场景实现方式的总结

Gradle 作为一款灵活多变的构建插件,与 Android Studio 的结合,能够解决过去使用 Eclipse 开发 App 时所遇到的诸多问题。同时,基于 Groove 这样一款 DSL 语言的脚本特性,记住各种语法显然...

亦枫
2018/10/29
0
0
Android使用友盟集成QQ、微信、微博等第三方登录

前言 最近项目需要加入第三方分享和登录功能,之前其他项目的第三方分享和登录一直都使用ShareSDK实现的。为了统一使用友盟的全家桶,所以三方分享和登录也就选择了友盟。这里记录一下完整的...

慕前端7069444
2018/05/21
0
0
Java转iOS-第一个项目总结(1)

0.前言 本人14年12月份,从网站开发组转到了移动开发组,自己的java两年半工作经验变成了objective-c零经验。2015年1月份新启动了一个移动项目,年后因为人事变动,自己从辅助开发变成了"核心...

蛙牛
2015/03/31
0
67
友盟社会化组件3.0

友盟社会化组件帮助移动应用分享到微博,微信,朋友圈,QQ好友等社交平台,已开发至3.0版,经过1.0~3.0的数十次迭代以及数以千计的合作APP上线,已趋于稳定与完善。 社会化组件:社会化组件...

gongweixin1990
2013/09/22
23
0

没有更多内容

加载失败,请刷新页面

加载更多

test

//// main.c// Test//// Created by 吕颖 on 2019/1/16.// Copyright © 2019年 carmen. All rights reserved.//#include <stdio.h>#include <stdlib.h>#include <t......

carmen-ly
今天
1
0
Android webview热门组件agentweb:4.0.2无法自适应的问题

Android webview热门组件agentweb:4.0.2无法自适应的问题 //设置自适应屏幕,两者合用mAgentWeb.getAgentWebSettings().getWebSettings().setUseWideViewPort(true); //将图片调整到适合w...

Gemini-Lin
今天
5
0
如何维护一个自己的 golang doc 服务

本文内容是如何维护一个golang 在线的doc 服务。 1 什么是godoc ? godoc 是 golang 官方提供的文档生成工具, 2 为什么要有godoc ? 我们经常遇到一个问题,就是代码和文档不一致,线上代码版...

鼎铭
今天
5
0
js中的对象创建的模式以及继承模式

对象创建模式: 工厂模式 构造函数模式 原型模式 继承模式 原型式继承 寄生式继承 构造函数 原型式和构造函数的组合式(缺点:运行两次超类类函数,积累函数的属性被挂载在原型对象上和实例对...

莫西摩西
昨天
3
0
大数据教程(11.5)仓库工具hive的实现机制

上一篇文章介绍了hadoop联邦集群的搭建过程。至此,hadoop的整个知识系统就差不多结束了。本篇博客开始,博主将分享数据仓库hive工具的原理以及使用。 一、Hive基本概念 (1)什么是Hive Hive...

em_aaron
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部