一.前言
? ? flutter發(fā)布到現(xiàn)在也有一年多了检眯,越來越多的猿加入flutter的大軍當中涎嚼。所在公司也非常鼓勵使用新的技術碴巾,所以就想著把目前android項目中的某些頁面替換為flutter特愿。利用flutter的優(yōu)點來提高移動端的開發(fā)效率蛾坯。
二.集成方式介紹
? ? flutter與原生native項目集成大致分為兩種方式:
? ? 1. 官方解決方案:就是將flutter作為module讓原生native工程直接依賴
? ? 2.閑魚flutter集成方案:將flutter項目打包成aar上傳至maven光酣,原生native工程通過maven引用
兩種方式各有優(yōu)缺點,在這里我采用的是第二種方案脉课。
三.集成步驟
? ? 因為也是初學flutter救军,在網(wǎng)上找了一大堆資料,最開始看到閑魚團隊的文章說是如果要把flutter項目打包成aar下翎,需要自己手動編寫腳本把flutter編譯后的產(chǎn)物打包到aar中才能用缤言。最后找到《Flutter混合開發(fā)之打包aar并上傳到nexus》這篇文章,發(fā)現(xiàn)其實打包aar很簡單视事,完全不需要寫拷貝flutter編譯后產(chǎn)物胆萧。當然也可能是閑魚的解決方案對應的早起beta版本的flutter,目前我采用的flutter版本是1.8.3,下面結合網(wǎng)上找的資料把整個集成流程梳理下俐东。
? ? 1. 運行命令創(chuàng)建flutter工程
flutter create -t module? xxxx(工程名稱)
? ? 以這種方式創(chuàng)建的工程結構如下跌穗,其中.android就跟我們原生native工程一樣,里面有java代碼虏辫,有build.gradle文件蚌吸。一般我們不會選擇去直接修改.android工程下的build.gradle文件,因為一旦flutter項目引用了新的第三方框架之后砌庄,運行 flutter pub get 命令之后羹唠,.android目錄會重新被生成一次,對build.gradle文件做的修改都會丟失娄昆。
? ? 2.執(zhí)行打包命令
flutter build apk
? ? 就會發(fā)現(xiàn)在工程根目錄/.android/Flutter/build/outputs/aar目錄下會生成個aar文件佩微,這個aar文件就是我們原生native工程需要引用的aar文件。
? ? 如果flutter工程中沒有引用第三方插件的話萌焰,那么集成步驟到這里就基本結束了哺眯,只需要把這里生成的aar文件直接放到原生native工程lib文件夾中或者上傳至maven 給原生nativie工程依賴就行了。
? ? 但是隨著flutter越來越完善扒俯,pub.dev上的開源插件也越來越多奶卓,本著不要重復造輪子的原則一疯,我們不可避免的會使用一些優(yōu)秀的第三方插件。但是使用 flutter build apk 命令打出來的aar是不包含第三方插件的jar的夺姑,那么我們原生native工程使用aar的時候墩邀,在涉及到第三方插件的功能處就會掛掉,會報NoSuchClassError盏浙。
? ? 拿connectivity這個插件來舉例磕蒲,正常的打包命令無法將下圖中的jar打進最終的aar中
3.借助fat-aar打包完整的aar
? ? 前人栽樹,后人乘涼只盹。所幸flutter 插件不能被打進aar包的問題在網(wǎng)上已經(jīng)有解決方案了,那就是借助fat-aar來把第三方插件的jar打進aar中兔院。這里我就直接用了github上現(xiàn)成的方案了殖卑。
? ? 但是這個方案必須要去修改.android目錄下的gradle腳本,來達到正確打包aar的目的坊萝。前面也說了.android目錄會隨著flutter pub get命令重新生成孵稽,這樣就導致我們可能會時不時的去修改gradle文件,顯得非常麻煩十偶。不過網(wǎng)上的大佬為了解決這個問題菩鲜,采用shell腳本來實現(xiàn)自動修改gradle文件然后打包上傳aar,我這里結合自己的項目惦积,精簡了下shell腳本接校。
4.借助shell腳本完成flutter的打包上傳一條龍服務
? ? 集成所需要的腳本如下:
flutter.sh: 打包腳本,完成對gradle文件配置修改狮崩、編譯打包aar蛛勉、上傳aar的工作。
dependencies_gradle_plugin.gradle:? 這個腳本在打包過程中會自動被.android/Flutter/build.gradle引用
setting_gradle_plugin.gradle:這個腳本在打包過程中會自動被.android/setting.gradle引用
gradle.properties:上傳maven的配置信息
uploadArchives.gradle:上傳aar腳本
這幾個文件保持目錄結構不變的話睦柴,只需要將gradle.properties里面的配置成自己的maven服務器地址诽凌,然后就可以直接用了。
文件下載地址:鏈接:https://pan.baidu.com/s/1_0aHcOYP58SbLwKZD8ehdw? 密碼:cb5v
5.原生native工程引用aar
? ? flutter的aar上傳到maven后坦敌,原生native工程就可以直接使用啦
implementation 'cn.thecover.flutter:thecover-flutter:1.0.18@aar'
四.后記
? ? 由于自己也是剛開始學習flutter侣诵,連這個集成工作都搞了一周,期間也大大小小踩了很多坑狱窘。文中如果有說的不對的地方杜顺,請多多指正。