最近在Android原生項(xiàng)目集成flutter,參照wiki步驟助赞,寫了個demo編譯打包運(yùn)行都沒有任何問題效斑。
但是集成到公司項(xiàng)目上時非春,碰到一個很坑的問題,集成編譯沒問題缓屠,在原生頁面跳轉(zhuǎn)flutter頁面時閃退奇昙,報錯Must be able to initialize the VM
,字面上意思就是flutter vm初始化失敗了敌完。于是Google搜了一下储耐,大致可以確定是flutter_assets
(https://github.com/flutter/flutter/issues/19818)這個目錄沒有編譯進(jìn)去。
于是將公司的apk和我寫的demo的apk解壓對比了一下滨溉,確實(shí)是flutter_assets
沒有打包進(jìn)去弧岳。
下面是正常打包進(jìn)去的flutter_assets
。
其中:
- isolate_snapshot_data 應(yīng)用程序數(shù)據(jù)段
- isolate_snapshot_instr 應(yīng)用程序指令段
- vm_snapshot_data VM虛擬機(jī)數(shù)據(jù)段
- vm_snapshot_instr VM虛擬機(jī)指令段
這些都是flutter vm必須的文件业踏,缺少了這些vm無法正常啟動禽炬,所以可以完全確定是缺少flutter_assets導(dǎo)致的。
嘗試解決1
上面的辦法是說把flutter module生成aar中的flutter_assets解壓拷貝到Android工程下勤家。
于是我到目錄下找到aar腹尖,解壓打開,我擦伐脖。热幔。。讼庇。绎巨。根本沒有flutter_assets。該方法行不通蠕啄!
但是他猜測是gradle配置導(dǎo)致flutter_assets沒有被打包進(jìn)去(確實(shí)是因?yàn)間radle配置)场勤。
嘗試解決2
于是繼續(xù)google,找了線索歼跟,是因?yàn)?strong>多渠道打包導(dǎo)致flutter_assets沒有被打包進(jìn)去和媳。
這個issue碰到的主要問題有兩個:
- 沒有遵循wiki步驟,沒有將Android project和my_flutter 放在同級目錄
- 沒有在flutter module的build.gradle中配置渠道信息
不幸的是哈街,我參照上面的步驟留瞳,編譯出來的aar依舊沒有flutter_assets。骚秦。她倘。璧微。。
嘗試解決3
網(wǎng)上搜不到其他的解決辦法了硬梁,沒辦法往毡,只能看編譯過程中哪里出了問題,于是對比了我的demo的build目錄和公司項(xiàng)目的build目錄靶溜,
下面是demo的flutter build目錄
下面是公司項(xiàng)目的flutter目錄
可以看出公司項(xiàng)目沒有打包assets,于是我就對比了一下build日志懒震,把關(guān)于flutter的日志都對比了一下罩息。
這個是demo編譯的日志
這個是公司項(xiàng)目的編譯日志
大致可以定位到時沒有執(zhí)行copyFlutterAssetsDevelopmentDebug
flutter module的build.gradle沒有執(zhí)行copyFlutterAssets,是它依賴的flutter.gradle執(zhí)行的个扰。
找到$flutterRoot/packages/flutter_tools/gradle/flutter.gradle
瓷炮,搜索copyFlutterAssets。
可以找到有個copyFlutterAssetsTask
递宅,就是它沒有被執(zhí)行娘香,看下gradle里是怎么寫的。
加了打印日志后發(fā)現(xiàn)走的是上面的if分支办龄,通過代碼可以看出:
gradle根據(jù)mainModuleName
去找mergeAssets
烘绽,如果Android項(xiàng)目沒有配置project.rootProject.ext.mainModuleName
,就會默認(rèn)用"app"這個名字去找mergeAssets
俐填,而我們公司項(xiàng)目的app module的名字不是"app"安接,也沒有配置project.rootProject.ext.mainModuleName
,所以沒找到mergeAssets英融,mergeAssets為null盏檐,就沒有去執(zhí)行copyFlutterAssets
。
至此原因找到驶悟,在Android project根目錄build.gradle
配置下mainModuleName
胡野,clean Android module和flutter module,重新編譯運(yùn)行痕鳍,搞定硫豆!
問題總結(jié)
- 遵循wiki步驟,flutter project和Android project 在同級目錄
- 如果是多渠道打包笼呆,需要在flutter module的build.gradle中配置渠道信息
- 如果Android項(xiàng)目app module的名字不是”app“够庙,需要配置
project.rootProject.ext.mainModuleName
。
這個問題阿里大佬也發(fā)現(xiàn)了https://github.com/flutter/flutter/pull/27154
- flutter和studio升級到最新穩(wěn)定版抄邀,注意是穩(wěn)定版T耪!!境肾!dev剔难,master分支上通常都有bug
后續(xù)打包遇到的問題
1胆屿、debug包正常,release包跳轉(zhuǎn)flutter頁面崩潰
解決方法:配置flutter混淆http://www.reibang.com/p/338422e3ecc1
2. 所有Android路由跳轉(zhuǎn)失效偶宫,我用的是com.chenenyu.router
解決辦法:更新路由插件到最新版