Flutter集成Android項目及踩坑記錄

在現(xiàn)有項目上集成Flutter

1.在andorid工程目錄上級目錄下執(zhí)行命令:

flutter create -t module xxxx(想要創(chuàng)建的flutter項目名)

執(zhí)行完后辽幌,一個和Android項目平級的flutter項目就已經(jīng)創(chuàng)建好了祠汇。

2.添加flutter到當(dāng)前Android項目:
在Android項目根目錄下的settings.gradle文件中,添加如下代碼:

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

然后修肠,在項目的app目錄下,build.gradle文件中,添加如下dependency:

implementation project(':flutter')

如上谈截,添加完之后,準(zhǔn)備工作就完成了。

集成Flutter頁面跳轉(zhuǎn)

通過繼承FlutterActivity跳到默認(rèn)頁面

1.Application:初始化Flutter

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        FlutterMain.startInitialization(this);
    }
}

2.Activity:繼承FlutterActivity

/**
 * debug模式原生跳轉(zhuǎn)到flutter界面會出現(xiàn)白屏簸喂,release包就不會出現(xiàn)白屏了
 */
public class MainFlutterActivity extends FlutterActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
  }

這樣以后毙死,我們就可以跳轉(zhuǎn)這個MainFlutterActivity,實(shí)現(xiàn)在Android工程里面進(jìn)入Flutter工程的默認(rèn)頁面了喻鳄。

通過FlutterView跳到指定頁面

首先通過Flutter.createFlutterView方法來創(chuàng)建一個FlutterView類型的View扼倘。它有三個構(gòu)造參數(shù):

public static FlutterView createView(Activity activity, Lifecycle lifecycle, String initialRoute)

三個參數(shù)分別是:
1.Activity,即當(dāng)前附著的Activity

2.LifeCycle除呵,且是不能為空(NonNull)的再菊,這也就要求我們必須用AppCompatActivity來承載FlutterView了,如果我們的Activity繼承自android.app.Activity是沒有g(shù)etLifeCycle()這個方法的颜曾。

public class FlutterViewActivity extends AppCompatActivity 復(fù)制代碼

3.initialRoute這是一個String類型的變量纠拔,根據(jù)不同的標(biāo)識跳轉(zhuǎn)不同的Flutter頁面:

Widget _widgetForRoute(String route) {
  switch (route) {
    case 'route1':
      return  MyHomePage(title: 'Flutter Demo Home Page1');
    case 'route2':
      return  MyHomePage(title: 'Flutter Demo Home Page2');
    default:
        return  MyHomePage(title: 'Flutter Demo Home Page2');
  }
}

然后在當(dāng)前Activity的OnCreate方法中,執(zhí)行:

FlutterView flutterView = Flutter.createView(this, getLifecycle(), "route1");   
setContentView(flutterView);

//或者:

setContentView(R.layout.activity_flutter);
rlContainer = findViewById(R.id.rl_container);
rlContainer.addView(flutterView)

集成到現(xiàn)有項目遇到的坑

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

E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
    [ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
    [ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
 A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.

SIGABRT
    0x146b
    #00    pc 0002210c    /system/lib/libc.so (tgkill+12) [armeabi-v7a::ac712d92afdda143205c7d7c8befc336]
    #01    pc 00013165    /system/lib/libc.so (pthread_kill+48) [armeabi-v7a::ac712d92afdda143205c7d7c8befc336]
    #02    pc 00013379    /system/lib/libc.so (raise+10) [armeabi-v7a::ac712d92afdda143205c7d7c8befc336]
    #03    pc 000120a3    /system/lib/libc.so [armeabi-v7a::ac712d92afdda143205c7d7c8befc336]
    #04    pc 000219c0    /system/lib/libc.so (abort+4) [armeabi-v7a::ac712d92afdda143205c7d7c8befc336]
    #05    pc 00af85ab    /data/app-lib/xxx.debug-1/libflutter.so [armeabi-v7a::a12434e0b53806a35730000001000000]

經(jīng)github上#24679及其他issue參考泛豪,得出以下解決方案:

Import flutter module to your HOST app(set binding, implementation, and instantiate view/fragment)
When you clean/rebuild from HOST app, flutter module does not generate properly
You need to open your flutter module in a separate AS
flutter clean
cd .android
./gradlew clean
./gradlew assembleDebug
Return to host app and run app(do not sync or rebuild) :)

翻譯過來就是:

本項目執(zhí)行清理命令稠诲。./gradlew clean
進(jìn)入 flutter module 項目執(zhí)行清理命令。flutter packages get;flutter clean
進(jìn)入 flutter module 的 .android 項目執(zhí)行清理命令和打包操作诡曙。./gradlew clean;./gradlew assemble
回到本項目執(zhí)行打包命令臀叙。./gradlew assemble

直接執(zhí)行下面命令即可:

$ ./gradlew clean;cd ../flutter_module;flutter packages get;flutter clean;cd .android/;./gradlew clean;./gradlew assemble;cd /d/workspace/app_proj/;./gradlew installDebug

后續(xù)假設(shè)你 flutter module 沒有更新過,那么以后修改本地項目之后价卤,就直接執(zhí)行./gradlew installDebug劝萤。 注意不要用studio工具運(yùn)行、rebuild或clean慎璧。

flutter_assets

assets下缺少flutter_assets也有可能造成此問題床嫌。具體可以參考:http://www.reibang.com/p/2d0bba84e57e

混淆

按照上述方式,debug版本沒問題炸卑,release卻報錯既鞠。需加以下混淆:

-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.* { *; }
-keep class myapp.flutter.*

參考資料

https://github.com/chinaltz/FlutterDemo
https://juejin.im/post/5c74dbeee51d45708f2a20c6
https://github.com/flutter/flutter/issues/24679
https://github.com/flutter/flutter/issues/25147
https://mp.weixin.qq.com/s/OGbH3G3wHVTUt-0EJit8RA

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盖文,隨后出現(xiàn)的幾起案子嘱蛋,更是在濱河造成了極大的恐慌,老刑警劉巖五续,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洒敏,死亡現(xiàn)場離奇詭異,居然都是意外死亡疙驾,警方通過查閱死者的電腦和手機(jī)凶伙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來它碎,“玉大人函荣,你說我怎么就攤上這事显押。” “怎么了傻挂?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵乘碑,是天一觀的道長。 經(jīng)常有香客問我金拒,道長兽肤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任绪抛,我火速辦了婚禮资铡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幢码。我一直安慰自己笤休,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布蛤育。 她就那樣靜靜地躺著宛官,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓦糕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天腋么,我揣著相機(jī)與錄音咕娄,去河邊找鬼。 笑死珊擂,一個胖子當(dāng)著我的面吹牛圣勒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摧扇,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼圣贸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扛稽?” 一聲冷哼從身側(cè)響起吁峻,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎在张,沒想到半個月后用含,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帮匾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年啄骇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘟斜。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡缸夹,死狀恐怖痪寻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虽惭,我是刑警寧澤槽华,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站趟妥,受9級特大地震影響猫态,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜披摄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一亲雪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疚膊,春花似錦义辕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至傀蚌,卻和暖如春基显,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背善炫。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工撩幽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箩艺。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓窜醉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艺谆。 傳聞我的和親對象是個殘疾皇子榨惰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容