TL;DR: 네이티브 코드에 영향을 주는 변경사항이 생기면 개발 빌드를 다시 해야 한다
앱 개발을 하면서 expo-location
라이브러리를 설치했다. 그리고 app.json
파일을 수정했다. 그리고 pnpm run android
를 실행하니 에러가 난다.
ERROR Error: Cannot find native module 'ExpoLocation', js engine: hermes
expo-location
라이브러리는 단순한 자바스크립트 코드로만 이루어진 것이 아니라 기기의 GPS 센서와 직접 통신하기 위한 네이티브(Android/iOS) 코드를 포함하고 있다.
하지만 현재 가상 디바이스에 설치된 개발 빌드(.apk
파일)는 expo-location
을 설치하기 전에 만들어진 버전 이다. 따라서 해당 .apk
파일에는 ExpoLocation
이라는 네이티브 모듈이 존재하지 않는다(자바스크립트 라이브러리를 찾는 것이 아님에 주의하자).
여기서는 네이티브 모듈을 찾지 못해 에러가 발생함으로써 빌드를 다시 해야한다는 걸 깨달았지만 app.json
을 변경해도 재빌드가 필요하다. app.json
은 앱의 “설계도” 와 같다. 이 설계도에는 앱의 이름, 아이콘, 버전 뿐만 아니라 ‘어떤 네이티브 기능을 사용할 것 인지’ 에 대한 중요한 정보들이 담겨 있다. 모든 수정이 재빌드를 필요로 하지는 않지만 앱의 뼈대에 영향을 주는 내용을 수정하면 재빌드가 필수적이다.
plugins
: 어떤 네이티브 기능을 활성화 하고 설정할지 정의한다.android.package
: 앱의 고유 식별자(주민등록번호 같은 거)로, 바뀌면 완전히 다른 앱으로 인식된다.name
icon
splash
: 앱의 이름, 아이콘, 스플래시 화면 이미지. 이들은 .apk
파일 내에 리소스로 포함되므로 변경 시 재빌드가 필요하다.android.permissions
: 카메라 권한, 위치 정보 권한 과 같은 권한 요청 목록. 이 목록이 바뀌면 앱의 권한 구조가 바뀌므로 재빌드가 필요하다.💪 핵심 원칙: 자바스크립트 코드가 아닌 앱의 ‘뼈대(네이티브 코드)’ 에 영향을 주는 변경사항이 생기면 무조건 개발 빌드를 다시 해야 한다.
expo start --android
Starting project at /Users/jinhyuckkim/Documents/react-native/inf-threads-clone
Starting Metro Bundler
CommandError: No development build (com.rexiann.infthreadsclone) for this project is installed. Install a development build on the target device and try again.
Learn more
ELIFECYCLE Command failed with exit code 1.
pnpm run android
를 실행하면 Metro 서버가 최신 자바스크립트 코드(새로 추가한 expo-location
을 사용하는 코드)를 가상 디바이스로 보낸다. 하지만 디바이스에 설치된 앱(네이티브 부분)은 구버전이라 ExpoLocation
모듈을 가지고 있지 않다.
그래서 자바스크립트가 “네이티브 모듈 ‘ExpoLocation’ 찾아줘!” 라고 요청했을 때 “그런 거 없는데?” 라며 에러를 발생시키는 것이다.
네이티브 코드를 포함하는 새로운 개발 빌드를 다시 만들고 다운로드 해야 한다. 그리고 빌드를 위한 영겁의 시간을 기다려야 한다 커피타임
터미널에서 다음 명령어를 실행해서 새로운 개발 빌드를 생성한다. 개발이 완료되면 자동으로 .apk
파일을 다운로드 한다. 만약 로컬에서 빠르게 진행하고 싶다면 뒤에 --local
플래그를 추가하자.
eas build --profile development --platform android (--local)
나는 그냥 EAS 서버에서 빌드를 돌렸다. 그리고 빌드가 끝난 뒤 안드로이드 빌드를 에뮬레이터에 다운받아서 실행했다. 잘 된다. 이제 하던 개발을 마저 해야지..