조용진의 개발 블로그
← 글 목록

React Native 0.79 전환과 Android 16KB 페이지 대응기

React NativeAndroid16KB Page Size마이그레이션

React Native 0.79 전환, Swift AppDelegate 변경과 Android ABI·native library 구성을 함께 정비한 과정을 정리합니다.

React Native 앱과 키오스크 앱을 0.79 계열로 올리는 과정에서 JavaScript 패키지만 바꿔서는 빌드가 끝나지 않았다. Android Gradle·JSC·Native Module과 iOS AppDelegate·Pod 구성을 함께 맞춘 뒤, 키오스크 앱에는 Android 16KB 메모리 페이지 대응을 추가했다.

React Native와 네이티브 의존성을 같은 버전 축으로 맞췄다

키오스크 앱은 React Native 0.77.3에서 0.79.6, React 18.3.1에서 19.0.0으로 이동했다. React Navigation, Firebase, RN CLI, Babel·Metro preset 등도 0.79와 호환되는 조합으로 올렸다.

Android에서는 JSC artifact와 Gradle wrapper를 갱신했다.

def jscFlavor = "io.github.react-native-community:jsc-android:2026004.+"
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip

한 앱에서는 0.79 전환과 함께 Recoil을 Zustand로 교체했고, 화면의 useRecoilValue·useRecoilState 호출을 store selector와 action으로 옮겼다.

iOS 진입점을 React Native Factory 방식으로 바꿨다

Objective-C 기반 AppDelegate에서 Swift UIApplicationDelegate와 RCTReactNativeFactory를 사용하는 구조로 전환했다.

let delegate = ReactNativeDelegate()
let factory = RCTReactNativeFactory(delegate: delegate)
delegate.dependencyProvider = RCTAppDependencyProvider()

factory.startReactNative(
  withModuleName: "App",
  in: window,
  launchOptions: launchOptions
)

Firebase 초기화와 URL Scheme 처리처럼 기존 네이티브 동작은 새 진입점에 다시 연결했다. 다른 앱의 iOS 전환에서는 당시 Native Module 호환성을 위해 Pod 설정에서 New Architecture를 비활성화했다. 업그레이드에서 최신 옵션을 모두 켜는 것보다 현재 Native Module 조합이 실제로 빌드되는 설정을 먼저 확정했다.

16KB 대응은 ABI와 패키징·네이티브 의존성을 함께 바꿨다

Android 16KB 페이지 대응에서는 앱의 NDK ABI를 64비트 대상으로 제한하고 JNI 라이브러리의 legacy packaging을 끄도록 설정했다.

defaultConfig {
  ndk {
    abiFilters "arm64-v8a", "x86_64"
  }
}

packaging {
  jniLibs {
    useLegacyPackaging = false
  }
}

네이티브 바이너리를 포함하는 @shopify/react-native-skia도 2.0.0에서 2.2.14로 올렸다. 16KB 대응은 Gradle 플래그 하나가 아니라 앱에 들어가는 .so를 제공하는 의존성 버전까지 함께 확인하는 작업이었다.

React Native 0.79/0.79.6 전환에는 Swift AppDelegate와 Gradle·JSC·Navigation·Firebase 갱신이 함께 필요했다. Android 16KB 페이지 대응에는 ABI·JNI 패키징 설정과 Skia 업그레이드를 포함했다.

React Native 마이그레이션의 실제 단위는 npm 패키지가 아니다. JavaScript 런타임, 빌드 도구, 네이티브 진입점, 바이너리 의존성을 하나의 배포물로 검증하는 일이다.