**2024/12/20(금) 현재 사진이 정상적으로 올라가지 않아서, 추후에 사진 업로드 해드리겠습니다**
내가 사용하는 버전set-up
JDK - 17
Android SDK - 35
IOS - 18.2
[Windows] Setting - Environment Variable
Android SDK
1. 시스템 변수 추가
[시스템 변수] - [PATH]에 관련 값 추가
Java JDK
1. JDK 다운로드(원하는 버전으로 openjdk혹은 oracle에서 다운로드. 뭐든 무관합니다)
2. 시스템 변수 추가(1)
- 맨 하단 [새로 만들기] 클릭
- 변수이름:
JAVA_HOME
- 변수 값:
C:\Program Files\Java\jdk-17
- 💡변수 값은 원하는 jdk 버전을 사용한다.
3. [시스템 변수] - [CLASSPATH] 값 셋팅
4. 시스템 변수의 PATH에 값 추가
[MacOS] Setting - Environment Variable
Android SDK
Language & Framework > Android SDK에서 34버전 설치
Android SDK 34버전의 애뮬레이터 생성
- UpsideDownCake(sdk-34) 선택
- 절차 진행 완료 → 애뮬레이터 생성 완료
Java JDK-17 설치
brew install openjdk-17
환경변수 설정
~/.zshrc
파일 셋팅하기
export ANDROID_HOME=$HOME/Library/Android/sdk
- ANDROID_HOMEsdk 설치 경로를 환경변수로 지정(sdk 기본경로 설정)
export PATH=$ANDROID_HOME/platform-tools:$PATH
- Android SDK의 platform-tools 디렉토리를 PATH에 추가
- $PATH는 명령어 실행 시 검색할 디렉토리 목록을 지정하는 환경 변수
- platform-tools에는 Android 디바이스와 통신하거나 앱을 디바이스에 설치하는 데 필요한 도구가 포함
- 주요 명령어:*
- adb (Android Debug Bridge): 디바이스 연결, 로그 보기, 앱 설치 등.
- fastboot: 디바이스 부트로더와 상호작용
export ANDROID_HOME=$HOME/Library/Android/sdk export PATH=$ANDROID_HOME/platform-tools:$PATH export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH
- Android SDK의 최신 명령줄 도구(cmdline-tools/latest/bin) 디렉토리를 PATH에 추가합니다.
- 이 디렉토리에는 SDK 관리와 관련된 명령줄 도구가 포함
- 주요 명령어:
- sdkmanager: Android SDK 구성 요소 설치 및 업데이트.
- avdmanager: Android 가상 디바이스(AVD) 생성 및 관리.export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH
✅ 요약
ANDROID_HOME:
SDK의 루트 경로를 지정하여 기본적인 참조점으로 사용.
platform-tools:
디바이스 연결 및 디버깅과 관련된 작업을 수행하기 위한 명령어를 사용할 수 있게 함.
cmdline-tools/latest/bin:SDK:
구성 요소 설치 및 업데이트를 자동화하거나 명령줄 도구를 사용하는 프로젝트 설정에 필수.
- 적용
zshrc
란?- 환경 변수 설정:
- 예:
export PATH=/usr/local/bin:$PATH
특정 경로를$PATH
에 추가하거나,ANDROID_HOME
같은 변수를 정의.
- 예:
- 별칭(alias) 설정:
- 예:
alias ll='ls -la'
자주 사용하는 명령어를 짧게 정의.
- 예:
- 플러그인 로드:
- 예:
source $ZSH/oh-my-zsh.sh
Zsh 플러그인 프레임워크(예: Oh My Zsh)를 로드.
- 예:
- 프롬프트 커스터마이징:
- 예:
PROMPT='%n@%m %~ %# '
셸 프롬프트의 모양을 설정.
- 예:
securerandom
라이브러리의 요구사항인 Ruby 3.1.0 이상을 충족하지 못해서 발생한 오류- 환경 변수 설정:
brew install rbenv rbenv init echo 'eval "$(rbenv init -)"' >> ~/.zshrc source ~/.zshrc
ERROR: Error installing cocoapods:
The last version of securerandom (>= 0.3) to support your Ruby & RubyGems was 0.3.2. Try installing it with gem install securerandom -v 0.3.2
and then running the current command again
securerandom requires Ruby version >= 3.1.0. The current ruby version is 2.6.10.210.
-
sudo gem install cocoapods pod --version
- 최신 Ruby 버전 설치(버전은 에러에서 확인)
sudo gem install cocoapods
rbenv install 3.2.2 rbenv global 3.2.2 exec $SHELL ruby -v # -> 3.2.2
source ~/.zshrc
### Project root에서
```bash
cd ios
pod install
```
→ 성공적인 설치가 되었다면?
> **Pod installation complete!**
>
>
> There are X dependencies from the Podfile and X total pods installed.
>
위와 같은 메세지가 출력됨
상황
ios 빌드는 잘 되는 상황이지만, android 빌드 시 문제가 발생.
💡 PowerShell에서 환경변수 출력하기
Get-ChildItem Env:[환경 변수명]
지금까지 얼만큼 시도했는지 기억은 안 난다.. 이렇게 하다간 도저히 해결하지 못할 것 같아서, 기록하며 이 문제를 해결할 시점엔 이 트러블슈팅 과정을 나 뇌리에 새기기 위해 기록하려고 합니다.
n번째 시도…, 기본 환경에서 테스트
💡기존의 프로젝트는 여러 의존성이 엮여있기 때문에, 제 문제해결의 과정이 문제가 있었는지 확인하기 위해 새로운 프로젝트에서 안드로이드를 실행 환경을 구축하고 빌드해보려고 합니다. 여기서 된다면, 실행 방법에는 문제가 없고 제 프로젝트 환경에서 문제가 있는 거겠죠…
React Native 프로젝트를 생성한 후, Android 모드로 실행하여 애뮬레이터를 돌려보려면 아래의 명령을 실행하면 됩니다.
- Metro 실행 npx react-native start를 실행하지 않으면 아래와 Doctor 검사 시, 아래와 같은 메세지가 출력됩니다.
npx react-native start #Metro 실행
- Android 실행(Metro 실행 창과 다른 Tab을 열고 실행해야 합니다)→ 안됨… 0%에서 올라가지 않는 상황 ㅠ
npx react-native run-android #Android 실행
- doctor를 통해 검사해보자android sdk가 준비되지 않았다고 한다.
npx react-native doctor
- 안드로이드 SDK를 설치합시다.
- 다시 npx react-native doctor, 다행히도 정상적으로 모든 준비가 완료되었다.
n+1 번째 시도…, 이제 다시 실행시켜 봅시다!
- 현재 탭에서 Metro 실행
npx react-native start
- 다른 탭에서 Android 실행
npx react-native run-android
결과(ERROR)
(node:27328) ExperimentalWarning: CommonJS module C:\Users\zaq48\AppData\Roaming\npm\node_modules\npm\node_modules\debug\src\node.js is loading ES Module C:\Users\zaq48\AppData\Roaming\npm\node_modules\npm\node_modules\supports-color\index.js using require(). Support f or loading ES Module in require() is an experimental feature and might change at any time (Use `node --trace-warnings ...` to show where the warning was created) (node:3904) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead. (Use `node --trace-deprecation ...` to show where the warning was created) info A dev server is already running for this project on port 8081. info Installing the app... > Task :app:installDebug [PropertyFetcher]: TimeoutException getting properties for device emulator-5554 java.lang.Throwable: TimeoutException getting properties for device emulator-5554 at com.android.ddmlib.PropertyFetcher.handleException(PropertyFetcher.java:259) at com.android.ddmlib.PropertyFetcher$1.run(PropertyFetcher.java:213) Caused by: com.android.ddmlib.TimeoutException at com.android.ddmlib.AdbHelper.read(AdbHelper.java:882) at com.android.ddmlib.AdbHelper.readAdbResponse(AdbHelper.java:351) at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$18(DeviceImpl.java:795) at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801) at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:755) at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$15(DeviceImpl.java:618) at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801) at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:615) at com.android.ddmlib.internal.DeviceImpl.lambda$executeShellCommand$13(DeviceImpl.java:557) at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801) at com.android.ddmlib.internal.DeviceImpl.executeShellCommand(DeviceImpl.java:554) at com.android.ddmlib.PropertyFetcher$1.run(PropertyFetcher.java:209) [PropertyFetcher]: TimeoutException getting properties for device emulator-5554 java.lang.Throwable: TimeoutException getting properties for device emulator-5554 at com.android.ddmlib.PropertyFetcher.handleException(PropertyFetcher.java:259) at com.android.ddmlib.PropertyFetcher$1.run(PropertyFetcher.java:213) Caused by: com.android.ddmlib.TimeoutException at com.android.ddmlib.AdbHelper.read(AdbHelper.java:882) at com.android.ddmlib.AdbHelper.readAdbResponse(AdbHelper.java:351) at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$18(DeviceImpl.java:795) at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801) at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:755) at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$15(DeviceImpl.java:618) at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801) at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:615) at com.android.ddmlib.internal.DeviceImpl.lambda$executeShellCommand$13(DeviceImpl.java:557) at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801) at com.android.ddmlib.internal.DeviceImpl.executeShellCommand(DeviceImpl.java:554) at com.android.ddmlib.PropertyFetcher$1.run(PropertyFetcher.java:209) Skipping device 'BusTrackerDevice1_35(AVD)' for ':app:debug': Unknown API Level > Task :app:installDebug FAILED 62 actionable tasks: 17 executed, 45 up-to-date info 💡 Tip: Make sure that you have set up your development environment correctly, by running npx react-native doctor. To read more about doctor command visit: https://github.com/react-native-community/cli/blob/main/packages/cli-doctor/README.md#doctor FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:installDebug'. > java.util.concurrent.ExecutionException: org.gradle.api.GradleException: Failed to install on any devices. * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. BUILD FAILED in 10s error Failed to install the app. Command failed with exit code 1: gradlew.bat app:installDebug -PreactNativeDevServerPort=8081 FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:installDebug'. > java.util.concurrent.ExecutionException: org.gradle.api.GradleException: Failed to install on any devices. * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. BUILD FAILED in 10s.
- Metro 실행
- 명령어:
npx react-native start
- 명령어:
- Android Studio - Device Manager - Amulator 실행
- Doctor 검사를 실행하여 최종 확인
- 명령어
npx react-native doctor
- Android 실행(성공!!!)
npx react-native run-android
(성공!!)
n+2 번째 시도…, 내 프로젝트 환경에 적용해보자
내 프로젝트에서 다시 시도해보자
프로젝트의 안드로이드 빌드 관련 파일들을 모두 테스트 환경과 동일하게 해줍니다. (이러면 문제가 없겠죠)
- 자, 우선 Metro를 실행시킵니다.음… react-native cli 버전이 최신 버전이 아닌 것 같군요. 업데이트 해봅시다.
- 의존성을 설치합시다
npm install
- 버전 확인
npx react-native --version
- 다시
npx react-native start
- 이제 doctor 검사를 진행해볼까요?오케이!! 좋습니다. 제발 돼라…
npx react-native run-android
으로 Android 실행정..말.. 너무하다ㅠㅠㅠ 왜 안 될까요?- 혹시 adb 문제일 가능성???
- 문제는 없었습니다… 도대체 뭐가 문제일까요
- 연결된 애뮬레이터가 없어서 그럴까요..?라는 생각을 해봤지만
- 기기는 잘 연결돼있지만 React-native가 이를 인식하지 못할 수도 있다고 하더군요..
adb kill-server adb start-server
- 지금까지 너무 많은 테스트를 해서, 캐시 문제일 가능성을 고려하여 캐시를 모두 초기화해줍니다.
- 왜 이것도 0%에서 오르지 않는 걸까요…?ㅠ
cd android ./gradlew clean
- 다른 실행중인 서버가 문제를 일으킬 수 있으니 Node도 초기화합니다.
npx react-native start --reset-cache
- 디버깅 모드로 한번 실행해봅시다…이 역시 0%에서 오르지 않네요..
npx react-native run-android --verbose
- Gradle 문제일 가능성Gradle에 대해 공부해보고 다시 문제를 해결해봅시다.
- Gradle 알아보기Gradle-Wrapper를 사용하는 이유에 대해서 알아보았는데, Gradle 프로젝트를 빌드하고 사용하기 위해선 프로젝트의 Gradle과 내 컴퓨터의 Gradle 버전을 항상 동일하게 유지시켜줘야 하는데, 이는 상당히 번거로운 작업이라 Gradle-Wrapper를 사용한다고 합니다.
- Gradle-Wrapper를 사용하면 Gradle을 설치하지 않고도 지정된 Gradle 버전으로 빌드를 진행할 수 있다고 합니다.
참고 문서
https://ttl-blog.tistory.com/1268
- 남은 건 Gradle…
n+3 번째 시도…, 그냥 다시 만들자
도저히 안돼서, 기존의 프로젝트에 환경구축을 하지 않고 새로 프로젝트를 만들어서 기존 프로젝트의 코드를 이전시켜야겠습니다…
- 새로운 프로젝트 생성
npx @react-native-community/cli init BusBuddyBuddy
# BudBuddyBuddy 자리는 프로젝트명을 입력
- 프로젝트 코드를 모두 옮겨줍니다
- package.json을 보며, 필요한 패키지 모듈을 모두 설치해줍니다.(정말 귀찮군요…)
- 자 이제 시작해봅시다(이전의 SDK, 애뮬레이터 실행은 모두 완료됐다는 가정 하에 실행)
npx react-native start
# Metro 실행(n번 탭) npx doctor # 결과 -> 모두 정상 npx react-native run-android # Android 실행(n+1번 탭)
트러블슈팅 간에 알게된 유용한 지식
gradle 캐시 제거
"C:\Users[사용자명].gradle\caches” 디렉토리를 삭제해줍니다.
삭제하는 이유
- 의존성 충돌이 발생할 경우, 초기화하는 역할을 합니다.
- 빌드 시, 문제가 발생할 때 프로젝트 루트의 android파일 위치에서
gradlew clean
명령이 반영되지 않을 때가 있습니다. 이럴 때 해당 경로의 caches 디렉토리를 삭제해주면 됩니다.
빌드 캐시 제거
gradlew clean
해당 명령을 사용하는 이유
- 의존성이 충돌하는 경우.
- 지난 빌드와 다음 빌드 간의 의존성 충돌이 우려되는 경우
위와 같은 경우에 실행합니다.
혹시 명령을 실행해도 반영되지 않는다면 gradle 캐시 제거에서 언급한 경로에서 caches 디렉토리를 삭제하여 문제를 해결할 수 있었습니다.
캐시 초기화와 함께 시작
npx react-native start --reset-cache
"C:\Users\zaq48\AppData\Local\Temp\metro-cache”경로의 캐시를 초기화한다고 합니다.
가끔 Metro 서버가 비정상적으로 작동하여 앱이 제대로 실행되지 않을 때 해당 명령을 사용하여 해결하였습니다.
Notion에 정리한 자료로는 정말 참고 사진이 많은데ㅠ 티스토리에는 목록 사이사이에 자유롭게 사진이 안 들어가서 많이 뺐습니다.. 원본을 보고 싶으신 분들은 아래 노션 페이지를 접속해주세요!