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
)
해결책
해결한 방법은 다음과 같다.
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에 대한 명령어 옵션 확인 가능
* 좀 더 근원적인 설정 오류나, 캐시 문제 등을 잡아주긴 해야할 것 같은데, 찾아본 방법으로 모두 진행이 되지 않아서 위와 같이 했다.