混棧開發之Android端Flutter熱更新

Flutter熱更新demo

背景

Flutter暫時放棄熱更新的官方解釋

Google從性能和安全兩方面考慮,暫時不會推出熱更新,把這個功能交給用戶和第三方去處理。結合公司不願提供任何資源,只能走捷徑的方式使用Tinker去實現Flutter的熱更新。

分析

Native項目可以接入Tinker進行熱更新,而且有Bugly做爲補丁版本控制檯,來上傳下發補丁,統計數量,不需要再去實現,省了不少事。

接入Flutter模塊,修改Dart代碼後,執行buildTinkerPatchRelease,生成patch_signed_7zip.apk補丁包,解開patch_signed_7zip.apk,裏面也生成了Flutter模塊的補丁so包。測試直接使用Tinker進行熱更新,Dart代碼的修改並未生效。

由於Flutter有自己的一套so加載流程,Tinker無法加載到Flutter的補丁so包。分析下Flutter的so加載流程,在FlutterLoader類裏可以通過反射字段aotSharedLibraryName把它set進去,這樣就可以實現加載補丁so文件,測試Dart代碼的修改生效。

但是在集成FlutterBoost後,這樣就行不通了。因爲Flutter的初始化封裝在FlutterBoost類裏,FlutterBoost裏又new了一個FlutterEngine引擎類,傳入一個空字符數組的FlutterShellArgs。需要我們把反射方法放在裏面的FlutterMain.startInitialization(mPlatform.getApplication());方法後執行,或者把補丁so包路徑傳進來,add到flutterShellArgs裏。前一種方法需要反射,性能會有損耗,後一種雖然沒什麼損耗,只是需要把路徑層層傳進來,改動有點大。不過FlutterBoost做爲模塊依賴進來,改動一下也是可以的,測試生效。

結論

整個修復過程,都是利用Flutter自身加載so文件去實現,所以不會出現兼容性和安全性的問題,而且也不會對系統性能有任何大的損耗。同時,Tinker開源,可以方便的查閱Tinker的源碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章