前言

在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=trueandroid.useAndroidX=trueandroid.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对象的isForceisIgnorable属性是互斥的.如果设置了isIgnorabletrue,这个时候再设置isForcetrue那么isForce就会生效.因为强制更新的版本是不可能可疏忽的,而可疏忽的版本更新也不可能是强制更新的.

国际化问题

因为flutter_xupdate底层调用的是XUpdate原生库, 更新UI是原生写的,因而要实现多语言国际化的话,须要应用原生的国际化进行配置.

错误码

最初附上常见的错误码,不便debug调试的时候发现问题.
错误码备注
2000查问更新失败
2001没有wifi
2002没有网络
2003正在进行版本更新
2004无最新版本
2005版本查看返回空
2006版本查看返回json解析失败
2007曾经被疏忽的版本
2008利用下载的缓存目录为空
3000版本提醒器异样谬误
3001版本提醒器所在Activity页面被销毁
4000新利用安装包下载失败
4001读写权限申请失败
4002勾销下载
5000apk装置失败
5100未知谬误

最初

以上就是我整理出来的全部内容, 喜爱的小伙伴肯定要记得去我的项目的主页: https://github.com/xuexiangjys/flutter_xupdate star反对一下哦~

我是xuexiangjys,一枚酷爱学习,喜好编程,致力于Android架构钻研以及开源我的项目教训分享的技术up主。获取更多资讯,欢送微信搜寻公众号:【我的Android开源之旅】