以下模塊均基于flutter 1.9.1版本進(jìn)行討論,更高版本可能不適用
一、我們面臨了什么?
目前,我們團(tuán)隊(duì)有六個(gè)人,真正參與Flutter開發(fā)僅少數(shù)同學(xué)。
項(xiàng)目集成Flutter采用工程依賴,導(dǎo)致團(tuán)隊(duì)每一個(gè)人都需要安裝flutter環(huán)境(對(duì)新人不友好),并且flutter項(xiàng)目夾雜在android工程里,導(dǎo)致git經(jīng)常會(huì)出現(xiàn)修改提示(很容易導(dǎo)致誤刪)。對(duì)于flutter的更新非參與人員無(wú)感知(其他成員的老包拿不到flutter的最新代碼)
正因?yàn)槿绱?,我們借助這次機(jī)會(huì)讓flutter模塊由原來的工程依賴變?yōu)閍ar依賴,順便開一個(gè)組件化的頭。
二、對(duì)于方案的選擇?
1.Flutter集成方案:
目前市面上flutter集成到項(xiàng)目里有兩種方案:
官方解決方案:就是將flutter作為module讓原生native工程直接依賴 (當(dāng)前方案,再贅述)
閑魚flutter集成方案:將flutter項(xiàng)目打包成aar上傳至maven,原生native工程通過maven引用
優(yōu)點(diǎn):
1.不開發(fā)flutter的同學(xué)無(wú)需安裝環(huán)境與工程。
2.flutter更新,所有同學(xué)都可以看到新頁(yè)面。
3.更有利于組件化開展
缺點(diǎn):
1.調(diào)試包與正式包都需要單獨(dú)編譯,測(cè)試較為麻煩
2.上線前需要主動(dòng)更新版本號(hào)。
2、Flutter測(cè)試編譯方案
(1)本地maven庫(kù)依賴編譯
將flutter工程打出的aar包,放在本地maven庫(kù)。原生工程本地maven依賴,找到aar并集成到主工程去
(2)文件傳遞編譯
將flutter工程打出的aar包,通過腳本移動(dòng)到原生工程,把a(bǔ)ar通過git方式添加到項(xiàng)目中去。工程依賴lib文件夾下的aar
(3)遠(yuǎn)程maven庫(kù)依賴編譯
將本地aar放到遠(yuǎn)端maven倉(cāng)庫(kù),本地通過gradle方式引用。
最終,我們選擇線上環(huán)境非開發(fā)人員采用(3)方式依賴。測(cè)試與開發(fā)采用(1)方式依賴。(2)方式由于aar包過于大(50m左右),對(duì)于git下載不利,所以就放棄了。
三、需要做哪些步驟?
第一部分:flutter部分準(zhǔn)備
1.遷移flutter工程位置,獨(dú)立出flutter工程
2.配置module報(bào)名,撰寫相關(guān)打包腳本
(1)本地依賴腳本
(2)遠(yuǎn)端maven庫(kù)上傳腳本
第二部分:配置原生端相關(guān)依賴
1.創(chuàng)建flutterComponent組件
2.配置本地模塊依賴
3.配置遠(yuǎn)端模塊依賴
第三部分:maven庫(kù)相關(guān)配置(本文略)
四、具體工作
第一部分:flutter配置
1.將flutter工程從原有的工程文件夾中移除,具體位置與Android項(xiàng)目平齊,圖示如下

