在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開源之旅】