终端开发

安卓开发那些事之开发规范 安卓组件化之组件通信及拦截 安卓开发那些事之版本管理 安卓组件化之持续集成与自动构建 安卓组件化之组件调试和运行 安卓组件化之组件管理(导入、依赖、升级) 安卓组件化之框架设计 安卓开发那些事总纲 Android Textview 对HTML 的支持 appium 爬坑之基于 Chromedriver 测试 Android webview Linux 搭建 Android 编译构建环境 appium爬坑之iMac上基于appium多设备并发测试 appium爬坑之iMac上appium环境搭建及使用真机测试Android项目简介 H5页面通过指定Schema拉起Android应用 Android JSBridge简介 Gradle插件开发系列之发布gradle插件到开源库 Gradle插件开发系列之开发第一个gradle插件 Gradle插件开发系列之gradle插件调试方法 Gradle插件开发系列之总纲 一款检查Gradle依赖配置是否冲突的插件 记一次升级Android Gradle Plugin后databing编译报错填坑经历 iMac上 Xcode 相关设置及常见问题 iOS开发 -- 首次使用Xcode运行iOS项目代码 使用Android Studio开发可独立运行(runnable)混淆过的Jar程序 Android安装包精简系列之资源精简 Android安装包精简系列之图片优化 Android安装包精简系列之为什么要优化精简安装包 Android安装包精简系列(总纲) Android安装包精简系列之图标转字体 gradle相关资料汇总 Android编译常见错误解决 Android编译编译速度提升 终端基于gradle的开源项目运行环境配置指引 制作终端产品演示的gif 一个关于APK Signature Scheme v2签名的神奇bug定位经历 如何随apk一起打包并使用SQLite SDK热更之gradle插件(如何在SDK代码中自动插桩及如何生成补丁包) 关于Android的APK Signature Scheme v2签名相关的资料汇总 封装HttpURLConnection实现的简单的网络请求库 一款基于Java环境的读取应用包名、签名、是否V2签名等基本信息的工具 Android的APK Signature Scheme v2签名及一款基于Java环境的校验工具介绍 如何使用Eclipse开发可执行Jar程序,并生成混淆过的jar程序 Android 相关的学习资料整理(持续更新) macOS(Sierra 10.12)上Android源码(AOSP)的下载、编译与导入到Android Studio Android开发常用命令备忘 Google也看不下去被玩坏的悬浮窗了么? Android开发常用工具资源 SDK热更系列之概述(持续整理编辑中~) SDK热更系列之SDKHotfix待优化点 Android 终端开发相关的一些神图(持续更新) SDK热更系列之Demo项目介绍概述 SDK热更系列之Demo体验方法 SDK热更系列之如何获取应用在当前设备上的so对应的指令集 Gradle Android插件使用的中那些特别注意的点 Experimental Plugin User Guide(From Android Tools Project Site) 基于Android Studio使用gradle构建包含jni以及so的构建实例 基于Instrumentation框架的自动化测试 - Android自动化测试系列(四) Instrumentation框架介绍-Android自动化测试系列(三) 关于终端设备的设备唯一性的那些事之MAC地址 关于终端设备的设备唯一性的那些事之IMEI Android 检查应用是否有root权限 ant常见错误解决方案 Gradle介绍 iMac上Android Studio 相关设置及常见问题 ADB命令系列之再说ADB 再看Android官方文档之分享 再看Android官方文档之Fragment&数据保存 再看Android官方文档之Activity&Intent 再看Android官方文档之ActionBar和兼容性 ADB命令系列之 adb shell input(Android模拟输入)简单总结 再看Android官方文档之建立第一个APP Android开发调试常用工具 ANR(网络资料整理) Java参数引用传递引发的惨案(又一次Java的String的“非对象”特性的踩坑经历) android.view.WindowManager$BadTokenException,Unable to add window Android签名校验机制(数字证书) Robotium二三事-Android自动化测试系列(二) Robotium介绍-Android自动化测试系列(一) Android开发中遇到的那些坑 Eclipse使用中部分经验总结 Android中关于Nativa编译(NDK、JNI)的一些问题 Android简单实现的多线程下载模块 Android内存耗用之VSS/RSS/PSS/USS ADB命令系列之 Advanced Command URL编码中的空格(编码以后变为+) Android MD5后 bye数组转化为Hex字符串的坑(记一次为女神排忧解难的经历) Android学习之路 ADB命令系列之 Base Command Android Log的那些坑…………

