最近在Android原生項(xiàng)目集成flutter,參照wiki步驟,寫了個(gè)demo編譯打包運(yùn)行都沒有任何問題。
但是集成到公司項(xiàng)目上時(shí),碰到一個(gè)很坑的問題,集成編譯沒問題,在原生頁(yè)面跳轉(zhuǎn)flutter頁(yè)面時(shí)閃退,報(bào)錯(cuò)Must be able to initialize the VM
,字面上意思就是flutter vm初始化失敗了。于是Google搜了一下,大致可以確定是flutter_assets
(https://github.com/flutter/flutter/issues/19818)這個(gè)目錄沒有編譯進(jìn)去。
于是將公司的apk和我寫的demo的apk解壓對(duì)比了一下,確實(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無法正常啟動(dòng),所以可以完全確定是缺少flutter_assets導(dǎo)致的。
嘗試解決1
上面的辦法是說把flutter module生成aar中的flutter_assets解壓拷貝到Android工程下。
于是我到目錄下找到aar,解壓打開,我擦。。。。。根本沒有flutter_assets。該方法行不通!
但是他猜測(cè)是gradle配置導(dǎo)致flutter_assets沒有被打包進(jìn)去(確實(shí)是因?yàn)間radle配置)。
嘗試解決2
于是繼續(xù)google,找了線索,是因?yàn)?strong>多渠道打包導(dǎo)致flutter_assets沒有被打包進(jìn)去。
這個(gè)issue碰到的主要問題有兩個(gè):
- 沒有遵循wiki步驟,沒有將Android project和my_flutter 放在同級(jí)目錄
- 沒有在flutter module的build.gradle中配置渠道信息
不幸的是,我參照上面的步驟,編譯出來的aar依舊沒有flutter_assets。。。。。
嘗試解決3
網(wǎng)上搜不到其他的解決辦法了,沒辦法,只能看編譯過程中哪里出了問題,于是對(duì)比了我的demo的build目錄和公司項(xiàng)目的build目錄,
下面是demo的flutter build目錄
下面是公司項(xiàng)目的flutter目錄
可以看出公司項(xiàng)目沒有打包assets,于是我就對(duì)比了一下build日志,把關(guān)于flutter的日志都對(duì)比了一下。
這個(gè)是demo編譯的日志
這個(gè)是公司項(xiàng)目的編譯日志
大致可以定位到時(shí)沒有執(zhí)行copyFlutterAssetsDevelopmentDebug
flutter module的build.gradle沒有執(zhí)行copyFlutterAssets,是它依賴的flutter.gradle執(zhí)行的。
找到$flutterRoot/packages/flutter_tools/gradle/flutter.gradle
,搜索copyFlutterAssets。
可以找到有個(gè)copyFlutterAssetsTask
,就是它沒有被執(zhí)行,看下gradle里是怎么寫的。
加了打印日志后發(fā)現(xiàn)走的是上面的if分支,通過代碼可以看出:
gradle根據(jù)mainModuleName
去找mergeAssets
,如果Android項(xiàng)目沒有配置project.rootProject.ext.mainModuleName
,就會(huì)默認(rèn)用"app"這個(gè)名字去找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 在同級(jí)目錄
- 如果是多渠道打包,需要在flutter module的build.gradle中配置渠道信息
- 如果Android項(xiàng)目app module的名字不是”app“,需要配置
project.rootProject.ext.mainModuleName
。
這個(gè)問題阿里大佬也發(fā)現(xiàn)了https://github.com/flutter/flutter/pull/27154
- flutter和studio升級(jí)到最新穩(wěn)定版,注意是穩(wěn)定版!!!dev,master分支上通常都有bug
后續(xù)打包遇到的問題
1、debug包正常,release包跳轉(zhuǎn)flutter頁(yè)面崩潰
解決方法:配置flutter混淆http://www.lxweimin.com/p/338422e3ecc1
2. 所有Android路由跳轉(zhuǎn)失效,我用的是com.chenenyu.router
解決辦法:更新路由插件到最新版