메뉴 건너뛰기

모바일앱


요즘은 개발 환경 세팅에만 성공해도 절반은 일을 다 한 듯한 느낌이 드는 것 같습니다ㅎㅎ


최근 리액트 네이티브 환경을 갖추고 빌드를 시도했는데 다양한 오류들을 만나 버렸습니다. 프레임워크의 업데이트가 잦다보니 이같은 안타까운 현실이 자주 만들어지는 것 같습니다.


1. ios 용 빌드시 아래와 같은 오류를 만났을 때 대응 방법입니다.

(void)[self _initializeModules:RCTGetModuleClasses() withDispatchGroup:prepareBridge lazilyDiscovered:NO];
                                 ^~~~~~~~~~~~~~~~~~~~~
/node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm:770:82: note: passing argument to parameter 'modules' here
- (NSArray<RCTModuleData *> *)_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules
                                                                                 ^
/node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm:775:79: error: cannot initialize a parameter of type 'NSArray<Class> *' with an lvalue of type 'NSArray<id<RCTBridgeModule>> *__strong'
  NSArray<RCTModuleData *> *moduleDataById = [self _registerModulesForClasses:modules lazilyDiscovered:lazilyDiscovered];
                                                                              ^~~~~~~
/node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm:617:76: note: passing argument to parameter 'moduleClasses' here
- (NSArray<RCTModuleData *> *)_registerModulesForClasses:(NSArray<Class> *)moduleClasses
                                                                           ^
/node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm:826:69: error: cannot initialize a parameter of type 'NSArray<id<RCTBridgeModule>> *' with an lvalue of type 'NSArray<Class> *__strong'
    NSArray<RCTModuleData *> *newModules = [self _initializeModules:modules withDispatchGroup:NULL lazilyDiscovered:YES];
                                                                    ^~~~~~~
/node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm:770:82: note: passing argument to parameter 'modules' here
- (NSArray<RCTModuleData *> *)_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules
                                                                                 ^
3 errors generated.

_______________________________ 또는 _______________________________

/node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm:300:11: error: no matching function for call to 'RCTBridgeModuleNameForClass'
          RCTBridgeModuleNameForClass(module));
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm:17:
/ios/Pods/Headers/Public/React-Core/React/RCTLog.h:35:52: note: expanded from macro 'RCTLogError'
#define RCTLogError(...) _RCTLog(RCTLogLevelError, __VA_ARGS__)
                                                   ^~~~~~~~~~~
/ios/Pods/Headers/Public/React-Core/React/RCTLog.h:127:74: note: expanded from macro '_RCTLog'
#define _RCTLog(lvl, ...) _RCTLogNativeInternal(lvl, __FILE__, __LINE__, __VA_ARGS__)
                                                                         ^~~~~~~~~~~
In file included from /node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm:8:
In file included from /node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.h:8:
In file included from /node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.h:12:
/ios/Pods/Headers/Public/React-Core/React/RCTBridge.h:125:22: note: candidate function not viable: no known conversion from '__strong id<RCTTurboModule>' to '__unsafe_unretained Class' for 1st argument
RCT_EXTERN NSString *RCTBridgeModuleNameForClass(Class bridgeModuleClass);
                     ^
1 error generated.

[대응방법]

a. ios 경로의 Podfile을 여세요

vi ios/Podfile


b. 아래코드를 Podfile 상단에 추가 합니다. require_relative 문 아래에 두면 좋을 겁니다.

post_install do |installer|
## Fix for XCode 12.5
    find_and_replace("../node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm",
    "_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules", "_initializeModules:(NSArray<Class> *)modules")
    find_and_replace("../node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm",
    "RCTBridgeModuleNameForClass(module))", "RCTBridgeModuleNameForClass(Class(module)))")
end


c. 아래코드를 Podfile 최하단에 추가합니다.

def find_and_replace(dir, findstr, replacestr)
  Dir[dir].each do |name|
      text = File.read(name)
      replace = text.gsub(findstr,replacestr)
      if text != replace
          puts "Fix: " + name
          File.open(name, "w") { |file| file.puts replace }
          STDOUT.flush
      end
  end
  Dir[dir + '*/'].each(&method(:find_and_replace))
end


d. ios 경로에서 아래 명령을 실행합니다

pod install


e. 빌드를 시도합니다



2. android 용 빌드시 아래와 같은 오류를 만났을 때 대응 방법입니다.

> Task :app:compileDebugJavaWithJavac FAILED

:

FAILURE: Build failed with an exception