开发工具

使用 Jekyll 搭建技术博客并部署到 CentOS 服务器 开发中常用的文档管理、云端笔记等效率工具介绍 iMac(OS X)常用图片处理工具介绍 使用 Octopress 搭建技术博客并使用腾讯云静态网站托管 使用腾讯云静态网站托管个人博客 使用 Jekyll 搭建技术博客 iMac上安装Python2.7 和 Python3 iMac 使用自带的 Apache 启用本地web服务 发布开源代码到jcenter Gradle环境变量那些事 iMac搭建jekyll本地环境 iMac(OS X)开发和使用中经验汇总(持续更新) iMac配置基于crontab的定时任务 iMac配置支持读取NTFS硬盘 新iMac机器装机及开发环境搭建攻略 git常用命令整理(已包括branch、tag等持续更新~) iMac使用过程中的简单故障解决 iMac上RubyGems相关的问题汇总 开发中常用的一些Chrome插件介绍 iMac(OS X)日常开发中各种代理设置方法汇总(shell、Android Studio、gem、npm) Markdown格式优化及使用技巧 iMac下制作含透明度图片及判断图片透明度 iMac(OS X)中设置大小写敏感的分区并切换 Linux & MacOS中一些常用命令备忘 iMac(OS X)搭建私有maven仓库,提供Nexus Responsitory镜像 iMac(OS X)El Capitan 更新遇到的那些坑 vi常用命令 iMac(OS X)常用开发工具介绍 iMac(OS X)不可或缺的套件管理器 —— Homebrew 开发环境通用设置 windows中一些常用命令备忘 问题定位之快速模拟请求 Ant中的SVN 使用 Markdown语法简介 SVN 常用命令

标签

android 48

Linux 搭建 Android 编译构建环境 H5页面通过指定Schema拉起Android应用 Android编译常见错误解决 一个关于APK Signature Scheme v2签名的神奇bug定位经历 关于Android的APK Signature Scheme v2签名相关的资料汇总 封装HttpURLConnection实现的简单的网络请求库 一款基于Java环境的读取应用包名、签名、是否V2签名等基本信息的工具 Android的APK Signature Scheme v2签名及一款基于Java环境的校验工具介绍 如何使用Eclipse开发可执行Jar程序,并生成混淆过的jar程序 Android 相关的学习资料整理(持续更新) macOS(Sierra 10.12)上Android源码(AOSP)的下载、编译与导入到Android Studio Android开发常用命令备忘 Google也看不下去被玩坏的悬浮窗了么? Android开发常用工具资源 Android 终端开发相关的一些神图(持续更新) Gradle Android插件使用的中那些特别注意的点 Experimental Plugin User Guide(From Android Tools Project Site) iMac(OS X)搭建私有maven仓库,提供Nexus Responsitory镜像 基于Android Studio使用gradle构建包含jni以及so的构建实例 基于Instrumentation框架的自动化测试 - Android自动化测试系列(四) Instrumentation框架介绍-Android自动化测试系列(三) 关于终端设备的设备唯一性的那些事之MAC地址 关于终端设备的设备唯一性的那些事之IMEI Android 检查应用是否有root权限 iMac(OS X)El Capitan 更新遇到的那些坑 ant常见错误解决方案 Gradle介绍 iMac上Android Studio 相关设置及常见问题 ADB命令系列之再说ADB 再看Android官方文档之分享 再看Android官方文档之Fragment&数据保存 再看Android官方文档之Activity&Intent 再看Android官方文档之ActionBar和兼容性 ADB命令系列之 adb shell input(Android模拟输入)简单总结 再看Android官方文档之建立第一个APP Android开发调试常用工具 ANR(网络资料整理) Java参数引用传递引发的惨案(又一次Java的String的“非对象”特性的踩坑经历) android.view.WindowManager$BadTokenException,Unable to add window Android签名校验机制(数字证书) Eclipse使用中部分经验总结 Android内存耗用之VSS/RSS/PSS/USS ADB命令系列之 Advanced Command URL编码中的空格(编码以后变为+) Android MD5后 bye数组转化为Hex字符串的坑(记一次为女神排忧解难的经历) Android学习之路 ADB命令系列之 Base Command Android Log的那些坑…………

