尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

安卓自动化脚本热更新怎么做?不重新打包 APK 也能更新代码

安卓自动化脚本热更新怎么做?不重新打包 APK 也能更新代码 很多人做安卓自动化脚本都经历过这种场景脚本部署到几十台手机上突然发现一个逻辑 bug 或者想加个新功能只能重新打包 APK、一个个传包、让用户重新安装。一台两台还能忍几十台上百台就是灾难。热更新就是解决这个问题的——不重新打包 APK直接把编译后的代码文件下发到手机。这篇文章把安卓脚本热更新的完整链路讲清楚怎么配置、服务端怎么写、怎么自动更新、怎么在脚本内手动触发。一、先搞清楚热更新热的是什么很多人第一次接触热更新会误以为是要更新 APK其实不是。热更新的是编译后的 iec 文件不是打包的脚本 APK。APK 只是壳装一次就不用动了。真正的业务逻辑编译成 iec 文件通过热更新机制下发。这样做的好处非常直接免发版改代码不用重新走打包、签名、分发流程秒级下发用户下次启动脚本自动拉取最新代码故障止损线上出问题改一版代码立刻覆盖不用等用户手动升级。二、配置文件update.json 是热更新的入口在工程目录下找到或新建update.json热更新的所有基础配置都在这里{update_url:http://baidu.com/update,version:1.0.0,appendDeviceInfo:true,timeout:30000}各字段含义字段说明update_url服务端更新接口地址需要自己编写服务端接口或用官方热更新服务version当前脚本的版本号timeout请求超时时间单位毫秒最低 1000appendDeviceInfo是否在请求时附加设备基础信息把appendDeviceInfo设为true后请求会自动带上设备参数方便服务端做差异化下发。请求地址会变成类似http://baidu.com/update?version1deviceId7521e5d9eeec4f58b71dea8b78c414d5apkVersion9.22.0osVersion12pkgNamecom.gibb.easyclickmodelLNA-AL00ecVersion9.22.0brandHUAWEIandroidId82a3b055470ebe1a参数含义参数说明version当前运行的 iec 版本deviceIdEC 生成的设备 ID可能丢失不一定能作为设备唯一标识apkVersionAPK 打包版本osVersion系统版本ecVersion实际使用的 EC 版本pkgName打包的包名model/brand机型与品牌androidIdAndroid ID三、服务端怎么写两种返回格式配置好后打包运行客户端会自动用 GET 方式请求 update_url并带上版本参数例如http://baidu.com/update?version1.0.0。版本比较逻辑在服务端自行处理。服务端返回分两种情况1. 无需更新——直接返回空字符串即可不要返回 JSON。2. 需要更新——返回更新信息 JSON{download_url:http://baidu.com/aaa.iec,version:1.1.0,dialog:true,msg:优化部分问题,force:false}字段说明字段说明download_url新包的下载地址version新包的版本号dialog是否用对话框形式展示更新提示true 弹窗 / false 静默msg对话框中要显示的消息force对话框模式下是否强制更新true 无法取消客户端拿到这个 JSON 后会下载最新的 iec 包并加载使用。担心下载失败用严格模式校验 MD5{download_url:http://baidu.com/aaa.iec,version:1.1.0,dialog:true,msg:优化部分问题,force:false,md5:服务器自行校验的iec文件的md5值,download_timeout:60}md5iec 文件的 MD5 值有该字段会强制校验文件完整性保证下载的文件一定完整download_timeout下载超时时间秒不填默认 60 秒。四、两种更新时机启动自动更新 脚本内手动更新4.1 UI 启动更新只要 update.json 配置无误用户打开脚本界面时会自动请求更新无需任何额外代码。这是最常用的方式——用户打开脚本最新代码已经在路上了。4.2 脚本内热更新脚本执行期间也可以做热更新配合代码触发。核心流程是请求更新 → 下载新包 → 重启脚本。functionmain(){// 从项目文件的 update.json 中获取版本号letversionJSON.parse(readIECFileAsString(update.json)).versiontoast(Hello World - version);// 请求服务器是否有新版本使用自定义 url 模式letupdateResulthotupdater.updateReq(http://baidu.com,version,true,9000);logd(请求更新是否有: updateResult);if(!updateResult){logw(请求失败错误信息: hotupdater.getErrorMsg());}else{// 有更新下载新的版本letpathhotupdater.updateDownload();logd(下载路径为: path);if(!path){logw(下载IEC文件错误信息: hotupdater.getErrorMsg());}else{// 重启脚本加载新版本restartScript(path,true,3)return;}}}main();脚本内热更新用到的方法方法作用hotupdater.updateReq(updateUrl, version, appendDeviceInfo, timeout)请求更新接口返回 true 表示需要更新false 可能是无需更新或请求失败用 getErrorMsg 查看具体信息hotupdater.updateDownload()下载热更新返回的 iec 文件返回下载后文件路径hotupdater.getUpdateResp()获取热更新的请求结果hotupdater.getErrorMsg()获取请求或下载的错误信息updateReq的第一个参数不传时会使用 update.json 里配置的数据version建议使用整型数字。下载完成后调用restartScript(path, true, 3)重启脚本新代码立即生效。五、几个容易踩的坑版本号要一致update.json里的版本号必须和服务端接口返回的版本号逻辑保持一致否则可能更新异常无需更新别返回 JSON服务端判断无更新时直接返回空字符串返回 JSON 会被当成更新数据处理设备指纹别当唯一标识deviceId是 EC 生成的可能丢失做设备绑定类逻辑不要只依赖它生产环境注意时效建议把appendDeviceInfo打开按设备维度控制灰度发布避免一次全量下发出问题。六、总结热更新是安卓脚本从个人玩具走向商业产品的关键能力配置一次长期受益update.json 配好后后续每次迭代都走热更新告别打包传包两种更新方式UI 启动自动更新适合绝大多数场景脚本内手动更新适合对时机有要求的业务严格模式更稳生产环境建议带上 md5 校验防止下载不完整导致脚本异常不想写服务端直接用官方热更新服务对接阿里云 OSS上传 iec 文件即可自动生成下载地址和 md5。对于把脚本卖出去、部署到几十上百台设备的团队热更新不是锦上添花而是运维效率的刚需。改一行代码要重装一次 APK 的时代该翻篇了。文章来源 https://blog.ieasyclick.com/blog/android-script-hot-update/
返回列表