在2020年新冠疫情的时候,我宅在家中无所事事,因而乎我写了一个flutter的版本更新插件: flutter_xupdate, 而且将其发布在了Google创建的Dart插件平台上,一年以来收到的反响还算不错,具体可看下图所示:android
但与此同时,也收到了不少使用者的疑问.git
为此,我简单看了一下问题,发现使用者以前可能压根就没有作过Android原生开发,对Android的一些基础知识很是缺少,就会致使不少问题.github
这里,为了可以让你们更好地去使用flutter_xupdate实现一键版本更新,我特意为你们盘点了使用过程当中可能出现的几大问题,为你们提早排排雷.不只如此,我还特意录了一期视频,喜欢看视频的小伙伴是否是赶忙三连支持一下呢?编程
视频地址以下: https://www.bilibili.com/video/BV1gy4y1g7pB/json
https://www.bilibili.com/vide...api
好了,言归正传,让咱们简单瞧一瞧,常见的问题都有哪些?缓存
下面我将一一为你们作出解答.微信
出现没法显示版本更新弹窗的问题可能有多种状况. 主要的表现形式是: 更新发生报错或者显示当前无版本更新.网络
前提条件: 使用的框架提供的默认接口(默认更新).架构
请求的url没有返回默认格式的json,那样json序列化就会有问题,致使版本信息获取失败,没法判断更新状态.
由于flutter_xupdate底层调用的是XUpdate, 其默认json格式以下所述:
{ "Code": 0, //0表明请求成功,非0表明失败 "Msg": "", //请求出错的信息 "UpdateStatus": 1, //0表明不更新,1表明有版本更新,不须要强制升级,2表明有版本更新,须要强制升级 "VersionCode": 3, //本地也会对版本号进行校验,确保升级的时候,版本号自增 "VersionName": "1.0.2", "ModifyContent": "一、优化api接口。\r\n二、添加使用demo演示。\r\n三、新增自定义更新服务API接口。\r\n四、优化更新提示界面。", "DownloadUrl": "https://raw.githubusercontent.com/xuexiangjys/XUpdate/master/apk/xupdate_demo_1.0.2.apk", "ApkSize": 2048 "ApkMd5": "..." //应用apk的md5值没有的话,就没法保证apk是否完整,每次都会从新下载。框架默认使用的是md5加密。 }
以上字段有任何一个不符合的都有可能致使json解析失败,没法显示版本更新弹窗. 除非你使用自定义接口或者直接传入UpdateEntity
进行更新.
前提条件: 使用的框架提供的默认接口(默认更新).
一样的, 使用的默认接口,返回的json格式也正常,也能正常解析, 惟独是这个返回的VersionCode
没有自增,致使本地版本号更新校验失败,没法显示版本更新弹窗.
前提条件: 使用的框架提供的默认接口(默认更新),且debug运行一切正常.
出现这种状况, 主要是由于android原生项目中设置了代码混淆. 可是使用flutter build apk --release
进行打包, 混淆配置并不会生效(由于该指令默认使用的是R8压缩,会有问题)。
这里有三个方法能够解决:
flutter build apk --no-shrink
指令代替。android
目录下,修改gradle.properties
以下:org.gradle.jvmargs=-Xmx1536M # 开启D8压缩 android.enableD8=true android.useAndroidX=true android.enableJetifier=true # 关闭R8压缩 #android.enableR8=true
./gradlew assembleRelease
命令进行打包。前提条件: 使用自定义更新弹窗样式, 设置了topImageRes
属性.
出现的现象通常是在debug下正常显示,可是在release下却显示异常,详情以下:
出现这种问题, 主要缘由是更新弹窗的顶部样式自定义使用的是反射的引用方式,因此在打release包的时候,若是咱们不设置shrinkResources
为false的话,打包程序就会默认清除你自定义的顶部图片,致使在release下图片不显示。
因此这个时候,咱们只须要把shrinkResources
显示设置为false就能够了, 具体可参考下图:
出现下载完毕没法安装更新的问题可能有多种状况. 主要的表现形式是: 没法进入到应用安装页面或者提示安装失败(签名不一致/文件解析失败).
若是apk没有被完整地下下来的话,或者下载下来的apk就是受损没法安装的,是确定无法正常安装的.
因此这里咱们能够先开启debug日志,而后获取到下载的apk路径,而后找到指定的文件打开看一下可否正常安装.(首先保证下载的文件是正确的).
注意这里的MD5值指的是应用APK文件的MD5值,而非应用签名文件的MD5值!!
之因此设置MD5值下载校验,就是为了防止文件下载被人篡改或者不完整,因此框架才会去对下载的APK进行MD5值的校验.
但不少人并不了解这其中的原理,因此初次使用的时候,很容易设置MD5的值是应用签名文件的MD5值,这就致使MD5值校验失败,应用没法进入到应用安装页面.
相信作过Android原生开发的人都知道,同一个包名下的应用,是不能够直接覆盖安装(更新升级)不一样签名的应用的. 同包名的应用只能够覆盖安装相同签名的应用apk.
若是你debug的时候没有配置和release相同的签名,那么是不能够直接覆盖升级到release包上的.
由于Android的设备终端的rom以及版本都各不相同,可能在某些定制的rom机器上使用通用的apk安装方式并不起做用. 这种问题出现的几率相对较低,当上述3点都没有问题的话,能够尝试使用不一样机型的机器来尝试可否安装,以排除特定设备机型的问题.
前提条件: 使用自定义接口或者直接传入UpdateEntity
进行更新.
这是由于UpdateEntity
对象的isForce
和isIgnorable
属性是互斥的.若是设置了isIgnorable
为true
,这个时候再设置isForce
为true
那么isForce
就会失效.由于强制更新的版本是不可能可忽略的,而可忽略的版本更新也不多是强制更新的.
由于flutter_xupdate底层调用的是XUpdate原生库, 更新UI是原生写的,所以要实现多语言国际化的话,须要使用原生的国际化进行配置.
最后附上常见的错误码,方便debug调试的时候发现问题.
错误码 | 备注 |
---|---|
2000 | 查询更新失败 |
2001 | 没有wifi |
2002 | 没有网络 |
2003 | 正在进行版本更新 |
2004 | 无最新版本 |
2005 | 版本检查返回空 |
2006 | 版本检查返回json解析失败 |
2007 | 已经被忽略的版本 |
2008 | 应用下载的缓存目录为空 |
3000 | 版本提示器异常错误 |
3001 | 版本提示器所在Activity页面被销毁 |
4000 | 新应用安装包下载失败 |
4001 | 读写权限申请失败 |
4002 | 取消下载 |
5000 | apk安装失败 |
5100 | 未知错误 |
以上就是我整理出来的所有内容, 喜欢的小伙伴必定要记得去项目的主页: https://github.com/xuexiangjys/flutter_xupdate star支持一下哦~
我是xuexiangjys,一枚热爱学习,爱好编程,致力于Android架构研究以及开源项目经验分享的技术up主。获取更多资讯,欢迎微信搜索公众号: 【个人Android开源之旅】