Demo包含
項(xiàng)目結(jié)構(gòu)
build_flutter_android Android 主工程
--flutter_module Android Library 包含flutter運(yùn)行環(huán)境和dart代碼
build_flutter_module Flutter Module 工程
app 依賴 flutter_module
地址
https://github.com/designDo/add_to_app_demo
要解決的問(wèn)題and方案
問(wèn)題
- 主工程用AAR的方式嵌入Flutter诫尽,以解決組件化拆分块促,主工程只需簡(jiǎn)單的引入一個(gè)module论巍,module打包并上傳至maven抢蚀,可實(shí)現(xiàn)AAR引入渠旁。
- 組內(nèi)不做Flutter開(kāi)發(fā)的人員無(wú)需Flutter環(huán)境攀例,同時(shí)可以解決開(kāi)發(fā)人員環(huán)境不一致問(wèn)題
- 打包接入CI/CD,簡(jiǎn)化流程
- 開(kāi)發(fā)和打包時(shí)最好無(wú)需改動(dòng)Flutter工程
- 參考了一些例子顾腊,使用fat-aar的方式粤铭,將flutter工程中android項(xiàng)目從application改為library,需要改動(dòng)第三個(gè)地方杂靶。每次切換的時(shí)候改動(dòng)太大梆惯。
方案
- 將Flutter運(yùn)行環(huán)境(flutter.jar flutter.so)依賴進(jìn)flutter_module中
- app 依賴 flutter_module
- 主工程提供一個(gè)切換模式的變量,標(biāo)記 開(kāi)發(fā)/打包
實(shí)驗(yàn)
1. 跳轉(zhuǎn)到Flutter module下
cd build_flutter_module
2. 下載一些依賴吗垮,生成.android文件垛吗,會(huì)在 .gradle/caches/modules-2/files-2.1/io.flutter下生成所有版本的flutter.jar和flutter.so, 生成 .flutter-plugins 文件標(biāo)示所有三方插件的本地依賴地址,其中 some_plugin_path/android 即為插件原生代碼
flutter pub get
3. 打包 --no-release --no-debug 等模式 --build-number指定版本號(hào)
flutter build aar --no-profile --build-number=1.0.0
4. gradle.properties 文件中配置 IS_SOURCE=false 代表為資源依賴烁登,而不是源代碼依賴
cd ..
cd build_flutter_android
./gradlew build 或者 sync 一下
直接運(yùn)行 or
./gradlew assembleRelease打包
日常開(kāi)發(fā)
修改gradle.properties IS_SOURCE=true
./gradlew build 或者 sync 一下
debug模式運(yùn)行
build_flutter_module flutter 項(xiàng)目完全沒(méi)有改動(dòng)怯屉,完美
說(shuō)明
flutter_module添加了一個(gè) engine.version 的文件,遠(yuǎn)程下載依賴,不需要導(dǎo)入flutter.jar 和 flutter.so 源文件
可以再添加一個(gè) aar-version 锨络,標(biāo)記當(dāng)前flutter工程的build版本
當(dāng)打包時(shí)資源引入方式:
- flutter 工程 build aar --no-debug --no-profile --build-number=xxx
- IS_SOURCE=false
- ./gradlew build
- ./gradlew assembleRelease
當(dāng)打包時(shí)源碼引入方式:
- IS_SOURCE=true
- ./gradlew build
- ./gradlew assembleRelease
主工程的maven配置需添加
//一些三方的plugin原生代碼在這里
maven {
url "https://storage.flutter-io.cn/download.flutter.io"
}
//dart代碼打包產(chǎn)物赌躺,和自定義的 flutter plugin 原生代碼
maven {
url '../add_to_app_demo/build_flutter_module/build/host/outputs/repo'
}
Flutter engine.version 位置
flutterSDKPath/bin/internal/engine.version
//獲取版本號(hào)
最關(guān)鍵的Flutter資源依賴
String engineVersion = "1.0.0-"
File engineVersionFile = file("engine.version")
engineVersionFile.eachLine { line ->
engineVersion += line
}
dependencies {
//flutter so
debugApi "io.flutter:armeabi_v7a_debug:$engineVersion"
debugApi "io.flutter:arm64_v8a_debug:$engineVersion"
releaseApi "io.flutter:armeabi_v7a_release:$engineVersion"
releaseApi "io.flutter:arm64_v8a_release:$engineVersion"
//flutter embed
releaseApi "io.flutter:flutter_embedding_release:$engineVersion"
debugApi "io.flutter:flutter_embedding_debug:$engineVersion"
//other native module
debugImplementation 'com.sia.build_flutter_module:flutter_debug:1.0.0'
releaseImplementation 'com.sia.build_flutter_module:flutter_release:1.0.0'
debugImplementation 'io.flutter.plugins.deviceinfo:device_info_debug:1.0.0'
releaseImplementation 'io.flutter.plugins.deviceinfo:device_info_release:1.0.0'
}
TODO:
當(dāng)flutter-plugin不是以 io.flutter.plugin.xxx 包名開(kāi)頭時(shí),源碼依賴方式下足删,插件的原生代碼庫(kù)需要單獨(dú)進(jìn)行依賴
自定義一個(gè)Flutter plugin 拿進(jìn)來(lái)測(cè)試一下