Flutter踩坑

1.在Android Studio 上Android項目混編Flutter

按照官方文檔 https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps

創(chuàng)建一個Flutter module

打開Terminal 運行:flutter create -t module my_flutter

完成后 命令:cd my_flutter/.android

運行:gradlew flutter:assembleDebug

在自己的項目的settings.gradle中添加:


include ':app'
setBinding(new Binding([gradle: this]))
evaluate(new File(
        settingsDir.parentFile,
        '項目名/my_flutter/.android/include_flutter.groovy'
))

引用module:在app/build.gradle 里 implementation project(':flutter')

按文檔編寫好java代碼和dart代碼后篮幢,就可以嘗試運行了。

坑一:有debug就有release

所以我運行了gradlew flutter:assembleRelease生成了flutter-release.aar
文檔上并未說明弛秋。

坑二:運行崩潰

VM snapshot must be valid.
Check failed: vm. Must be able to initialize the VM.

網(wǎng)上的辦法http://www.reibang.com/p/9b96999fc385

但當(dāng)我在flutter module的build文件的android節(jié)點添加

project.android.libraryVariants.all { variant ->
    def targetAssets = "${project.buildDir}/intermediates/flutter/${variant.name}"
    def customSourceSet = variant.getSourceSets()[0]
    if (customSourceSet instanceof com.android.build.gradle.internal.api.DefaultAndroidSourceSet) {
        customSourceSet = (DefaultAndroidSourceSet)customSourceSet
        customSourceSet.getAssets().srcDirs(targetAssets)
    }
}

DefaultAndroidSourceSet無法編譯。所以我放棄了些己。

我修改了flutter_sdk目錄下packages/flutter_tools/gradle/flutter.gradle文件

找到
variant.outputs[0].processResources.dependsOn(copyFlutterAssetsTask)
修改成
variant.outputs[0].processResources.dependsOn(flutterTask)

我并不清楚這個修改是否起決定性作用(坑四發(fā)現(xiàn)此改動并沒有什么用)锄禽。
我最終是解壓了flutter-debug.aar 找到assets下的flutter_assets



把flutter_assets添加到項目的app/assets里

image.png

雖然flutter-release.aar下也有,但文件內(nèi)容不一樣



因為debug下的flutter_assets已經(jīng)解決了該運行崩潰的問題磺平,所以并未繼續(xù)探究魂仍。

坑三:簽名打包,運行崩潰褪秀。

[FATAL:flutter/shell/platform/android/library_loader.cc(24)] Check failed: result.

既然debug運行ok蓄诽,八成就是簽名文件的問題了。ProGuard Rules for app 添加:

-keep class io.flutter.facade.**{*;}
-keep class io.flutter.plug.**{*;}
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }

坑四:更新 dart 代碼 無效

當(dāng)你覺得差不多可以玩起來的時候媒吗,你發(fā)現(xiàn)無論怎么build仑氛,你更改的dart內(nèi)容都無法出現(xiàn)在你的app上。
問題在哪闸英?不能動態(tài)更新锯岖?
這便是復(fù)制flutter_assets帶來的問題。(所以坑二的問題就不能這么解決了)

flutter build 的內(nèi)容怎么讓Android來運行呢甫何?
看flutter_assets里的這些文件

vm_snapshot_data出吹、vm_snapshot_instr、isolate_snapshot_data辙喂、isolate_snapshot_instr

當(dāng)flutter 程序更新時捶牢,復(fù)制flutter_assets的內(nèi)容也要重新替換才行,但這并未長久之計巍耗。

當(dāng)時嘗試刪除復(fù)制在app/assets下的flutter_assets秋麸,意外的發(fā)現(xiàn)可以正常運行了,但是簽名打包依然不行炬太。這讓想起了之前的flutter-release.aar灸蟆,在我重新生成flutter-release.aar后,簽名打包也ok了亲族。

文獻參考:http://www.reibang.com/p/5d916f61ff62
編譯原理:https://yq.aliyun.com/articles/607014

坑五:如何更新flutter-release.aar和flutter-debug.aar

在my_flutter 下 運行 flutter build apk 和 flutter run 就可以炒考。目前我是這樣處理的可缚。

坑六:當(dāng)你升級你的Flutter版本后,之前的項目運行崩潰時

[ERROR:flutter/runtime/dart_vm.cc(265)] VM snapshot must be valid.

Upgrade your copy of Flutter
運行flutter upgrade,再重新flutter run

坑七:如何保持Flutter Module 和Android原生項目 獨立斋枢。

我發(fā)現(xiàn)我一開始創(chuàng)建flutter module 時就錯了帘靡,應(yīng)該在app項目同級目錄創(chuàng)建,而非子級杏慰。
因為它們本身就是相互獨立的测柠!



所以setting.gradle還是如文檔說的一樣:

setBinding(new Binding([gradle: this]))
evaluate(new File(
        settingsDir.parentFile,
        'my_flutter_module/.android/include_flutter.groovy'
))

坑八:重新創(chuàng)建Flutter

將Flutter項目下面的android/ios目錄刪除然后用"flutter create ."即可重新創(chuàng)建。

坑九:Check failed: vm. Must be able to initialize the VM

這個編譯失敗的問題一直無法解決缘滥,網(wǎng)上的一堆回答轰胁,基本都是同樣一個出處。而且不一定有效朝扼。我自己反復(fù)倒騰赃阀,好像明白了些什么。
flutter 是一個獨立的項目擎颖,所以它單獨運行的時候會創(chuàng)建自己的VM榛斯,也就是它有它自己的編譯環(huán)境。會不會是flutter 構(gòu)建的編譯環(huán)境和主APP程序的編譯環(huán)境不一致呢搂捧?
在點開flutter項目的.android目錄驮俗,果然發(fā)現(xiàn)了差異。我的gradle 版本不一致允跑。
(為什么會出現(xiàn)不一致的情況王凑,還待探究)在手動更改一致后,重新編譯就ok了聋丝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末索烹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子弱睦,更是在濱河造成了極大的恐慌百姓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件况木,死亡現(xiàn)場離奇詭異垒拢,居然都是意外死亡,警方通過查閱死者的電腦和手機火惊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門子库,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矗晃,你說我怎么就攤上這事⊙绫叮” “怎么了张症?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵仓技,是天一觀的道長。 經(jīng)常有香客問我俗他,道長脖捻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任兆衅,我火速辦了婚禮地沮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羡亩。我一直安慰自己摩疑,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布畏铆。 她就那樣靜靜地躺著雷袋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辞居。 梳的紋絲不亂的頭發(fā)上楷怒,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音瓦灶,去河邊找鬼鸠删。 笑死,一個胖子當(dāng)著我的面吹牛贼陶,可吹牛的內(nèi)容都是我干的刃泡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼每界,長吁一口氣:“原來是場噩夢啊……” “哼捅僵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眨层,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤庙楚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后趴樱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馒闷,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年叁征,在試婚紗的時候發(fā)現(xiàn)自己被綠了纳账。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡捺疼,死狀恐怖疏虫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤卧秘,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布呢袱,位于F島的核電站,受9級特大地震影響翅敌,放射性物質(zhì)發(fā)生泄漏羞福。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一蚯涮、第九天 我趴在偏房一處隱蔽的房頂上張望治专。 院中可真熱鬧,春花似錦遭顶、人聲如沸张峰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挟炬。三九已至,卻和暖如春嗦哆,著一層夾襖步出監(jiān)牢的瞬間谤祖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工老速, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粥喜,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓橘券,卻偏偏與公主長得像额湘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旁舰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345