2.配置包名(主要是以前太隨意了)
//在yaml文件下
module: androidPackage: cn.yemanlin.flutter
3.撰寫python腳本(略)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import sys
__build_name = "-type"
__version_name = "-version"
__maven_name = "-maven"
__maven_config = "apply plugin: 'maven-publish'\n" \
"apply plugin: 'maven'\n" \
"uploadArchives [\n" \
"repositories [\n" \
"mavenDeployer [\n" \
"repository(url: {mavenReleasesUrl}) [\n" \
"authentication(userName: {maven_local_username}, password: {maven_local_password})\n" \
"]\n" \
"snapshotRepository(url: {mavenSnapshotUrl}) [\n" \
"authentication(userName: {maven_local_username}, password: {maven_local_password})\n" \
"]\n" \
"pom.project [\n" \
"version {version}\n" \
"artifactId {maven_pom_artifactId}\n" \
"groupId {maven_pom_groupId}\n" \
"packaging {maven_pom_packaging}\n" \
"description {maven_pom_description} \n" \
"]]]]\n"
def start(args):
build_type = ""
version = ""
maven = ""
index = 1
while index < len(args):
if args[index] == __build_name:
index += 1
build_type = args[index]
elif args[index] == __version_name:
index += 1
version = args[index]
elif args[index] == __maven_name:
index += 1
maven = args[index]
else:
index += 1
if build_type == "" and version == "" and maven == "":
print('格式錯(cuò)誤,應(yīng)參照:\n'
' 例1:build_android_auto.py -type release -version 0.0.1 -maven snapshot\n'
' 例2:build_android_auto.py -type debug\n')
exit(0)
assert build_type == "release" or build_type == "debug"
assert maven == "" or ((maven == "release" or maven == "snapshot") and version != "")
print(f'your args: buildType: {build_type} version:{version} mavenType:{maven}')
need_upload = (maven == "release" or maven == "snapshot") and version != ""
# 清理工作
if need_upload:
out = os.system('git stash')
out = os.system('flutter clean')
out = os.system('git reset --hard')
out = os.system('git stash apply')
#構(gòu)建開始
build(build_type)
if need_upload:
# 上傳maven庫(kù)
upload(version, maven)
return
def build(build_type="debug"):
print(f"start build {build_type}")
if build_type == "debug":
out = os.system('flutter build aar --debug')
print(out)
elif build_type == "release":
out = os.system('flutter build aar --release')
print(out)
return
def upload(version, maven_type):
print(f"start config {version} {maven_type}")
if maven_type == "snapshot":
full_version = f'"{version}-SNAPSHOT"'
elif maven_type == "release":
full_version = f'"{version}-release"'
else:
raise Exception("unknown maven type!")
config = __maven_config.format(
mavenReleasesUrl='" 自己填寫 "',
mavenSnapshotUrl='" 自己填寫 "',
maven_local_username='" 自己填寫 "',
maven_local_password='" 自己填寫 "',
version=full_version,
maven_pom_artifactId='" 自己填寫 "',
maven_pom_groupId='" 自己填寫 "',
maven_pom_packaging='"aar"',
maven_pom_description='"description"').replace("[", "{").replace("]", "}")
modify_file_append(".android/Flutter/build.gradle", "apply from", config)
print("start build .")
os.chdir("./.android")
out = os.system("./gradlew assembleRelease")
print(out)
print("start upload .")
out = os.system("./gradlew uploadArchives")
print(out)
# 清理工作
out = os.system('git reset --hard')
print(out)
out = os.system('git stash apply')
print(out)
print("\ndone.")
return
def modify_file_append(file_path, start, content):
with open(file_path, "r") as f:
lines = f.readlines()
f.close()
with open(file_path, 'w') as f:
for line in lines:
f.write(line)
if line.startswith(start):
f.write(content)
f.close()
return
def modify_file(file_path, prefix, content):
with open(file_path, "r") as f:
lines = f.readlines()
f.close()
with open(file_path, 'w') as f:
for line in lines:
if line.startswith(prefix):
line = content
f.write(line)
f.close()
return
if __name__ == "__main__":
start(sys.argv)
4.使用
哈哈哈哈,腳本里有,自己看吧。
第二部分:Android原生配置
1.在setting.gradle中刪除下面兩句話(解除以前的工程依賴)
setBinding(new Binding([gradle: this]))
evaluate(new File( settingsDir.parentFile,'flutter/yemanlin/.android/include_flutter.groovy' ))
2.創(chuàng)建一個(gè)新的組件(詳情見另一篇文章)
//1.在項(xiàng)目build.gradle下進(jìn)行配置
allprojects{
repositories {
//flutter嵌入層
maven { url 'http://download.flutter.io' }
//本地flutter maven庫(kù)(這個(gè)很關(guān)鍵,也就是為什么要把項(xiàng)目放在與工程平齊的地方)
maven { url '../../flutter/yemanlin/build/host/outputs/repo' }
}
}
//2.在app的build.gradle下進(jìn)行配置
repositories {
flatDir {
dirs project(':flutterComponent').file('libs') //flutterComponent就是組件名字
}
}
//3.在我們flutter的組件里進(jìn)行配置
dependencies {
//flutter 打包后,內(nèi)部不會(huì)帶aar包,所以flutter依賴的aar包需要手動(dòng)遷移到本地Lib文件夾
implementation files('libs/flutter_drag_scale-release.aar')
.......
//方式一:遠(yuǎn)端依賴,把相關(guān)aar要寫到這里
api ("cn.yemanlin.flutter:flutter_release:1.0"){
exclude module: 'sqflite'
}
//方式二:本地依賴,需要先用flutter工程進(jìn)行本地編譯
api ("cn.yemanlin.flutter.test:flutter_debug:1.0")
}
本期分享結(jié)束