WSL2에서 Expo Build Environment 설정 (Android Studio 없이, Expo 크레딧을 지불하지 않고)
Source: Dev.to
왜 로컬에서 빌드해야 할까?
1️⃣ Expo 클라우드 빌드는 비용이 든다
Expo는 작은 무료 할당량을 제공한다. 그 이후에는 빌드당 비용을 지불해야 하는데—프로덕션에는 괜찮지만 빠른 반복이나 테스트에는 부담이다.
로컬 빌드 = 무제한 무료 빌드.
2️⃣ Android Studio는 거대하고 불필요하다
전체 Android Studio 설치에는 IDE, 에뮬레이터, GUI 도구, 그리고 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 Studio 없이 가벼운 Android SDK 설치
- 머신 간 재현 가능한 환경
- Expo CI 로그와 완벽히 일치
나는 Expo 클라우드 로그를 한 줄씩 확인하고 정확한 버전을 복사해 로컬 머신에 동일한 환경을 재현했다.
원한다면 다음도 제공 가능:
- ✅ 모든 과정을 한 번에 실행하는 설치 스크립트
- ✅ Docker 이미지 형태의 환경
- ✅ macOS 혹은 Windows‑native 버전
필요한 것이 있으면 알려 주세요!