2026 6개국 전용 원격 Mac에서 Flutter/React Native 이중 빌드: iOS·Android 동시 상주 자원 경합·병렬 상한·일~월 FinOps 매트릭스

약 14분 소요 · MACCOME

싱가포르, 일본, 한국, 홍콩, 미국 동부·서부전용 원격 Mac에서 Flutter 또는 React Native로 iOS와 Android를 함께 돌릴 때 한쪽만 안정적인데 양쪽을 같이 돌리면 불안정해지면, 원인은 대개 통합 메모리·SSD 쓰기·Gradle Daemon 정책리스 원장과 함께 설계되지 않았기 때문입니다. 통증 목록·병렬 상한표·6단계 런북·지표·리스 판단을 제시하고 Runner·하이브리드 CI·Simulator·DerivedData·근접·egress 문서와 연결합니다.

전용 원격 Mac에서 Flutter·RN 이중 빌드 시 자주 겹치는 여섯 가지 자원 경합

  1. CPU 그래프보다 통합 메모리가 먼저: Xcode·Gradle 프로세스 트리가 넓고 Apple Silicon에서는 메모리 압박Signal 9나 Gradle 변환 중단으로 먼저 드러납니다.
  2. 시뮬레이터와 Android 에뮬레이터의 I/O·GPU 경합: 잔여 이미지가 디스크를 잠식하고 양쪽을 동시에 켜면 랜덤 I/O 큐가 튑니다.
  3. Gradle Daemon과 Xcode 인덱싱: Daemon은 증분을 위해 상주하지만 상한·유휴 회수 없이는 DerivedData·SwiftPM 캐시와 SSD 예산을 나눕니다.
  4. NDK/CMake와 iOS 네이티브 의존성 동시 페치: Git·Maven 미러가 노드 리전과 정렬되지 않으면 벽시계는 컴파일이 아니라 해석에 쓰입니다.
  5. 리스 창과 큐 설계 불일치: 짧은 일 리스에 Android nightly와 iOS 아카이브를 몰아넣으면 마지막 날 정리 경쟁이 납니다.
  6. 공유 HOME: .gradle, .pub-cache, node_modules 미분리는 감사·재현성을 깨뜨립니다.

Simulator·DerivedData, Runner, 하이브리드 CI와 병독하되 본문은 Android·Apple 툴체인 충돌에 초점을 둡니다.

페이지 압·swap, SSD 여유·디렉터리 증가, 크로스리전 패치 egress를 별도 예산으로 보고, 짧은 리스 안에서 빨간선이면 병렬을 줄이고 Daemon을 멈추는 것이 GHz 증설보다 앞입니다.

시나리오M4(16GB 예)M4 Pro레드라인
CLI만Gradle workers 2, Xcode 단일 scheme 직렬workers 3–4swap 연속 증가, 여유 <10GB
Flutter integration + iOS SimulatorAndroid 유닛 후 iOS UI, Daemon 풀오픈 금지flutter drive 상한 하에서만 교차Metal+Java로 SSH 정지
RN release + iOS archive타임박스, archive 전 ./gradlew --stopGRADLE_USER_HOME·DerivedData 분리codesign·zipalign 동시 I/O 실패
info

원리: 동거는 “코어가 남으면 병렬”이 아니라 통합 메모리·SSD 쓰기가 먼저 한계입니다.

여섯 단계 Runbook

  1. 리포 루트에 툴체인 표를 고정하고 CI 입구에서 해시를 출력합니다.
  2. GRADLE_USER_HOME·PUB_CACHE를 데이터 볼륨으로 분리하고 DerivedData 재현성과 맞춥니다.
  3. 기본은 플랫폼 간 직렬, 여유가 일주일 증명될 때만 플래그로 병렬을 엽니다.
  4. Daemon 중지 → android/.cxx 삭제 → DerivedData 로테이션 → Git 순을 스크립트화합니다.
  5. Git·Maven 미러와 노드를 한 줄 표에 적고 근접 행렬과 대조합니다.
  6. 매주 peak RSS·최소 여유 GB·egress MB를 회고합니다.
bash
./gradlew --stop || true
export GRADLE_USER_HOME="$WORK_ROOT/.gradle-isolation"
export ANDROID_SDK_ROOT="$WORK_ROOT/android-sdk"
defaults write com.apple.dt.Xcode IDECustomDerivedDataLocation -string "$WORK_ROOT/DerivedData"
export FLUTTER_ANALYZER_CONCURRENCY=2
export ORG_GRADLE_PROJECT_org.gradle.workers.max=2

세 가지 지표 예시

  • 피크 RSS가 통합 메모리의 약 78%를 넘으면 다음 릴리스는 직렬, 88% 이상에서 swap 증가 시 UI 병렬 금지.
  • 256GB 루트에서 12GB 미만이 세 번 연속이면 캐시 층화 또는 리스 상향 검토.
  • Gradle configuration cache miss+CocoaPods resolve가 주간 30% 악화면 공유 HOME 손상을 의심.

Linux 전용 Android 서버 추가 vs 전원 로컬 이중 빌드

Linux 분리는 RAM을 나누지만 키·큐가 이중화됩니다. 로컬 이중은 감사 불가 드리프트를 부릅니다.

싱가포르·일본·한국·홍콩·미 동서부에서 Git/Registry를 리전에 맞추고 DerivedData·.gradle 수위를 스크립트화하려면 MACCOME Mac 클라우드가 M4/M4 Pro 전용 노드와 일·주·월·계절 리스로 피크 메모리·디스크를 먼저 누르기 쉽습니다.

산출물 세 장

툴체인 표, 동거/분리 매트릭스, 정리·리스 매핑입니다. Monorepo FinOps와는 Git 객체 예산과 캐시 예산의 경계를 명시하세요.

경계

Android가 Mac에 오지 않으면 Runner 글로 돌아갑니다. egress 런북이 있으면 NDK·Engine 캐시를 같은 대장에 넣으세요.

자주 묻는 질문

동시 상주 시 Gradle Daemon 을 꼭 끄나요?

항상 비활성일 필요는 없지만 파이프라인·셸 종료 시 ./gradlew --stop 또는 유휴 회수를 강제하세요. 단기 리스에서 특히 중요합니다. 대여 가격을 참고하세요.

언제 두 대로 나누나요?

직렬화 후에도 이주간 회고에서 계속 빨간선이면, 또는 Android 서명과 iOS 인증서를 규정상 분리해야 할 때입니다. 고객 센터를 보세요.