React Native 에서 Android 빌드 속도를 빠르게 할 수 있는 법

eeennsu·2026년 7월 3일

React Native

목록 보기
60/95

개요

react native 에서 안드로이드는 빌드할 때, dev 든 release든 매우 느린 시간을 거친다. ios는 비교적 android보다 빠른 것 같은데, 왜 유독 android의 빌드 속도는 느린걸까? ios처럼 빠르게 할 수 없는 것일까? 이에 대해 살펴보자.



배경 — 안드로이드 ABI와 기본 빌드의 문제

안드로이드 기기는 CPU 아키텍처가 여러 종류다. React Native 앱은 기본적으로 다음 네 가지 ABI를 모두 빌드한다.

  • arm64-v8a — 요즘 실제 폰 대부분 (64비트 ARM)
  • armeabi-v7a — 구형 기기 (32비트 ARM)
  • x86 — 일부 에뮬레이터 (32비트)
  • x86_64 — 에뮬레이터 (64비트)

문제는 RN 앱에 네이티브 코드(C++/JNI) 가 들어있다는 점이다. 네이티브 코드는 ABI마다 따로 컴파일해야 하므로, 기본 빌드는 같은 네이티브 코드를 사실상 4번 컴파일한다. 그런데 개발 중에는 보통 기기나 에뮬레이터 딱 하나에만 설치해서 테스트한다. 즉 나머지 3개 ABI 빌드는 그 순간엔 완전히 낭비다.

그렇다면 android도, 내가 방금 빌드한 기기나 애뮬레이터 딱 하나에만 빌드를 시켜 나머지 필요없는 빌드과정을 건너뛰게 할 순 없을까? 이때 android의 --active-arch-only 옵션이 이 역할을 해준다.

이에 반해 iOS 실기기는 arm64 하나라 빌드할 아키텍처가 적은 건 맞다. 다만 더 정확한 핵심은, iOS 디버그 빌드가 ONLY_ACTIVE_ARCH=YESactive-arch-only를 기본 적용하고 있어서다. 즉 안드로이드의 --active-arch-only는 iOS가 원래 하던 동작을 안드에서도 켜주는 플래그인 셈이다.



--active-arch-only가 하는 일

이 플래그를 붙이면 CLI가 연결된 기기/에뮬레이터의 ABI를 자동으로 감지해서, 그 하나만 빌드한다. 빌드 로그에 다음처럼 감지된 아키텍처가 찍힌다.

info Detected architectures arm64-v8a
info Installing the app...

네이티브 컴파일량이 1/4 수준으로 줄어드니, 네이티브 코드가 많은 프로젝트일수록 체감 효과가 크다.



사용법 (React Native CLI)

run-android 명령에 플래그를 붙이기만 하면 된다.

npx react-native run-android --active-arch-only
# 또는
yarn react-native run-android --active-arch-only

매번 치기 번거로우면 package.json 스크립트에 박아두는 것도 좋다.

{
  "scripts": {
    "android": "react-native run-android --active-arch-only"
  }
}


내부 메커니즘 — reactNativeArchitectures

이 옵션이 어떻게 동작하는지 알아두면 응용이 쉽다. CLI는 내부적으로 reactNativeArchitectures라는 Gradle 프로퍼티에 감지된 ABI를 넘기는 방식으로 동작한다. 즉 마법이 아니라 그냥 Gradle 프로퍼티를 채워주는 것이다.

그래서 CLI 없이 Gradle을 직접 호출할 때는 이 프로퍼티를 손으로 지정하면 같은 효과를 낸다.

./gradlew :app:assembleDebug -PreactNativeArchitectures=x86,x86_64

이 방식은 CI에서 특히 유용하다. 빌드 매트릭스로 아키텍처별 빌드를 병렬화할 때 ABI를 직접 분배할 수 있기 때문이다.

값을 프로젝트에 영구적으로 고정하고 싶다면, 최상위 폴더의 gradle.properties에 적어둔다.

# 빌드할 아키텍처를 지정한다
reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64

참고: Apple Silicon(M 시리즈) Mac에서 돌리는 안드로이드 에뮬레이터는 arm64-v8a이고, 실제 폰도 대부분 arm64-v8a다. 그래서 요즘 개발 환경에서 --active-arch-only로 잡히는 ABI는 거의 arm64-v8a 하나다.



신아키텍처(New Architecture)에서 더 중요해졌다

이 플래그의 가치는 신아키텍처가 기본이 되면서 더 커졌다. 신아키텍처는 Fabric·TurboModules 등으로 네이티브 코드 컴파일량이 크게 늘어난다. 빌드할 네이티브 코드 자체가 많아졌으니, 그걸 4개 ABI로 곱하면 빌드 시간이 더 크게 부풀고, 반대로 1개 ABI로 줄이면 절약 폭도 더 커진다.

실제로 RN 0.78대에서 신아키텍처로 올린 뒤 빌드가 6분 넘게 걸리던 것을, --active-arch-only를 포함한 최적화로 2분 아래로 줄어든다. 체감이 아주 크다.



프로덕션 빌드에는 절대 쓰지 말 것

가장 중요한 주의사항이다. --active-arch-only(또는 단일 ABI 빌드)는 개발 전용이다. 릴리스(프로덕션) 빌드에는 절대 쓰면 안 된다.

이유는 명확하다. 단일 아키텍처로 빌드해 배포하면, 그 아키텍처가 아닌 기기를 쓰는 사용자에게는 앱이 깨지거나 설치/실행이 안 된다. 예를 들어 arm64-v8a로만 빌드해 올리면 구형 32비트(armeabi-v7a) 기기 사용자는 앱을 못 쓴다. 그래서 릴리스 빌드는 반드시 모든 필요한 ABI를 포함해야 한다.

정리하면 역할이 명확히 갈린다. 개발·디버그 빌드 = 빠르게 하나만, 릴리스 빌드 = 안전하게 전부.



정리

  • --active-arch-onlyrun-android에서 연결된 기기의 ABI 하나만 빌드해 개발 빌드를 빠르게 한다.
  • 내부적으로 reactNativeArchitectures Gradle 프로퍼티로 동작하며, Gradle 직접 호출이나 gradle.properties로도 같은 제어가 가능하다.
  • 네이티브 코드가 많은 신아키텍처 환경에서 효과가 특히 크다.
  • 프로덕션 릴리스에는 절대 쓰지 않는다. 일부 사용자 기기에서 앱이 동작하지 않게 된다.

설정 부담이 거의 없으면서 즉시 효과를 보는 옵션이라, 안드로이드 빌드 최적화를 시작한다면 가장 먼저 적용할 카드다. 그다음 단계로 ccache 같은 컴파일러 캐시나 Gradle Configuration Caching(RN 0.79+)을 더해 나가면 된다.

profile
이력서 https://resume.eunsu.pro

0개의 댓글