android 更新平台,Android更新平台架构方案

这篇文章是去年写的,我们的两款app一直这使用umeng的更新服务,但是16年umeng开始放弃更新服务,考虑到切换到其他更新平台也会面临这样的问题,我开始着手自己搭建一个更新平台。整体方案包含前后端,客户端代码封装成jar包并上次maven平台,方便每个app直接使用;服务端代码用nodejs来快捷实现。

1、系统结构

(1)整体结构

71853b3dd1e5e11839aaee3e26719646.png

整体结构

服务端的各个模块描述如下:

- WebConsole:提供上传更新包、配置更新策略的网站操作界面。

- FS:文件系统,存储文件及提供下载服务。

- DB:用于更新策略及更新信息,例如版本号,更新描述,文件的md5等。

- Server:接收客户端请求,返回更新信息。

(2)WebConsole结构

47635a7c6b3ad308ef886b0cf74fe28a.png

WebConsole结构

WebConsole的各个模块描述如下:

- 应用管理:创建应用、管理应用基本信息、管理应用的版本列表(包括versionCode、versionName、发版日期等) 。

- 更新应用:选择应用上传更新包,配置更新信息及策略。

- 任务管理:管理更新任务、定时任务。一个app有且只有一个运行中的更新任务,可以有多个定时任务。

- 测试机管理:查看管理测试机列表,用于。测试机的标识是以deviceId及MAC地址为判断依据。

- 用户管理:管理用户权限。

- 操作日志:查看管理操作日志。

2、 服务端流程

(1)在WebConsole配置更新信息和策略及上传更新包。将更新信息及策略保存至DB,将更新包保存至FS。

更新信息:版本(versionName,versionCode)、大小、包名、MD5、签名SHA1、更新日志等。其中版本、大小、包名、MD5、签名SHA1信息可通过对上传文件解析自动得到,并且通过对比包名和签名SHA1(忽略大小写)判断上传文件是否合法 。

更新策略:

1)低版本强制更新:设定一个版本(versionCode),在这个版本及之前版本的app必须进行更新。

2)定时更新:设定一个时间,到时自定启动更新任务。注意在后台有且只有一个运行中的更新任务,当启动新任务则之前的任务自动取消。但是创建一个定时任务,在到时之前上一个运行中的更新任务依然有效。

3)测试阶段:默认开启,用于正式更新前进行更新测试,可在任务管理进行切换。当开启测试阶段,只有在测试机列表中的才会进行更新。

(2)客户端请求Server,传入客户端的包名、版本等信息。Server与DB存储的信息比较,如果需要更新则返回更新包的url及更新信息,否则返回不更新。

346a898381a74196b7b7086444dacc5b.png

Server流程

验证请求:主要验证客户端的请求参数。首先验证参数齐全切不为空,否则为无效请求;然后通过包名和签名SHA1(忽略大小写) 判断是否为官方应用,非官方应用不允许更新,返回非官方错误码。

对比版本:判断客户端是否为最新版本,是则无需升级。

测试阶段:判断更新任务是否是测试阶段。如果是测试阶段则判断客户端是否为测试机,是则升级,否则不升级。

强制更新:判断客户端版本是否不高强制更新的版本,是则进行强制更新,否则非强制更新。

3、交互协议

Request:

{

"pkgName": "com.xxx.xxx",

"versionCode": 1,

"versionName": "1.0.0",

"signedSHA1": "xx:xx:xx:xx:xx",

"deviceKey": "xxxxxxx"

}

其中signedSHA1的校验注意忽略大小写;deviceKey用于判断测试机,由deviceId和MAC地址组合而成的唯一校验码

Response:

{

"update": true,

"msgCode": 1,

"msg": "已是最新",

"data": {

"pkgName": "com.xxx.xxx",

"versionCode": 2,

"versionName": "1.0.2",

"updateInfo": "优化xxxx",

"signedSHA1": "xx:xx:xx:xx:xx",

"forceVersion": 1,

"forceUpdate": false,

"apkSize": 123143,

"md5": "xxxxxxx",

"apkUrl": "http://www.xxx.xxx/xx.apk"

}

}

其中msgCode和msg是没有更新的原因;forceUpdate是否强制更新;forceVersion表示这个版本及之前版本的app都需要强制更新,只是forceUpdate的一个补充;signedSHA1和md5的校验注意忽略大小写。

