본문 바로가기

React Native

React Native: Android - Activity class does not exist

728x90
반응형

Starting: Intent { cmp=com.nhn.android.oauth/.MainActivity }
Error type 3
Error: Activity class {com.nhn.android.oauth/com.nhn.android.oauth.MainActivity} does not exist.

네이버 로그인 기능을 넣기 위해,

https://github.com/naver/naveridlogin-sdk-android

에서 클론을 받고, Nid-OAuth 폴더를 react native 프로젝트 내의 android/app 내에 넣어주고

npm run android 를 했을 때 위와 같은 에러가 발생했다.

 

위 에러는

빌드는 모두 완료되고, 앱을 실행시킬 때 발생하는 오류이다.

즉, 빌드는 완료가 된 상태이며

앱을 실행하기 위해 AndroidManifest.xml에 정의된 MainActivity를 실행 시키는 단계에서 발생하는 오류이기 때문에,

위 오류가 난 상태에서 앱을 직접 클릭해서 수동으로 실행하면 동작이 잘된다.

즉, cli로 앱을 실행시키는 과정에서 문제가 생긴 것이다.

 

정상적으로 실행됐을 때는 다음과 같은 로그가 나와야 한다.

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.gnuboard_react_native/.MainActivity }

 

com.gnuboard_react_native는 내 react native 프로젝트 명이고, 그 안에서 .MainActivity를 실행하는 것이다.

.MainActivity는 전체 react native 프로젝트에서 경로를 보면 다음과 같다.

project/android/app/src/main/java/com/gnuboard_react_native/MainActivity.java (또는 .kt)

 

근데 문제는 com.nhn.android.oauth를 프로젝트로 인식하고 있다는 점이다.

 

설정을 고쳐주면 된다고 하는데... 체크한 설정은 다음과 같다.

 

// android/build.gradle

defaultConfig{
    applicationId "com.gnuboard_react_native"
    ...

 

// android/app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.gnuboard_react_native"> // <-- 이부분

    <uses-permission android:name="android.permission.INTERNET" />

    <application
      android:name=".MainApplication"
      ...
      android:theme="@style/AppTheme">
      <activity
        android:name=".MainActivity"		// <-- 이부분
        ...
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />            // <-- 이부분
            <category android:name="android.intent.category.LAUNCHER" />    // <-- 이부분
        </intent-filter>
      </activity>
    </application>
</manifest>

 

위 설정도 확인했고,

앱이 제대로 삭제되지 않은 상태에서 남아있는 캐시 문제인 경우가 많다고 해서 캐시 파일 삭제 및, 에뮬레이터에서 앱까지 삭제하고 해도 계속 같은 증세가 발생했다.

(참고:

https://www.repeato.app/error-type-3-activity-class-does-not-exist-how-to-fix-it/

https://gamjatwigim.tistory.com/20

https://yeolco.tistory.com/88

)

 

해결책

해결한 방법은 다음과 같다.

npm run android 실행시 프로젝트명, 실행할 Activity를 cli에서 지정해서 실행하는 것이다.

(npm run android에 옵션을 아래와 같이 붙이니 안되고, npx react-native run-android로 실행해야함)

npx react-native run-android --appId com.gnuboard_react_native --main-activity com.gnuboard_react_native.MainActivity

 

이렇게 해결...

위 명령어가 너무 길기 때문에, 설정파일을 만들어서 실행할 수 있다.

 

// react-native.config.js

module.exports = {
  commands: [
    {
      name: 'run-android-project',
      description: 'Run the Android project with default --appId and --main-activity options',
      func: async () => {
        const execSync = require('child_process').execSync;
        execSync(
          'npx react-native run-android --appId com.gnuboard_react_native --main-activity com.gnuboard_react_native.MainActivity',
          { stdio: 'inherit' }
        );
      },
    },
  ],
}

 

위 커스텀 명령어는 아래와 같이 실행

npx react-native run-android-project

 

 

* 위와 같은 실행명령어의 옵션을 볼 수 있는 방법이 있다.

 

node_modules/@react-native-community/cli-platform-android/build/commands/runAndroid/index.js

위 경로에서 name: 'run-android' 항목을 보면

옵션이 다양하게 나와 있다.

위 이동 경로 중에서 cli-platform-ios를 보면 ios에 대한 명령어 옵션 확인 가능

 

 

* 좀 더 근원적인 설정 오류나, 캐시 문제 등을 잡아주긴 해야할 것 같은데, 찾아본 방법으로 모두 진행이 되지 않아서 위와 같이 했다.

참고: https://github.com/facebook/react-native/issues/17423

728x90
반응형