目的:
在原生app开发时需要嵌入flutter页面时,把flutter的module导入给原生使用。
主要流程是:
1.flutter工程师把自己的flutter module代码推到公司的代码仓库。
2.然后在代码仓库中的GitHub Actions或者GitLab CI、Jenkins配置CI脚本,配置完成后
经过CI/CD 自动化脚本,把flutter module打包成AAR(给android使用)、Framework(给ios使用)。
3.然后在经过脚本操作把AAR、Framework复制到原生项目在代码仓库中的目录中,(如 Android 的 libs/、iOS 的 Frameworks/)。
4.原生只需要git pull操作更新到本地,再经过原生工程师进行编译就可以使用到最新的flutter module了。
所以最重要的就是配置ci脚本。
- 工作流配置文件(.github/workflows/flutter_ci.yml)
name: Flutter 自动编译并同步到原生项目
on:
push:
paths:
- 'flutter_module/**' # 仅当 Flutter 模块代码变更时触发
pull_request:
paths:
- 'flutter_module/**' # PR 时也验证编译是否通过
jobs:
build_flutter:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest] # 分别编译 Android(Linux)和 iOS(macOS)
include:
- os: ubuntu-latest
target: android
- os: macos-latest
target: ios
steps:
- name: 拉取代码
uses: actions/checkout@v4
- name: 安装 Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.16.0' # 指定 Flutter 版本
- name: 安装依赖
working-directory: ./flutter_module
run: flutter pub get
- name: 编译 Flutter 产物
working-directory: ./flutter_module
run: |
if [ "${{ matrix.target }}" = "android" ]; then
# 编译 Android AAR(release 模式)
flutter build aar --release
else
# 编译 iOS Framework(release 模式,生成 XCFramework)
flutter build ios-framework --release --output=../ios/Flutter/Generated
fi
- name: 同步产物到原生项目(Android)
if: matrix.target == 'android'
run: |
# 复制 AAR 到 Android 项目的 libs 目录
mkdir -p ./android/app/libs
cp ./flutter_module/build/host/outputs/repo/com/example/flutter_module/*/*/flutter_module-*.aar ./android/app/libs/
- name: 同步产物到原生项目(iOS)
if: matrix.target == 'ios'
run: |
# 确保 iOS 项目的 Framework 目录存在
mkdir -p ./ios/Flutter/Generated
# 编译生成的 XCFramework 已输出到该目录,无需额外复制
- name: 自动提交产物更新
if: github.event_name == 'push' # 仅在 push 时提交(PR 不提交)
run: |
git config --global user.name "CI Bot"
git config --global user.email "ci@example.com"
git add ./android/app/libs/*.aar ./ios/Flutter/Generated
git commit -m "ci: 自动更新 Flutter 编译产物" || echo "无产物更新,无需提交"
git push
- 辅助脚本(可选,复杂场景用)
如果编译逻辑较复杂(如多环境、版本号处理),可将编译逻辑抽离到 ci/build_flutter.sh:
#!/bin/bash
set -e # 出错时终止脚本
TARGET=$1 # 接收参数:android 或 ios
FLUTTER_DIR="./flutter_module"
ANDROID_LIBS_DIR="./android/app/libs"
IOS_FRAMEWORK_DIR="./ios/Flutter/Generated"
# 安装依赖
cd $FLUTTER_DIR
flutter pub get
# 编译产物
if [ "$TARGET" = "android" ]; then
flutter build aar --release
# 复制 AAR 到原生项目
mkdir -p $ANDROID_LIBS_DIR
cp build/host/outputs/repo/com/example/flutter_module/*/*/*.aar $ANDROID_LIBS_DIR/
elif [ "$TARGET" = "ios" ]; then
flutter build ios-framework --release --output=$IOS_FRAMEWORK_DIR
else
echo "不支持的目标平台: $TARGET"
exit 1
fi
在工作流中调用该脚本:
- name: 编译 Flutter 产物
run: |
chmod +x ./ci/build_flutter.sh
./ci/build_flutter.sh ${{ matrix.target }}
原生项目依赖配置
需要在原生项目中配置对 Flutter 产物的依赖,确保能正确引用自动更新的产物。
- Android 项目(android/app/build.gradle)
dependencies {
// 依赖自动同步的 AAR
implementation files('libs/flutter_module-release.aar')
// 若有其他依赖(如 Flutter 引擎),需同步添加
}
- iOS 项目(ios/Podfile 或手动配置)
通过 CocoaPods 管理 Flutter 产物:
target 'YourApp' do
# 引用自动生成的 Framework
pod 'Flutter', :path => './Flutter/Generated/Release'
end
或在 Xcode 中直接添加 Generated 目录下的 XCFramework 到项目依赖。