tags 46

安卓开发那些事之开发规范 安卓组件化之组件通信及拦截 安卓开发那些事之版本管理 安卓组件化之持续集成与自动构建 安卓组件化之组件调试和运行 安卓组件化之组件管理(导入、依赖、升级) 安卓组件化之框架设计 安卓开发那些事总纲 Android Textview 对HTML 的支持 使用 Jekyll 搭建技术博客并部署到 CentOS 服务器 2018年春节仙本那海岛游行程规划 照片整理系列之单次整理流程 照片整理系列之整理及归档的总体方案 使用 Octopress 搭建技术博客并使用腾讯云静态网站托管 使用腾讯云静态网站托管个人博客 使用 Jekyll 搭建技术博客 颜色透明度对照表 Android JSBridge简介 Gradle插件开发系列之发布gradle插件到开源库 Gradle插件开发系列之开发第一个gradle插件 Gradle插件开发系列之gradle插件调试方法 发布开源代码到jcenter Gradle环境变量那些事 Gradle插件开发系列之总纲 一款检查Gradle依赖配置是否冲突的插件 记一次升级Android Gradle Plugin后databing编译报错填坑经历 服务器迁移到腾讯云笔记 2018年春节沙巴仙本那海岛游 聚会桌游助手 nodejs入门之后台服务的几种启动方式 nginx下多域名配置示例 nodejs入门之连接mysql mysql迁移之新建用户、备份还原数据库 iMac配置基于crontab的定时任务 iOS开发 -- 首次使用Xcode运行iOS项目代码 新iMac机器装机及开发环境搭建攻略 旅行中不可或缺的软件 iMac上RubyGems相关的问题汇总 接口设计六大原则 Canvas上更高效的画SVG 微信小程序开发之SVG的使用 旅行出行前准备列表 使用Android Studio开发可独立运行(runnable)混淆过的Jar程序 2017年端午川西滇北香格里拉环线(近200张图慎点) 照片整理系列之基于命令行的照片整理及查看工具 gradle相关资料汇总

安卓开发那些事之版本管理

「 终端开发 」 ——  2020年08月24日

在前面介绍完框架以及自动构建等内容后,再讲版本就轻松很多了,相关的内容前面都断断续续涉及到了。这篇文章和组件化的关系不大,主要是讲应用的版本,包括版本怎么定义,有哪些标识,以及这些标识怎么生成,用于什么场景,解决什么问题。以及版本发布方法,遇到问题怎么回溯。

这部分内容在自动构建里面其实有一些介绍,也阔以参考几年前总结SDK的时候写的一篇关于版本的文章:SDK设计心得之版本

版本类型

  • 需要几个版本

    之前规划了三个版本,结果现在因为有各种便利的调试入口,所以基本上只有两个版本:

    • 内测版:内测版提供各种调试入口,开启日志,可以自由切换到各种环境。主要用于内部体验和测试,

    • 正式版:对外发布版本,不支持调试,不开日志。用于正式发布

版本标示

有哪些标识

  • 版本名和版本号

    版本基本上都是两个字段,版本号和版本名。版本名一般用于产品的版本定义,版本号用于版本升级等逻辑。很多项目的版本号都是通过版本名的String按照指定规则转化,因此需要手动维护。

    在组件化框架中,因为是自己从头搭建,因此我直接改为了使用应用代码的提交次数作为版本号,版本名可以自定义。

    由于组件化框架同时支持多个应用,那多个应用的版本怎么管理?其实只要明确了版本号和版本名的定位,无论是多少个应用,都不存在这个问题。

    当所有的开发逻辑都使用版本号,然后版本号自增,就不会有任何问题。例如PubA 和 PubB 同时发布版本,我们可能会先构建 PubA的版本,此时版本号可能是 2001, 版本名是 2.0.1;构建 PubB 时,版本号为2002,版本名为 1.0.1;版本名可能会有差异,但是版本号本质上还是自增的。也有人会追求版本号每发一个版本增加1,那不在这个讨论范围,而且也有别的方式可以做到,因为没有实际意义,所以不做讨论。

  • 版本TAG

    除了版本名和版本号,我们还设计了一个版本标示TAG,这个TAG主要用于标示版本与代码的关系。

    在持续集成时他分别以源码硬编码、配置文件打入版本包。同时正式发版本时对代码创建同名的TAG。

