在 WSL2 上设置 Expo 构建环境(无需 Android Studio 或支付 Expo Credits)
Source: Dev.to
为什么要在本地构建?
1️⃣ Expo 云构建需要花钱
Expo 提供少量免费配额。超出后,需要按构建次数付费——这在生产环境可以接受,但在快速迭代或测试时并不友好。
本地构建 = 无限免费构建。
2️⃣ Android Studio 体积庞大且并非必需
完整的 Android Studio 包含 IDE、模拟器、图形界面工具以及许多你在 CI‑style 构建中不需要的额外组件。
你只需要 命令行 SDK、build‑tools、platform‑tools 和 NDK。
我的方案只安装 必需的部分,将安装体积从约 30 GB 缩减至 约 3 GB。
完整安装指南(WSL2 Ubuntu 24.04)
适用于 Expo、React Native CLI、EAS Build。
与 Expo 的云构建环境保持一致。
无需 Android Studio。
1) 基础依赖
sudo apt update
sudo apt install -y build-essential git unzip zip curl wget ca-certificates openjdk-17-jdk
2) Node 20.19.4(匹配 Expo CI)
Expo 的云日志显示使用 Node 20.19.4,因此使用 NVM 安装该版本:
export NVM_DIR="$HOME/.nvm"
if [ ! -d "$NVM_DIR" ]; then
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
fi
source "$NVM_DIR/nvm.sh"
nvm install 20.19.4
nvm alias default 20.19.4
可选的包管理器:
npm i -g yarn@1.22.22 pnpm@10.14.0 bun@1.2.20
3) Android SDK + Build‑tools + NDK r27b(最小化安装)
不使用 Android Studio。仅安装构建 APK/AAB 所需的组件。
下载命令行工具
export ANDROID_HOME="$HOME/Android/Sdk"
mkdir -p "$ANDROID_HOME"
cd /tmp
wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O cmdtools.zip
mkdir -p "$ANDROID_HOME/cmdline-tools"
unzip -q cmdtools.zip -d "$ANDROID_HOME/cmdline-tools"
mv "$ANDROID_HOME/cmdline-tools/cmdline-tools" "$ANDROID_HOME/cmdline-tools/tools"
添加到 PATH
export PATH="$ANDROID_HOME/cmdline-tools/tools/bin:$ANDROID_HOME/platform-tools:$PATH"
接受许可证
yes | sdkmanager --licenses
安装核心包
sdkmanager "platform-tools" \
"platforms;android-35" \
"build-tools;35.0.0" \
"build-tools;29.0.3" \
"ndk;27.1.12297006" \
"extras;google;m2repository" \
"extras;android;m2repository"
设置 NDK 环境变量
export ANDROID_NDK_HOME="$ANDROID_HOME/ndk/27.1.12297006"
4) Java + Gradle 配置
Expo 使用 Java 17 并指定了特定的 Gradle JVM 参数:
export JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
export GRADLE_OPTS='-Dorg.gradle.jvmargs="-XX:MaxMetaspaceSize=1g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8" -Dorg.gradle.parallel=true -Dorg.gradle.daemon=false'
5) Expo / EAS CLI + 工具
npm i -g expo-cli eas-cli
可选但实用
Maestro
curl -Ls "https://get.maestro.mobile.dev" | bash
Bundletool
sudo mkdir -p /opt/bundletool
sudo wget -q https://github.com/google/bundletool/releases/download/1.17.2/bundletool-all-1.17.2.jar -O /opt/bundletool/bundletool.jar
echo 'alias bundletool="java -jar /opt/bundletool/bundletool.jar"' >> ~/.bashrc
6) 永久添加环境变量
将以下内容追加到 ~/.bashrc:
# Android SDK
export ANDROID_HOME="$HOME/Android/Sdk"
export ANDROID_SDK_ROOT="$ANDROID_HOME"
export ANDROID_NDK_HOME="$ANDROID_HOME/ndk/27.1.12297006"
export PATH="$HOME/.nvm/versions/node/v20.19.4/bin:/opt/bundletool:$ANDROID_HOME/build-tools/29.0.3:$ANDROID_HOME/build-tools/35.0.0:$ANDROID_NDK_HOME:$ANDROID_HOME/cmdline-tools/tools/bin:$ANDROID_HOME/platform-tools:$PATH"
# Java
export JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
# Expo Token
export EXPO_TOKEN=""
# Gradle
export GRADLE_OPTS='-Dorg.gradle.jvmargs="-XX:MaxMetaspaceSize=1g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8" -Dorg.gradle.parallel=true -Dorg.gradle.daemon=false'
# CI‑like behavior
export CI=1
使更改生效:
source ~/.bashrc
7) 验证一切是否正常
node -v
npm -v
java -version
sdkmanager --list | head -n 50
bundletool --version
maestro --version
8) 本地执行一次 EAS 构建
在你的 Expo 项目目录下:
npx eas build --local --platform android --profile production
现在构建 不会消耗 Expo 积分,并且行为与云端运行器完全一致。
最后感想
这种做法为你提供了:
- 零成本的无限构建
- 轻量级的 Android SDK 安装(无需 Studio)
- 跨机器可复现的环境
- 与 Expo CI 日志完美对齐
我是通过逐行检查 Expo 的云日志,复制精确的版本号,然后在本地复现它们的环境来完成此方案的。
如果需要,我还可以提供:
- ✅ 一键安装脚本
- ✅ Docker 版环境
- ✅ macOS 或 Windows 本地变体
随时告诉我你的需求!