共计 3376 个字符,预计需要花费 9 分钟才能阅读完成。
前言
在 2020 年新冠疫情的时候, 我宅在家中鸿鹄之志, 于是乎我写了一个 flutter 的版本更新插件: flutter_xupdate, 并且将其公布在了 Google 建设的 Dart 插件平台上, 一年以来收到的反应还算不错, 具体可看下图所示:
但与此同时, 也收到了很多使用者的疑难.
为此, 我简略看了一下问题, 发现使用者之前可能压根就没有做过 Android 原生开发, 对 Android 的一些基础知识十分不足, 就会导致很多问题.
这里, 为了可能让大家更好地去应用 flutter_xupdate 实现一键版本更新, 我顺便为大家盘点了应用过程中可能呈现的几大问题, 为大家提前排排雷. 不仅如此, 我还顺便录了一期视频, 喜爱看视频的小伙伴是不是连忙三连反对一下呢?
视频地址如下: https://www.bilibili.com/video/BV1gy4y1g7pB/
https://www.bilibili.com/vide…
常见问题
好了, 言归正传, 让咱们简略瞧一瞧, 常见的问题都有哪些?
- 1. 无奈显示版本更新弹窗。
- 2. 版本更新提醒显示异样。
- 3. 下载结束无奈装置更新。
- 4. 强制更新不起作用。
- 5. 国际化问题。
上面我将一一为大家做出解答.
无奈显示版本更新弹窗
呈现无奈显示版本更新弹窗的问题可能有多种状况. 次要的表现形式是: 更新产生报错或者显示以后无版本更新.
1. 接口的问题
前提条件: 应用的框架提供的默认接口(默认更新).
申请的 url 没有返回默认格局的 json, 那样 json 序列化就会有问题, 导致版本信息获取失败, 无奈判断更新状态.
因为 flutter_xupdate 底层调用的是 XUpdate, 其默认 json 格局如下所述:
{
"Code": 0, // 0 代表申请胜利,非 0 代表失败
"Msg": "", // 申请出错的信息"UpdateStatus": 1, // 0 代表不更新,1 代表有版本更新,不须要强制降级,2 代表有版本更新,须要强制降级"VersionCode": 3, // 本地也会对版本号进行校验, 确保降级的时候, 版本号自增"VersionName":"1.0.2","ModifyContent":"1、优化 api 接口。\r\n2、增加应用 demo 演示。\r\n3、新增自定义更新服务 API 接口。\r\n4、优化更新提醒界面。","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 压缩,会有问题)。
这里有三个办法能够解决:
- 1. 应用
flutter build apk --no-shrink
指令代替。 - 2. 被动敞开 R8 压缩,应用 D8 压缩进行代替。办法就是进入到我的项目的
android
目录下,批改gradle.properties
如下:
org.gradle.jvmargs=-Xmx1536M
# 开启 D8 压缩
android.enableD8=true
android.useAndroidX=true
android.enableJetifier=true
# 敞开 R8 压缩
#android.enableR8=true
- 3. 间接应用 android 的原生打包形式进行打包。办法就是进入到以后我的项目的 android 目录下,应用
./gradlew assembleRelease
命令进行打包。
版本更新提醒显示异样
前提条件: 应用自定义更新弹窗款式, 设置了 topImageRes
属性.
呈现的景象个别是在 debug 下失常显示, 然而在 release 下却显示异样, 详情如下:
呈现这种问题, 次要起因是更新弹窗的顶部款式自定义应用的是反射的援用形式,所以在打 release 包的时候,如果咱们不设置 shrinkResources
为 false 的话,打包程序就会默认革除你自定义的顶部图片,导致在 release 下图片不显示。
所以这个时候,咱们只须要把 shrinkResources
显示设置为 false 就能够了, 具体可参考下图:
下载结束无奈装置更新
呈现下载结束无奈装置更新的问题可能有多种状况. 次要的表现形式是: 无奈进入到利用装置页面或者提醒装置失败(签名不统一 / 文件解析失败).
1.apk 下载的问题
如果 apk 没有被残缺公开下来的话, 或者下载下来的 apk 就是受损无奈装置的, 是必定没法失常装置的.
所以这里咱们能够先开启 debug 日志, 而后获取到下载的 apk 门路, 而后找到指定的文件关上看一下是否失常装置.(首先保障下载的文件是正确的).
2.MD5 值设置的问题
留神这里的 MD5 值指的是 利用 APK 文件的 MD5 值,而非应用签名文件的 MD5 值!!
之所以设置 MD5 值下载校验, 就是为了避免文件下载被人篡改或者不残缺, 所以框架才会去对下载的 APK 进行 MD5 值的校验.
但很多人并不理解这其中的原理, 所以首次应用的时候, 很容易设置 MD5 的值是利用签名文件的 MD5 值, 这就导致 MD5 值校验失败, 利用无奈进入到利用装置页面.
3. 签名的问题
置信做过 Android 原生开发的人都晓得, 同一个包名下的利用, 是不能够间接笼罩装置 (更新降级) 不同签名的利用的. 同包名的利用只能够笼罩装置雷同签名的利用 apk.
如果你 debug 的时候没有配置和 release 雷同的签名, 那么是不能够间接笼罩降级到 release 包上的.
4. 设施终端的问题
因为 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 开源之旅】