*What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> java.lang.IllegalAccessError: class org.gradle.internal.compiler.java.classNameCollector (in unmaed module @ ...)


[대응방법]

JDK를 찾지 못해 발생하는 오류입니다.


a. 아래 명령으로 java 경로를 확인합니다

% /usr/libexec/java_home -V

atching Java Virtual Machines (3):
    1.8.301.09 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
    1.8.0_211 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home
    1.8.0_202 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home


적절한 경로를 선택해서 복사합니다.


b. 복사한 경로를 .zshrc 파일 또는 .bash_profile 에 아래와 같이 반영합니다.

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home


c. 환경변수를 반영합니다.

% source ~/.zshrc

또는,

% source ~/.bash_profile


d. 빌드를 시도합니다.



건투를 빕니다 :)



<참고경로>

- https://mkyong.com/java/how-to-set-java_home-environment-variable-on-mac-os-x/

- https://github.com/facebook/react-native/issues/28405








번호 제목 글쓴이 날짜 조회 수
공지 [TIP] 안드로이드 앱 빌드시 "Error:Execution failed for task ':app:compileDebugJavaWithJavac'" 오류가 발생할 경우 파이팅건맨 2017.09.13 13279
공지 [TIP] 안드로이드 - 설치된 앱 목록 얻기 파이팅건맨 2016.03.22 8029
공지 [TIP] 안드로이드 앱이 처음 설치될때 Referrer 정보 받아 오기 파이팅건맨 2016.08.30 7348
» [TIP] React-native 빌드 오류 대응 방법 파이팅건맨 2021.09.10 10
46 [TIP] 안드로이드 프로젝트 열 때 Failed to apply plugin [id 'com.android.application'] 오류 파이팅건맨 2021.07.03 41
45 [TIP] 안드로이드 앱이 처음 설치될때 Referrer 정보 받아 오기 (2020.3.1 이후) 파이팅건맨 2020.10.15 333
44 tizen .net wearable widget 질문해도 될까요? [1] 갤럭시규 2019.08.19 238
43 [TIP] iOS - UIWebView에 로컬 html 파일 로드하기 (Swift 4) 파이팅건맨 2019.06.05 1441
42 [TIP] Tizen Push가 갑자기 내려오지 않을때 파이팅건맨 2019.05.20 330
41 [TIP] 두근두근앱이 라즈베리파이를 두근거리도록 개발한 기록 #3 파이팅건맨 2019.05.15 1993
40 [TIP] 두근두근앱이 라즈베리파이를 두근거리도록 개발한 기록 #2 [4] 파이팅건맨 2019.05.11 1229
39 [TIP] Android 코드에서 블루투스 연결이 잘 안될때 [3] 파이팅건맨 2019.05.11 4213
38 [TIP] 두근두근앱이 라즈베리파이를 두근거리도록 개발한 기록 #1 파이팅건맨 2019.05.07 2885
37 [TIP] 타이젠 스튜디오에서 웨어러블 디바이스로 디버깅을 위한 바이너리 전송이 안 될때 파이팅건맨 2019.03.26 1093
36 [TIP] http://tizen.org/system/tizenid 으로 타이젠 고유 id를 확보할 때 유의할 점 파이팅건맨 2019.03.14 211
35 [TIP] "cordova run android" 명령을 실행했는데 "A problem occurred evaluating project ':CordovaLib'"오류가 뜰때 파이팅건맨 2019.01.22 1229
34 [TIP] Mac에서 Cordova run android 를 실행했는데 "Command failed with exit code EACCES" 오류가 뜰때 파이팅건맨 2019.01.22 552
33 [TIP] 안드로이드에서 심박수 측정하는 코드 [18] 파이팅건맨 2019.01.02 4151
32 [TIP] Google Cloud API 사용시 안드로이드의 Assets 폴더에 있는 Crendential 파일 사용하기 파이팅건맨 2018.05.29 434
31 [TIP] 안드로이드 스튜디오에서 Error:android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcessor' configuration instead 오류날때 파이팅건맨 2018.02.02 3042
30 [TIP] 안드로이드 앱 빌드시 "Error:Execution failed for task ':app:compileDebugJavaWithJavac'" 오류가 발생할 경우 파이팅건맨 2017.09.13 13279
29 [TIP] Error:java.lang.OutOfMemoryError: GC overhead limit exceeded 파이팅건맨 2016.11.03 1031
28 [TIP] 안드로이드 앱이 처음 설치될때 Referrer 정보 받아 오기 파이팅건맨 2016.08.30 7348
위로