快速开始 - 操作流程总览
必要条件
- macOS 11+ 系统
- 至少 100GB 可用磁盘空间
- 16GB+ 内存(推荐32GB)
- 稳定的网络连接
第一步:安装基础工具
bash
# 1. 安装 Xcode Command Line Tools
xcode-select --install
# 2. 安装 Homebrew(如果没有)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 3. 安装基础依赖
brew install git python3
第二步:安装 depot_tools 到根目录
bash
# 1. 克隆到根目录
sudo git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /depot_tools
# 2. 设置权限
sudo chown -R $(whoami):staff /depot_tools
sudo chmod -R 755 /depot_tools
# 3. 配置环境变量
echo 'export PATH="/depot_tools:$PATH"' >> ~/.zshrc
echo 'export DEPOT_TOOLS_UPDATE=0' >> ~/.zshrc
source ~/.zshrc
第三步:创建工作目录和配置文件
bash
# 1. 创建 Flutter SDK 目录
mkdir -p ~/flutter_sdk
cd ~/flutter_sdk
# 2. 创建 .gclient 配置文件
cat > .gclient << 'EOF'
solutions = [
{
"managed": False,
"name": ".",
"url": "https://github.com/flutter/engine.git@3.29.0",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
EOF
第四步:同步 Flutter Engine 源码
bash
# 同步源码(耗时 1-3 小时,约 30GB)
gclient sync --verbose
第五步:编译 Flutter Engine
bash
# 1. 配置构建环境(以 Android Release 为例)
./flutter/tools/gn --android --android-cpu arm64 --runtime-mode release --optimized
# 2. 执行编译
ninja -C out/android_release_arm64 -j$(sysctl -n hw.ncpu)
验证安装
bash
# 检查工具是否正确安装
which gclient gn ninja
ls -la ~/flutter_sdk/flutter/
# 检查编译产物
ls -la out/android_release_arm64/flutter.jar
ls -la out/android_release_arm64/libflutter.so
详细说明目录
- [1.1 开发环境要求与系统配置](#1.1 开发环境要求与系统配置 "#11-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E8%A6%81%E6%B1%82%E4%B8%8E%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE")
- [1.2 depot_tools 详细安装配置](#1.2 depot_tools 详细安装配置 "#12-depot_tools-%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE")
- [1.3 Flutter Engine 源码获取详解](#1.3 Flutter Engine 源码获取详解 "#13-flutter-engine-%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96%E8%AF%A6%E8%A7%A3")
- [1.4 编译脚本使用说明](#1.4 编译脚本使用说明 "#14-%E7%BC%96%E8%AF%91%E8%84%9A%E6%9C%AC%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E")
- [1.5 环境验证与测试](#1.5 环境验证与测试 "#15-%E7%8E%AF%E5%A2%83%E9%AA%8C%E8%AF%81%E4%B8%8E%E6%B5%8B%E8%AF%95")
- [1.6 常见问题解决](#1.6 常见问题解决 "#16-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3")
- [1.7 实用脚本工具](#1.7 实用脚本工具 "#17-%E5%AE%9E%E7%94%A8%E8%84%9A%E6%9C%AC%E5%B7%A5%E5%85%B7")
1.1 开发环境要求与系统配置
硬件配置要求
推荐配置:
- CPU: Apple M1 Pro/Max 或 Intel i7 8核以上
- 内存: 32GB(最低16GB)
- 存储: 1TB SSD,至少500GB可用空间
- 网络: 能访问 GitHub 和 Google 服务
存储空间分配:
bash
/depot_tools/ # 约 500MB
~/flutter_sdk/ # 源码约 30GB
~/flutter_sdk/out/ # 编译产物 10-50GB
macOS 系统要求
系统版本: macOS 11.0+ (推荐 macOS 12+)
必需工具安装:
bash
# 安装 Xcode Command Line Tools
xcode-select --install
# 验证安装
xcode-select -p
# 输出: /Applications/Xcode.app/Contents/Developer
# 检查系统信息
sw_vers
1.2 depot_tools 详细安装配置
为什么安装到根目录?
- 统一路径: 避免不同用户的路径差异
- 权限管理: 便于团队开发时的权限控制
- 脚本兼容: 与现有构建脚本保持一致
详细安装步骤
bash
# 第一步:克隆 depot_tools 到根目录
sudo git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /depot_tools
# 第二步:设置合适的权限
sudo chown -R $(whoami):staff /depot_tools
sudo chmod -R 755 /depot_tools
# 第三步:配置环境变量
# 编辑 shell 配置文件
nano ~/.zshrc # macOS 默认使用 zsh
# 添加以下内容
export PATH="/depot_tools:$PATH"
export DEPOT_TOOLS_UPDATE=0
# 使配置生效
source ~/.zshrc
验证安装
bash
# 检查工具路径
which gclient # 应该输出: /depot_tools/gclient
which gn # 应该输出: /depot_tools/gn
which ninja # 应该输出: /depot_tools/ninja
# 检查版本
gclient --version
gn --version
ninja --version
# 测试功能
gclient help
1.3 Flutter Engine 源码获取详解
.gclient 配置文件解析
bash
solutions = [
{
"managed": False, # 不使用自动管理模式
"name": ".", # 存储到当前目录
"url": "https://github.com/flutter/engine.git@3.29.0", # 指定版本
"custom_deps": {}, # 自定义依赖
"deps_file": "DEPS", # 依赖文件
"safesync_url": "", # 安全同步URL
},
]
关键参数说明:
- "name": "." : 直接存储到
~/flutter_sdk/
目录,不创建子目录 - "@3.29.0": 指定 Flutter Engine 版本,与 Flutter SDK 3.29.0 对应
- GitHub 仓库: 相比 Chromium 源,GitHub 访问更稳定
同步过程详解
bash
# 执行同步命令
cd ~/flutter_sdk
gclient sync --verbose
# 同步过程包含:
# 1. 克隆主仓库 (flutter/engine)
# 2. 解析 DEPS 文件,获取依赖列表
# 3. 下载第三方依赖 (Skia, Dart VM, ICU 等)
# 4. 应用 Flutter 特定补丁
# 5. 运行预编译钩子脚本
同步完成后的目录结构:
bash
~/flutter_sdk/
├── .gclient # gclient 配置文件
├── .gclient_entries # 同步状态记录
├── build/ # 构建系统文件
├── buildtools/ # 构建工具
├── flutter/ # Flutter Engine 核心源码
├── third_party/ # 第三方依赖
└── tools/ # 辅助工具
1.4 编译脚本使用说明
compile_engine.sh 脚本
为了统一编译流程,必须使用 compile_engine.sh
脚本进行编译:
bash
# 基本用法
./compile_engine.sh --mode <profile|release> --platform <android|ios> --cpu <arm64|x64>
# 常用示例
./compile_engine.sh --mode release --platform android --cpu arm64 # Android 发布版(推荐)
./compile_engine.sh --mode profile --platform android --cpu arm64 # Android 性能分析版
./compile_engine.sh --mode release --platform ios --cpu arm64 # iOS 发布版
# 清理构建
./compile_engine.sh --mode release --platform android --cpu arm64 --clean
Mac 版本脚本内容
bash
#!/bin/bash
# 文件名:compile_engine.sh
set -e
# 检测操作系统
if [[ "$OSTYPE" != "darwin"* ]]; then
echo "错误: 此脚本仅适用于macOS系统"
exit 1
fi
echo "=== Mac Flutter Engine 编译脚本 ==="
# 配置参数
BUILD_MODE="release"
TARGET_PLATFORM="android"
TARGET_CPU="arm64"
CLEAN_BUILD=false
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
--mode)
BUILD_MODE="$2"
# 禁用debug模式
if [ "$BUILD_MODE" = "debug" ]; then
echo "错误: 不支持debug模式,请使用 release 或 profile"
exit 1
fi
shift 2
;;
--platform)
TARGET_PLATFORM="$2"
shift 2
;;
--cpu)
TARGET_CPU="$2"
shift 2
;;
--clean)
CLEAN_BUILD=true
shift
;;
--help|-h)
echo "用法: $0 [选项]"
echo "选项:"
echo " --mode <profile|release> 构建模式(不支持debug)"
echo " --platform <android|ios> 目标平台"
echo " --cpu <arm|arm64|x64> 目标CPU架构"
echo " --clean 清理构建"
echo ""
echo "示例:"
echo " $0 --mode release --platform android --cpu arm64"
echo " $0 --mode profile --platform android --cpu arm64"
echo " $0 --mode release --platform ios --cpu arm64"
exit 0
;;
*)
echo "未知参数: $1"
echo "使用 --help 查看帮助"
exit 1
;;
esac
done
# 检查当前目录
if [ ! -f ".gclient" ] || [ ! -d "flutter" ]; then
echo "错误: 请在Flutter Engine源码根目录下运行此脚本"
echo "当前目录应该包含 .gclient 文件和 flutter/ 目录"
exit 1
fi
echo "构建配置:"
echo " 模式: $BUILD_MODE"
echo " 平台: $TARGET_PLATFORM"
echo " CPU: $TARGET_CPU"
echo " 清理构建: $CLEAN_BUILD"
# 清理构建目录
if [ "$CLEAN_BUILD" = true ]; then
echo "清理构建目录..."
rm -rf out/
fi
# 构建输出目录
OUTPUT_DIR="out/${TARGET_PLATFORM}_${BUILD_MODE}_${TARGET_CPU}"
# 配置GN参数
echo "配置构建环境..."
GN_ARGS=""
GN_ARGS+=" --${TARGET_PLATFORM}"
# 处理CPU架构参数
if [ "$TARGET_PLATFORM" = "android" ]; then
GN_ARGS+=" --android-cpu ${TARGET_CPU}"
elif [ "$TARGET_PLATFORM" = "ios" ]; then
GN_ARGS+=" --ios-cpu ${TARGET_CPU}"
fi
GN_ARGS+=" --runtime-mode ${BUILD_MODE}"
# 优化设置(强制使用优化)
GN_ARGS+=" --optimized"
# 执行GN配置
echo "执行: ./flutter/tools/gn $GN_ARGS"
./flutter/tools/gn $GN_ARGS
# 获取CPU核心数(Mac专用)
CORES=$(sysctl -n hw.ncpu)
echo "使用 $CORES 个CPU核心进行编译"
# 开始编译
echo "开始编译..."
start_time=$(date +%s)
ninja -C "$OUTPUT_DIR" -j"$CORES"
end_time=$(date +%s)
build_time=$((end_time - start_time))
echo "=== 编译完成 ==="
echo "编译时间: ${build_time}秒"
echo "输出目录: $OUTPUT_DIR"
# 显示产物大小
echo "构建产物大小:"
du -sh "$OUTPUT_DIR"
# 验证关键文件
echo "验证构建产物..."
if [ "$TARGET_PLATFORM" = "android" ]; then
if [ -f "$OUTPUT_DIR/flutter.jar" ]; then
echo "✓ flutter.jar 构建成功"
ls -lh "$OUTPUT_DIR/flutter.jar"
else
echo "✗ flutter.jar 构建失败"
fi
if [ -f "$OUTPUT_DIR/libflutter.so" ]; then
echo "✓ libflutter.so 构建成功"
ls -lh "$OUTPUT_DIR/libflutter.so"
else
echo "✗ libflutter.so 构建失败"
fi
elif [ "$TARGET_PLATFORM" = "ios" ]; then
if [ -f "$OUTPUT_DIR/Flutter.framework/Flutter" ]; then
echo "✓ Flutter.framework 构建成功"
ls -lh "$OUTPUT_DIR/Flutter.framework/Flutter"
else
echo "✗ Flutter.framework 构建失败"
fi
fi
echo "Mac编译脚本执行完成"
Linux 版本差异
Linux 环境使用 compile_engine_linux.sh
,主要差异:
bash
# Linux 特有检查
check_dependencies() {
required_packages=("build-essential" "git" "python3" "pkg-config")
# ...检查逻辑...
}
# CPU 核心数获取
CORES=$(nproc)
# 内存检查
MEMORY_GB=$(free -g | awk '/^Mem:/{print $2}')
if [ "$MEMORY_GB" -lt 8 ]; then
CORES=$((CORES / 2)) # 内存不足时减少并行任务
fi
1.5 环境验证与测试
快速验证脚本
bash
#!/bin/bash
# 检查关键组件
echo "=== Flutter Engine 环境检查 ==="
# 1. 检查 depot_tools
echo "depot_tools: $(which gclient)"
gclient --version
# 2. 检查源码
if [ -f "~/flutter_sdk/.gclient" ] && [ -d "~/flutter_sdk/flutter" ]; then
echo "✓ Flutter Engine 源码已准备完成"
else
echo "✗ Flutter Engine 源码未准备"
fi
# 3. 检查编译脚本
if [ -x "~/flutter_sdk/compile_engine.sh" ]; then
echo "✓ 编译脚本已准备完成"
else
echo "✗ 编译脚本未准备"
fi
# 4. 磁盘空间检查
available_space=$(df -h ~ | tail -1 | awk '{print $4}')
echo "可用磁盘空间: $available_space"
性能基准测试
bash
# 编译性能测试
time ./compile_engine.sh --mode release --platform android --cpu arm64
# 预期时间参考(Mac M1 Pro):
# Release 模式:60-120分钟
# Profile 模式:45-90分钟
1.6 常见问题解决
问题1:depot_tools 找不到
bash
# 症状
command not found: gclient
# 解决方案
echo $PATH | grep depot_tools # 检查PATH
echo 'export PATH="/depot_tools:$PATH"' >> ~/.zshrc
source ~/.zshrc
问题2:gclient sync 失败
bash
# 症状
HTTP 403 错误或网络超时
# 解决方案
# 1. 检查网络连接
ping github.com
# 2. 重新同步
gclient sync --delete_unversioned_trees --force
# 3. 使用代理(如需要)
git config --global http.proxy http://proxy:8080
问题3:编译内存不足
bash
# 症状
c++: internal compiler error: Killed
# 解决方案
# 1. 关闭其他应用程序
# 2. 限制并行任务数
# 编辑 compile_engine.sh,将 -j"$CORES" 改为 -j4
问题4:权限问题
bash
# 症状
Permission denied
# 解决方案
sudo chown -R $(whoami):staff /depot_tools
chmod +x compile_engine.sh
1.7 实用脚本工具
一键环境安装脚本
bash
#!/bin/bash
# 文件名:setup_flutter_engine_macos.sh
echo "=== Flutter Engine 一键安装脚本 ==="
# 检查系统
if [[ "$OSTYPE" != "darwin"* ]]; then
echo "错误: 仅支持 macOS"
exit 1
fi
# 安装步骤
echo "1/6 安装 Xcode Command Line Tools..."
xcode-select --install 2>/dev/null || echo "已安装"
echo "2/6 安装 Homebrew..."
if ! command -v brew &> /dev/null; then
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
echo "3/6 安装依赖..."
brew install git python3
echo "4/6 安装 depot_tools..."
if [ ! -d "/depot_tools" ]; then
sudo git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /depot_tools
sudo chown -R $(whoami):staff /depot_tools
fi
echo "5/6 配置环境变量..."
if ! grep -q "/depot_tools" ~/.zshrc; then
echo 'export PATH="/depot_tools:$PATH"' >> ~/.zshrc
echo 'export DEPOT_TOOLS_UPDATE=0' >> ~/.zshrc
fi
echo "6/6 创建工作目录..."
mkdir -p ~/flutter_sdk
cd ~/flutter_sdk
cat > .gclient << 'EOF'
solutions = [
{
"managed": False,
"name": ".",
"url": "https://github.com/flutter/engine.git@3.29.0",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
EOF
echo "=== 安装完成 ==="
echo "下一步:"
echo "1. 重启终端或运行: source ~/.zshrc"
echo "2. cd ~/flutter_sdk && gclient sync"
echo "3. 创建 compile_engine.sh 并编译"
版本切换脚本
bash
#!/bin/bash
# 文件名:switch_engine_version.sh
ENGINE_DIR="$HOME/flutter_sdk"
switch_version() {
local version="$1"
cd "$ENGINE_DIR"
echo "切换到版本: $version"
sed -i.bak "s/@[^\"]*/@$version/" .gclient
gclient sync --delete_unversioned_trees
echo "切换完成"
}
# 使用示例
# ./switch_engine_version.sh 3.29.0
switch_version "$1"
自动化构建脚本
bash
#!/bin/bash
# 文件名:build_all_variants.sh
# 构建所有常用变体(仅 release 和 profile 模式)
CONFIGS=(
"profile android arm64"
"release android arm64"
"release ios arm64"
)
for config in "${CONFIGS[@]}"; do
echo "构建: $config"
./compile_engine.sh --mode $(echo $config | cut -d' ' -f1) \
--platform $(echo $config | cut -d' ' -f2) \
--cpu $(echo $config | cut -d' ' -f3)
done
小结
本章提供了 Mac 环境下 Flutter Engine 开发的完整准备流程:
核心步骤回顾:
- 安装基础工具(Xcode、Homebrew、Git、Python)
- 安装 depot_tools 到根目录并配置环境变量
- 创建工作目录和 .gclient 配置文件
- 同步 Flutter Engine 源码
- 使用 compile_engine.sh 脚本编译(仅支持 release 和 profile 模式)
关键要点:
- depot_tools 必须安装到
/depot_tools
根目录 - 使用 GitHub 仓库地址提高同步成功率
- 编译必须使用统一的
compile_engine.sh
脚本 - 全程使用 release 模式,不支持 debug 模式
- 区分 Mac 和 Linux 环境的差异处理
准备时间:
- 环境安装:30分钟
- 源码同步:1-3小时
- 首次编译:60-120分钟(release 模式)
完成本章配置后,即可进入下一章的 Docker 环境配置,为跨平台开发提供更多选择。
直接使用ninja编译
ninja -C out/android_release_arm64 -j(sysctl -n hw.ncpu) # Mac ninja -C out/android_release_arm64 -j(nproc) # Linux
限制内存使用的编译
ninja -C out/android_release_arm64 -j4 -l4
清理构建目录
ninja -C out/android_release_arm64 -t clean
bash
## 1.5 环境验证与性能测试
### 完整环境检查脚本
```bash
#!/bin/bash
# 文件名:check_flutter_engine_env.sh
echo "=== Flutter Engine开发环境检查 ==="
# 检查操作系统
echo "1. 操作系统信息:"
if [[ "$OSTYPE" == "darwin"* ]]; then
sw_vers
echo "CPU信息: $(sysctl -n machdep.cpu.brand_string)"
echo "CPU核心数: $(sysctl -n hw.ncpu)"
echo "内存: $(system_profiler SPHardwareDataType | grep "Memory:" | awk '{print $2 $3}')"
else
uname -a
echo "CPU核心数: $(nproc)"
echo "内存: $(free -h | grep '^Mem:' | awk '{print $2}')"
fi
# 检查磁盘空间
echo -e "\n2. 磁盘空间:"
df -h ~
# 检查depot_tools安装
echo -e "\n3. depot_tools检查:"
if [ -d "/depot_tools" ]; then
echo "✓ depot_tools已安装到根目录"
echo "PATH中的depot_tools: $(echo $PATH | grep -o '/depot_tools')"
else
echo "✗ depot_tools未安装到根目录"
fi
# 检查工具版本
echo -e "\n4. 工具版本:"
which gclient && gclient --version
which gn && gn --version
which ninja && ninja --version
# 检查Python
echo -e "\n5. Python环境:"
python3 --version
which python3
# 检查Git
echo -e "\n6. Git配置:"
git --version
git config --get user.name
git config --get user.email
# 检查Flutter Engine源码
echo -e "\n7. Flutter Engine源码检查:"
if [ -f "~/flutter_sdk/.gclient" ]; then
echo "✓ .gclient配置文件存在"
if [ -d "~/flutter_sdk/flutter" ]; then
echo "✓ Flutter Engine源码已下载"
cd ~/flutter_sdk/flutter
echo "当前Engine版本: $(git describe --tags 2>/dev/null || git rev-parse --short HEAD)"
else
echo "✗ Flutter Engine源码未下载"
echo "请运行: cd ~/flutter_sdk && gclient sync"
fi
else
echo "✗ Flutter Engine未配置"
echo "请创建 ~/flutter_sdk/.gclient 文件"
fi
# 检查编译脚本
echo -e "\n8. 编译脚本检查:"
if [ -f "compile_engine.sh" ]; then
echo "✓ compile_engine.sh 存在"
else
echo "✗ compile_engine.sh 不存在"
fi
# 网络检查
echo -e "\n9. 网络连接测试:"
ping -c 1 github.com >/dev/null 2>&1 && echo "✓ GitHub可访问" || echo "✗ GitHub不可访问"
ping -c 1 chromium.googlesource.com >/dev/null 2>&1 && echo "✓ Chromium可访问" || echo "✗ Chromium不可访问"
echo -e "\n=== 环境检查完成 ==="
编译性能测试脚本
bash
#!/bin/bash
# 文件名:benchmark_compile.sh
echo "=== Flutter Engine编译性能基准测试 ==="
# 检查环境
if [ ! -f "compile_engine.sh" ]; then
echo "错误: 找不到 compile_engine.sh 脚本"
exit 1
fi
# 测试配置
TEST_CONFIGS=(
"debug android arm64"
"profile android arm64"
"release android arm64"
)
# 执行测试
for config in "${TEST_CONFIGS[@]}"; do
IFS=' ' read -r mode platform cpu <<< "$config"
echo "测试配置: $mode $platform $cpu"
# 清理之前的构建
./compile_engine.sh --mode "$mode" --platform "$platform" --cpu "$cpu" --clean
# 记录开始时间
start_time=$(date +%s)
# 执行编译
./compile_engine.sh --mode "$mode" --platform "$platform" --cpu "$cpu"
# 记录结束时间
end_time=$(date +%s)
compile_time=$((end_time - start_time))
echo "$mode $platform $cpu: ${compile_time}秒"
# 记录产物大小
output_dir="out/${platform}_${mode}_${cpu}"
if [ -d "$output_dir" ]; then
size=$(du -sh "$output_dir" | cut -f1)
echo "产物大小: $size"
fi
echo "---"
done
echo "=== 性能测试完成 ==="
1.6 问题排查与解决方案
depot_tools相关问题
问题1: depot_tools路径找不到
bash
# 症状:command not found: gclient
# 检查安装路径
ls -la /depot_tools/
# 检查PATH配置
echo $PATH | grep depot_tools
# 解决方案:重新配置PATH
echo 'export PATH="/depot_tools:$PATH"' >> ~/.zshrc
source ~/.zshrc
问题2: depot_tools权限问题
bash
# 症状:Permission denied
# 修复权限
sudo chown -R $(whoami):staff /depot_tools
sudo chmod -R 755 /depot_tools
gclient同步问题
问题3: gclient sync失败
bash
# 症状:HTTP 403 错误或网络超时
# 解决方案1:检查.gclient配置
cat .gclient
# 确保URL正确:https://github.com/flutter/engine.git@3.29.0
# 解决方案2:强制重新同步
gclient sync --delete_unversioned_trees --force --reset
# 解决方案3:清理并重新开始
rm -rf .gclient_entries
gclient sync --verbose
问题4: DEPS文件解析错误
bash
# 症状:Error parsing DEPS file
# 解决方案:更新depot_tools
cd /depot_tools
git pull origin main
# 重新同步
cd ~/flutter_sdk
gclient sync --force
编译相关问题
问题5: compile_engine.sh脚本权限
bash
# 症状:Permission denied: ./compile_engine.sh
# 解决方案:添加执行权限
chmod +x compile_engine.sh
问题6: GN配置失败
bash
# 症状:gn gen failed
# 检查Python环境
python3 --version
# 检查源码完整性
ls flutter/tools/gn
# 重新运行hooks
gclient runhooks --force
问题7: Ninja编译内存不足
bash
# 症状:c++: internal compiler error: Killed
# Mac解决方案:限制并行任务
./compile_engine.sh --mode debug --platform android --cpu arm64
# 在脚本中修改并行数
# 编辑compile_engine.sh,将 -j"$CORES" 改为 -j4
1.7 实用脚本与自动化工具
一键环境安装脚本
bash
#!/bin/bash
# 文件名:setup_flutter_engine_macos.sh
set -e
echo "=== Flutter Engine macOS开发环境一键安装 ==="
# 检查系统
if [[ "$OSTYPE" != "darwin"* ]]; then
echo "错误: 此脚本仅适用于macOS"
exit 1
fi
# 安装Xcode Command Line Tools
echo "1. 安装Xcode Command Line Tools..."
if ! xcode-select -p >/dev/null 2>&1; then
xcode-select --install
echo "请完成Xcode Command Line Tools安装后继续..."
read -p "按回车键继续..."
fi
# 安装Homebrew
echo "2. 检查Homebrew..."
if ! command -v brew >/dev/null 2>&1; then
echo "安装Homebrew..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
# 安装基础工具
echo "3. 安装基础工具..."
brew install git python3
# 安装depot_tools到根目录
echo "4. 安装depot_tools到根目录..."
if [ ! -d "/depot_tools" ]; then
sudo git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /depot_tools
sudo chown -R $(whoami):staff /depot_tools
sudo chmod -R 755 /depot_tools
fi
# 配置环境变量
echo "5. 配置环境变量..."
SHELL_RC="$HOME/.zshrc"
if ! grep -q "/depot_tools" "$SHELL_RC"; then
echo 'export PATH="/depot_tools:$PATH"' >> "$SHELL_RC"
echo 'export DEPOT_TOOLS_UPDATE=0' >> "$SHELL_RC"
fi
# 创建Flutter SDK目录
echo "6. 创建Flutter SDK目录..."
mkdir -p ~/flutter_sdk
# 创建.gclient配置
echo "7. 创建.gclient配置..."
cat > ~/flutter_sdk/.gclient << 'EOF'
solutions = [
{
"managed": False,
"name": ".",
"url": "https://github.com/flutter/engine.git@3.29.0",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
EOF
# 创建编译脚本
echo "8. 创建编译脚本..."
cp compile_engine.sh ~/flutter_sdk/ 2>/dev/null || echo "请手动复制compile_engine.sh到~/flutter_sdk/"
chmod +x ~/flutter_sdk/compile_engine.sh 2>/dev/null || true
echo "=== 安装完成 ==="
echo ""
echo "下一步操作:"
echo "1. 重新启动终端或运行: source ~/.zshrc"
echo "2. 进入源码目录: cd ~/flutter_sdk"
echo "3. 同步源码: gclient sync"
echo "4. 编译Engine: ./compile_engine.sh --mode debug --platform android --cpu arm64"
版本管理脚本
bash
#!/bin/bash
# 文件名:manage_engine_version.sh
ENGINE_DIR="$HOME/flutter_sdk"
CURRENT_VERSION=""
# 切换到Engine目录
cd "$ENGINE_DIR" || {
echo "错误: Flutter Engine目录不存在: $ENGINE_DIR"
exit 1
}
# 获取当前版本
get_current_version() {
if [ -d "flutter/.git" ]; then
cd flutter
CURRENT_VERSION=$(git describe --tags --exact-match 2>/dev/null || git rev-parse --short HEAD)
echo "当前Engine版本: $CURRENT_VERSION"
cd ..
else
echo "Flutter Engine源码未下载"
fi
}
# 列出可用版本
list_versions() {
cd flutter
echo "最新的10个stable版本:"
git tag | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -10
cd ..
}
# 切换版本
switch_version() {
local target_version="$1"
if [ -z "$target_version" ]; then
echo "错误: 请指定目标版本"
return 1
fi
echo "切换Engine到版本: $target_version"
# 修改.gclient文件
sed -i.bak "s/@[^\"]*/@$target_version/" .gclient
# 重新同步
gclient sync --delete_unversioned_trees
echo "版本切换完成"
get_current_version
}
# 同步最新代码
sync_latest() {
echo "同步最新Engine代码..."
gclient sync --verbose
echo "同步完成"
get_current_version
}
# 主函数
main() {
case "$1" in
"current"|"")
get_current_version
;;
"list")
list_versions
;;
"switch")
switch_version "$2"
;;
"sync")
sync_latest
;;
*)
echo "用法: $0 {current|list|switch <version>|sync}"
echo ""
echo "命令说明:"
echo " current - 显示当前版本"
echo " list - 列出可用版本"
echo " switch - 切换到指定版本"
echo " sync - 同步最新代码"
echo ""
echo "示例:"
echo " $0 current"
echo " $0 list"
echo " $0 switch 3.29.0"
echo " $0 sync"
exit 1
;;
esac
}
main "$@"
自动化构建脚本
bash
#!/bin/bash
# 文件名:auto_build_all.sh
echo "=== Flutter Engine自动化构建脚本 ==="
# 检查环境
if [ ! -f "compile_engine.sh" ]; then
echo "错误: 找不到compile_engine.sh"
exit 1
fi
# 构建配置列表
BUILD_CONFIGS=(
"debug android arm64"
"profile android arm64"
"release android arm64"
"debug ios arm64"
"release ios arm64"
)
# 构建结果记录
SUCCESS_BUILDS=()
FAILED_BUILDS=()
echo "开始自动化构建..."
echo "构建配置数量: ${#BUILD_CONFIGS[@]}"
for config in "${BUILD_CONFIGS[@]}"; do
IFS=' ' read -r mode platform cpu <<< "$config"
echo ""
echo "===================="
echo "构建: $mode $platform $cpu"
echo "===================="
# 执行构建
if ./compile_engine.sh --mode "$mode" --platform "$platform" --cpu "$cpu"; then
SUCCESS_BUILDS+=("$config")
echo "✓ 构建成功: $config"
else
FAILED_BUILDS+=("$config")
echo "✗ 构建失败: $config"
fi
done
# 输出构建结果
echo ""
echo "=== 构建结果汇总 ==="
echo "成功构建 (${#SUCCESS_BUILDS[@]}):"
for build in "${SUCCESS_BUILDS[@]}"; do
echo " ✓ $build"
done
echo ""
echo "失败构建 (${#FAILED_BUILDS[@]}):"
for build in "${FAILED_BUILDS[@]}"; do
echo " ✗ $build"
done
# 显示产物大小
echo ""
echo "=== 构建产物大小 ==="
if [ -d "out" ]; then
du -sh out/*/ 2>/dev/null | sort -hr
fi
echo ""
echo "自动化构建完成"
小结
本章针对Mac环境下的Flutter Engine开发,详细介绍了完整的准备工作:
- 环境配置: 针对Mac系统的硬件要求和系统配置
- 工具安装: depot_tools安装到根目录的具体步骤
- 源码管理: 使用指定的.gclient配置和GitHub仓库
- 编译脚本: 区分Mac和Linux的compile_engine.sh脚本
- 问题解决: 针对实际开发中的常见问题
- 自动化工具: 提高开发效率的实用脚本
通过本章的学习,开发者能够:
- 在Mac环境下正确配置Flutter Engine开发环境
- 使用统一的compile_engine.sh脚本进行编译
- 管理不同版本的Flutter Engine
- 解决开发过程中的常见问题
- 使用自动化工具提高工作效率
下一章将介绍Docker环境配置,为需要Linux环境的开发场景提供支持。