在 WSL2 上设置 Expo 构建环境(无需 Android Studio 或支付 Expo Credits)

发布: (2025年12月3日 GMT+8 06:10)
4 min read
原文: Dev.to

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)

适用于 ExpoReact Native CLIEAS 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 本地变体

随时告诉我你的需求!

Back to Blog

相关文章

阅读更多 »