msgCode-msg:

0-更新

1-已是最新版本

2-更新请求失败,请重试。

3-非官方应用,请卸载后到官网下载安装。

4-新版本马上到来,请稍后再试。(测试阶段)

4、客户端流程

3b8454e47b06ac8fbc5f00d0124c7056.png

(1)非官方应用:弹出不可关闭的提示弹窗,提示用户卸载当前应用,去官网下载官方版本。

(2)手动更新:app启动会自动检查更新,另外用户可以在设置中手动检查更新。手动检查更新结果必须反馈给用户,自动检查更新要保证不影响用户操作。

(3)忽略更新:读取本地存储,判断用户是否已经忽略本版本。

(4)强制更新:弹出不可关闭的提示弹窗,提示版本过低,必须更新后使用。

(5)正常更新:提供更新、取消两种操作及忽略选项。选中忽略取消更新则在本地进行存储。

(6)下载校验:校验文件的大小、md5,保证文件的合法性正确性。如果校验失败则删除已下载文件。

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

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

相关文章

setSignVisible的修改

store传入accountReducer 1.从cookie中获取id,avatar,nickname.2.createStore(reducer, initState)传入reducer,可以在页面中state.accountReducer.current_account获取 const middleware routerMiddleware(browserHistory); let initState {};if(Cookie.hasItem("id&qu…

DGbroker故障切换示例

1.主库故障 SQL> startup ORACLE instance started.Total System Global Area 1068937216 bytes Fixed Size 2260088 bytes Variable Size 910164872 bytes Database Buffers 150994944 bytes Redo Buffers 5517312 bytes ORA-00205: e…

html 自动触发 事件,js自动触发事件自定义事件

在有些情况下,我们需要程序逻辑自动触发元素的事件,例如js提供了click(), form提供了reset(),submit()等方法!在jquery中提供了trigger()方法帮助我们自动触发事件,原理是什么呢?接下来让我们一探究竟&…

Storm编程入门API系列之Storm的可靠性的ACK消息确认机制

概念,见博客 Storm概念学习系列之storm的可靠性 什么业务场景需要storm可靠性的ACK确认机制? 答:想要保住数据不丢,或者保住数据总是被处理。即若没被处理的,得让我们知道。 public void nextTuple() {num;System.out.…

关于 php mysql pdo cannot find driver 解决方案

1、下载 文件 或者 进入 在PHP源码包中进入ext/pdo_mysql http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz 2、解压文件tar zxvf PDO_MYSQL-1.0.2.tgz 3、配置和编译文件cd PDO_MYSQL-1.0.2/usr/local/php/bin/phpize./configure –with-php-config/usr/local/php/bin/php-config…

iOS网络编程开发-数据加密

iOS网络编程开发-数据加密 一、简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题。 如:可以利用软件(比如Charles)设置代理服务器&am…

Codeforces 821C - Okabe and Boxes

821C - Okabe and Boxes 思路&#xff1a;模拟。因为只需要比较栈顶和当前要删除的值就可以了&#xff0c;所以如果栈顶和当前要删除的值不同时&#xff0c;栈就可以清空了(因为下一次的栈顶不可能出现在前面那些值中)。 代码&#xff1a; #include<bits/stdc.h> using n…

Java中forEach, 用来遍历数组

这里的for是Java中forEach, 用来遍历数组的。for(int i : d) 就是遍历int型数组d的 每一次访问数组d的时候读取的数据放入int型的i中。和for(int i0;i<d.length();i)是一样的&#xff0c;但是forEach的可用场合较多。public class e1 {public static void main(String[] …

HDU -2546饭卡(01背包+贪心)

这道题有个小小的坎&#xff0c;就是低于5块不能选&#xff0c;大于5块&#xff0c;可以任意选&#xff0c;所以就在初始条件判断一下剩余钱数&#xff0c;然后如果大于5的话&#xff0c;这时候就要用到贪心的思想&#xff0c;只要大于等于5&#xff0c;先找最大的那个&#xf…

图片向上滚动字幕代码html,如何通过制作滚动字幕的软件实现这种片尾的向上滚动字幕效果...

如何制作滚动字幕 特殊滚动类字幕制作 向上向下向左向右滚动字幕制作效果 含拖动和消失全程 真是酷B了爽呆了&#xff0c;赶快学习吧&#xff01;电影、连续剧等影视作品片尾&#xff0c;都会在播放片尾曲时&#xff0c;出现向上滚动的字幕&#xff0c;显示演员表、导演、编剧等…

【图片服务器】搭建Nginx图片服务器

一、安装Nginx 二、安装vsftpd 三、开始搭建Nginx图片服务器 1、效果 例如&#xff1a;图片通过ftp服务上传到/home/ftpuser/www/images目录下&#xff0c;我想通过访问Nginx服务器来访问ftp目录下的图片文件&#xff0c;该url为http://192.168.128.128/images/xxx.jpg。即使用…

JavaScript数组去重

1、数组去重&#xff1b; Array类型并没有提供去重复的方法&#xff0c;如果要把数组的重复元素干掉&#xff0c;那得自己想办法&#xff1a; 方法一&#xff1a;利用indexOf方法&#xff1b; var aa[1,3,5,4,3,3,1,4] function arr(arr) {var result[]for(var i0; i<arr.le…

html怎么让方块自动旋转,如何使用纯CSS实现一个圆环旋转错觉的动画效果(附源码)...

本篇文章给大家带来的内容是关于如何使用纯CSS实现一个圆环旋转错觉的动画效果&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。效果预览源代码下载https://github.com/comehope/front-end-daily-challenges代码解读定义 dom&…

同志亦凡人第五季/全集BQueer As Folk 5迅雷下载

同志亦凡人 第五季 Queer as Folk Season 5 (2005) 本季看点&#xff1a;这是一群生活在匹兹堡男人和男人&#xff0c;女人和女人的故事。在他们的王国里有各色人物。王国的国王Brian&#xff08;葛尔?哈罗德 Gale Harold 饰&#xff09;&#xff0c;只追求性不问爱&#xff1…

2016,请不要在公司混日子!

1、无论为谁打工&#xff0c;要为自己学东西&#xff0c;客观上为公司创造价值。 我自己当年&#xff0c;无论我在方正给国内企业工作&#xff0c;还是我在雅虎给外国人工作&#xff0c;我都跟别人最大的不一样&#xff0c;我从来不觉得我在给他们打工&#xff0c;我真的可能是…

数据库作业[定时执行任务]的创建

--每月执行的作业 exec p_createjob jobnamemm,sqlselect * from syscolumns,freqtypemonth --每周执行的作业 exec p_createjob jobnameww,sqlselect * from syscolumns,freqtypeweek --每日执行的作业 exec p_createjob jobnamea,sqlselect * from syscolumns --每日执行的作…

《算法之道》精华 经典算法部分

《算法之道》精华 经典算法部分 本书作者邹恒明&#xff0c;作者另有一本书《数据结构之弦》&#xff0c;以及《操作系统之哲学原理》都是非常好的书这本书能够算得上是深入浅出&#xff0c;文笔非常好。作者加入了非常多自己的思考本文包含经典算法部分第十章 排序与次序 插入…

学生社团网站html,学生社团活动平台的设计与实现.docx

PAGE 67学生社团活动平台的设计与实现摘 要本系统立足于实现社团活动申请与审批、资源申请与审批等工作&#xff0c;面向高校中所有的社团&#xff0c;建立一个使用便捷、可靠的社团活动平台&#xff0c;从而更方便地进行社团活动的申请、社团资源的申请及相应审批&#xff0c;…

tornado 学习笔记17 HTTPServerRequest分析

代表Http请求。 所有的属性都是字符串型。 17.1 属性 (1) method:请求方法类型&#xff0c;比如”GET”、”POST” (2) uri: 请求的uri (3) path:请求路径&#xff0c;作为uri的一部分。 (4) query&#xff1a;查询字符串&#xff1a;作为uri的一部分。 (5) version&#xff1a…

Android 动画效果及Interpolator和AnimationListener的使用

转载http://www.itzhai.com/android-animation-used-to-achieve-control-of-animation-effects-and-use-of-interpolator-and-animationlistener.htmlandroid:interpolator可能有很多人不理解它的用法&#xff0c;文档里说的也不太清楚&#xff0c;其实很简单&#xff0c;看下面…