本章将详细介绍在蓝盾(Blue Shield)CI/CD环境中配置Flutter Engine自定义构建的完整流程。通过三个核心脚本实现环境配置、Flutter依赖管理和Android项目构建的自动化部署。
目录结构
writer_build_engin_shell/
└── landun_shell_ci/
├── config_android.sh # Android环境配置脚本
├── build_flutter.sh # Flutter环境搭建脚本
└── build_android.sh # Android项目构建脚本
6.1 蓝盾环境概述
6.1.1 蓝盾文件结构
蓝盾CI/CD环境采用固定的目录结构,所有项目文件都位于 /data/landun/workspace 下:
/data/landun/workspace/
├── flutter_sdk/ # Flutter SDK及自定义引擎
│ ├── bin/ # Flutter命令行工具
│ └── engine/ # 自定义引擎源码
│ └── src/
│ └── out/ # 编译产物输出目录
│ ├── android_release_arm64/ # Android引擎
│ └── linux_host_release_x64/ # Linux主机工具
├── authorapp/ # Android项目
│ ├── gradle.properties # Gradle配置文件
│ ├── local.properties # 本地环境配置
│ └── app/ # 应用主模块
└── writer-flutter/ # Flutter项目
└── pubspec.yaml # Flutter依赖配置
6.1.2 环境路径配置
蓝盾环境使用固定的系统工具路径:
# Android开发环境
ANDROID_SDK_PATH="/data/bkdevops/apps/android-sdk-linux/android-sdk_new_with_ndk_new"
ANDROID_NDK_PATH="/data/bkdevops/apps/ndk/android-ndk-r26d"
GRADLE_HOME_PATH="/data/bkdevops/apps/gradle/7.5"
# Flutter引擎路径
FLUTTER_ENGINE_OUT="$WORKSPACE/flutter_sdk/engine/src/out/android_release_arm64"
FLUTTER_ENGINE_HOST_OUT="$WORKSPACE/flutter_sdk/engine/src/out/linux_host_release_x64"
6.2 Android环境配置脚本 (config_android.sh)
6.2.1 脚本功能
负责配置Android项目的Flutter引擎依赖,包括修改 gradle.properties 和创建 local.properties 文件。
6.2.2 核心配置代码
#!/bin/bash
set -e
# 蓝盾环境路径配置
LANDUN_WORKSPACE="/data/landun/workspace"
FLUTTER_SDK_PATH="${LANDUN_WORKSPACE}/flutter_sdk"
ANDROID_PROJECT_PATH="${LANDUN_WORKSPACE}/authorapp"
GRADLE_PROPERTIES_PATH="${ANDROID_PROJECT_PATH}/gradle.properties"
# Android SDK配置
ANDROID_SDK_PATH="/data/bkdevops/apps/android-sdk-linux/android-sdk_new_with_ndk_new"
ANDROID_NDK_PATH="/data/bkdevops/apps/ndk/android-ndk-r26d"
# Flutter引擎路径
FLUTTER_ENGINE_BASE="${FLUTTER_SDK_PATH}/engine/src/out"
FLUTTER_ENGINE_OUT="${FLUTTER_ENGINE_BASE}/android_release_arm64"
FLUTTER_ENGINE_HOST_OUT="${FLUTTER_ENGINE_BASE}/linux_host_release_x64"
6.2.3 环境检查函数
check_environment() {
# 检查工作目录
if [ ! -d "${LANDUN_WORKSPACE}" ]; then
echo "错误: 蓝盾工作目录不存在: ${LANDUN_WORKSPACE}"
exit 1
fi
# 检查Android SDK
if [ ! -d "${ANDROID_SDK_PATH}" ]; then
echo "错误: Android SDK目录不存在: ${ANDROID_SDK_PATH}"
exit 1
fi
# 检查Flutter引擎产物
if [ ! -d "${FLUTTER_ENGINE_OUT}" ]; then
echo "错误: Flutter引擎输出目录不存在: ${FLUTTER_ENGINE_OUT}"
exit 1
fi
# 验证关键文件
ENGINE_LIB="${FLUTTER_ENGINE_OUT}/libflutter.so"
if [ ! -f "${ENGINE_LIB}" ]; then
echo "错误: 引擎库文件不存在: ${ENGINE_LIB}"
exit 1
fi
}
6.2.4 配置文件修改
配置gradle.properties
configure_flutter_engine() {
# 备份原文件
cp "${GRADLE_PROPERTIES_PATH}" "${GRADLE_PROPERTIES_PATH}.backup"
# 清理旧配置
sed -i.tmp \
-e '/^local-engine-out=/d' \
-e '/^local-engine-host-out=/d' \
-e '/^local-engine-build-mode=/d' \
"${GRADLE_PROPERTIES_PATH}"
# 添加新配置
cat >> "${GRADLE_PROPERTIES_PATH}" << EOF
# 蓝盾自动配置的Flutter引擎路径
local-engine-out=${FLUTTER_ENGINE_OUT}
local-engine-host-out=${FLUTTER_ENGINE_HOST_OUT}
local-engine-build-mode=release
EOF
}
配置local.properties
configure_local_properties() {
LOCAL_PROPERTIES_PATH="${ANDROID_PROJECT_PATH}/local.properties"
cat > "${LOCAL_PROPERTIES_PATH}" << EOF
# 蓝盾环境配置
sdk.dir=${ANDROID_SDK_PATH}
flutter.sdk=${FLUTTER_SDK_PATH}
ndk.dir=${ANDROID_NDK_PATH}
EOF
}
6.3 Flutter环境搭建脚本 (build_flutter.sh)
6.3.1 脚本功能
负责在蓝盾环境中搭建Flutter开发环境,包括环境变量配置、依赖安装和版本验证。
6.3.2 核心环境变量配置
#!/bin/bash
set -e
# Git LFS优化配置
export GIT_LFS_SKIP_SMUDGE=1
git config --global lfs.fetchexclude "*"
git config --global lfs.skipdownloaderrors true
WORKSPACE_ROOT=$(pwd)
# Flutter环境变量配置
export FLUTTER_ROOT="$WORKSPACE_ROOT/flutter_sdk"
export FLUTTER_SDK_ROOT="$WORKSPACE_ROOT/flutter_sdk"
export FLUTTER_ENGINE_ROOT="$WORKSPACE_ROOT/flutter_sdk/engine/src"
export FLUTTER_ENGINE_OUT="$WORKSPACE_ROOT/flutter_sdk/engine/src/out"
export FLUTTER_LOCAL_ENGINE="linux_host_release_x64"
export FLUTTER_LOCAL_ENGINE_SRC_PATH="$WORKSPACE_ROOT/flutter_sdk/engine/src"
export PATH="$WORKSPACE_ROOT/flutter_sdk/bin:$WORKSPACE_ROOT/flutter_sdk/engine/src/out/linux_host_release_x64:$PATH"
export FLUTTER_SUPPRESS_ANALYTICS=true
export FLUTTER_NO_ANALYTICS=true
export LANG=en_US.UTF-8
6.3.3 目录结构验证
# 验证目录结构
if [ ! -d "$WORKSPACE_ROOT/flutter_sdk" ]; then
echo "错误: Flutter SDK 目录不存在: $WORKSPACE_ROOT/flutter_sdk"
exit 1
fi
if [ ! -d "$WORKSPACE_ROOT/writer-flutter" ]; then
echo "错误: Flutter 项目目录不存在: $WORKSPACE_ROOT/writer-flutter"
exit 1
fi
6.3.4 Flutter版本验证
# 验证Flutter版本
flutter --version --verbose
# 检查Dart可用性
if command -v dart >/dev/null 2>&1; then
dart --version
else
echo "错误: Dart 不可用"
exit 1
fi
6.3.5 依赖安装流程
# 清理缓存
flutter pub cache clean
cd "$WORKSPACE_ROOT/writer-flutter"
# 清理并安装依赖
flutter clean
flutter pub get
flutter precache
6.4 Android项目构建脚本 (build_android.sh)
6.4.1 脚本功能
负责执行Android项目的编译打包,使用自定义Flutter引擎进行构建。
6.4.2 核心构建配置
#!/bin/bash
cd ${WORKSPACE}/authorapp
chmod 777 gradlew
origin_dir=${WORKSPACE}/authorapp
output_dir="${origin_dir}/outputs"
# 初始化构建环境
function set_up() {
if [ -d ${output_dir} ]; then
rm -rf ${output_dir}
fi
mkdir ${output_dir}
cd ${WORKSPACE}/authorapp
}
set_up
6.4.3 引擎参数配置
# 使用合并后的双架构引擎 - 支持ARM32和ARM64
ENGINE_ARGS="-Plocal-engine-out=${WORKSPACE}/flutter_sdk/engine/src/out/android \
-Plocal-engine-host-out=${WORKSPACE}/flutter_sdk/engine/src/out/linux_host_release_x64 \
-Plocal-engine-build-mode=release \
-Ptarget-platform=android-arm,android-arm64"
6.4.4 构建执行逻辑
if [ ${TYPE} = "debug" ]; then
if [ ${SOURCE} = "All" ]; then
./gradlew clean assembleDebugChannels ${ENGINE_ARGS}
else
./gradlew clean assembleDebugChannels -PchannelList=${SOURCE} ${ENGINE_ARGS}
fi
else
if [ ${SOURCE} = "All" ]; then
./gradlew clean assembleReleaseChannels ${ENGINE_ARGS}
else
./gradlew clean assembleReleaseChannels -PchannelList=${SOURCE} ${ENGINE_ARGS}
fi
fi
# 复制构建产物
cp "$WORKSPACE/authorapp/app/build/outputs/channels/"*.apk "${output_dir}"
6.5 蓝盾流水线配置流程
6.5.1 执行顺序
蓝盾流水线按以下顺序执行脚本:
-
环境配置阶段: 执行
config_android.sh- 配置Android环境路径
- 设置Flutter引擎依赖
-
依赖安装阶段: 执行
build_flutter.sh- 搭建Flutter环境
- 安装项目依赖
-
项目构建阶段: 执行
build_android.sh- 编译Android项目
- 生成APK文件
6.5.2 蓝盾流水线YAML配置示例
version: '1.1'
name: Flutter Engine Custom Build
desc: 自定义Flutter引擎Android项目构建流水线
stages:
- name: 环境配置
jobs:
- name: 配置Android环境
steps:
- checkout: self
- script: |
bash writer_build_engin_shell/landun_shell_ci/config_android.sh
- name: 依赖安装
jobs:
- name: 安装Flutter依赖
steps:
- script: |
bash writer_build_engin_shell/landun_shell_ci/build_flutter.sh
- name: 项目构建
jobs:
- name: 构建Android项目
steps:
- script: |
bash writer_build_engin_shell/landun_shell_ci/build_android.sh
artifacts:
- path: authorapp/outputs/*.apk
name: android-apk
6.5.3 环境变量配置
蓝盾流水线需要配置以下环境变量:
# 构建类型
TYPE=release
# 构建渠道
SOURCE=All
# 工作目录(蓝盾自动设置)
WORKSPACE=/data/landun/workspace
6.6 关键配置说明
6.6.1 引擎路径映射
蓝盾环境中的引擎路径映射关系:
本地开发环境 → 蓝盾环境
./flutter_sdk/engine/src/out/android → /data/landun/workspace/flutter_sdk/engine/src/out/android_release_arm64
./flutter_sdk/engine/src/out/linux_host_release_x64 → /data/landun/workspace/flutter_sdk/engine/src/out/linux_host_release_x64
6.6.2 Gradle参数传递
通过Gradle参数传递引擎配置:
-Plocal-engine-out=${FLUTTER_ENGINE_OUT}
-Plocal-engine-host-out=${FLUTTER_ENGINE_HOST_OUT}
-Plocal-engine-build-mode=release
-Ptarget-platform=android-arm,android-arm64
6.6.3 多架构支持
构建脚本支持ARM32和ARM64双架构:
-Ptarget-platform=android-arm,android-arm64
这确保生成的APK在不同ARM架构的Android设备上都能正常运行。
6.7 故障排除
6.7.1 常见问题
-
引擎路径不存在
# 检查引擎目录 ls -la /data/landun/workspace/flutter_sdk/engine/src/out/ -
依赖下载失败
# 清理缓存重试 flutter pub cache clean flutter pub get -
构建权限问题
# 确保gradlew可执行 chmod 777 gradlew
6.7.2 调试建议
- 在每个脚本中添加详细的日志输出
- 验证关键文件和目录的存在性
- 检查环境变量的正确设置
- 保留构建产物便于问题定位
总结
本章详细介绍了蓝盾CI/CD环境中Flutter Engine自定义构建的完整配置流程。通过三个核心脚本的协同工作,实现了从环境配置、依赖安装到项目构建的全自动化部署。
关键要点:
- 遵循蓝盾固定的目录结构和路径规范
- 正确配置Flutter引擎的本地依赖路径
- 支持多架构Android应用构建
- 完善的错误检查和故障恢复机制
这套配置方案为Flutter Engine定制化开发提供了稳定可靠的CI/CD支持,大大提高了开发效率和部署质量。