使用场景

版本号和版本名主要用于区分版本,包括产品发布、不同版本兼容等。

版本TAG主要用于遇到问题时,问题回溯。当提供某个版本的TAG后,我们就可以复原该版本对应的源码,更快的定位问题。

版本发布

版本发布主要包括两部分:

  • 怎么发布

    对于发布遵循原则:灰度发布、可止血回退、可定向发布

  • 用户怎么更新

    对于提醒用户更新,我们提供强更、弹框两种模式

版本发布流程

在版本通过持续集成构建成功以后,就进入了发布流程。我们对版本发布制定了对应的灰度流程,不同的应用发布标准不同,因此不列出我们具体的标准。

  • 新版本发布灰度机制

    灰度 灰度范围 前提
    小范围灰度 内测用户群 自测OK,可发布
    大范围灰度 定向用户群 小范围灰度达标,或者超时未达标
    官网灰度 官网包更新 大范围灰度达标
    渠道灰度 所有渠道包更新 官网灰度达标
    全量红点 所有用户 渠道灰度达标
  • 版本异常止血回退处理流程

    • 大范围灰度及以前:撤回发布,重新出包并从小范围灰度重新灰度
    • 官网灰度:官网回退到全量的最后一个包,重新出包并从小范围灰度重新灰度
    • 渠道灰度及以后:若非紧急bug,重新出包并从小范围灰度重新灰度;若主流程异常,重新出包后大范围灰度通过直接将问题版本全部强更到新版本

用户更新方法

更新类型 强制更新 可选更新 红点更新 无状态更新 最新版本
进入首页 弹框更新
侧边栏红点
弹框更新
侧边栏红点
侧边栏红点 无提示 无提示
进入关于页 弹框更新
版本更新提示发现新版本
弹框更新
版本更新提示发现新版本
版本更新提示发现新版本 无提示 无提示
点击检查更新 弹框更新 弹框更新 弹框更新 弹框更新 提示已经最新版

更新效果

应用更新有两种类型,强制更新和可选更新;同时提供了是否立即更新以及取消更新。同时还提供了红点更新和无状态更新两种类型(这两种更新的更新方式和可选更新一致,仅提示方式有差异)。下面为不同更新的差异

更新类型 强制更新 可选更新 红点更新 无状态更新 最新版本
进入首页 弹框更新、版本红点 弹框更新、版本红点 版本红点 无提示 无提示
进入版本页 弹框更新
版本信息提示发现新版本
弹框更新
版本信息提示发现新版本
版本信息提示发现新版本 无提示 无提示
点击检查更新 弹框更新 弹框更新 弹框更新 弹框更新 提示已经最新版

下面结合具体弹框,介绍不同更新策略下弹框逻辑

版本回溯

版本回溯主要用于问题定位。这里涉及到两个内容:

  1. 怎么准确知道出现问题的版本

  2. 怎么根据版本知道出现问题的代码

版本确认

这个其实很简单,我们前面已经在代码和APK中通过自动构架加入了版本的信息。因此:

  • 如果拿到的是版本的安装包,我们解压安装包,就可以拿到app.ini文件,里面记录了版本相关的信息

  • 如果是已经安装版本的用户反馈,我们提供了一个调试入口,用户点击即可把版本信息提供给我们

代码回溯

下面是一个我们拿到的版本信息的事例:

用户信息: 
openID: F83E0E59C7080121D00F3EA3E44CECFB
	
设备信息: 
deviceKey: 1204534990
厂商&型号: smartisan, OS105
系统版本: 7.1.1, 25
	
版本信息: 
version: 3.2.0.4286
Tag: Tag_MNA_3.2.0_4286
official: false

里面提供的版本信息就包含前面提到的版本TAG,根据TAG就可以获取对应的版本代码


赞赏

取消
微信扫一扫,赞赏子勰
扫码支持
屌丝程序猿,鸡血攻城狮!努力学技术,潜心做精品!