在 Flutter 与原生项目混合工程中实现 CI/CD 自动化编译

目的:

在原生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脚本。

  1. 工作流配置文件(.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
  1. 辅助脚本(可选,复杂场景用)
    如果编译逻辑较复杂(如多环境、版本号处理),可将编译逻辑抽离到 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 产物的依赖,确保能正确引用自动更新的产物。

  1. Android 项目(android/app/build.gradle)
dependencies {
    // 依赖自动同步的 AAR
    implementation files('libs/flutter_module-release.aar')
    // 若有其他依赖(如 Flutter 引擎),需同步添加
}
  1. iOS 项目(ios/Podfile 或手动配置)
    通过 CocoaPods 管理 Flutter 产物:
target 'YourApp' do
  # 引用自动生成的 Framework
  pod 'Flutter', :path => './Flutter/Generated/Release'
end

或在 Xcode 中直接添加 Generated 目录下的 XCFramework 到项目依赖。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容