flutter版本更新常見問題大盤點

前言

在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


常見問題

好了,言歸正傳,讓咱們簡單瞧一瞧,常見的問題都有哪些?緩存

  • 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": "一、優化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壓縮,會有問題)。

這裏有三個方法能夠解決:

  • 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對象的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 取消下載
5000 apk安裝失敗
5100 未知錯誤

最後

以上就是我整理出來的所有內容, 喜歡的小夥伴必定要記得去項目的主頁: https://github.com/xuexiangjys/flutter_xupdate star支持一下哦~

我是xuexiangjys,一枚熱愛學習,愛好編程,致力於Android架構研究以及開源項目經驗分享的技術up主。獲取更多資訊,歡迎微信搜索公衆號: 【個人Android開源之旅】
相關文章
相關標籤/搜索