Android 빌드 오류: 패키지 이름 수정 - Flutter

Shawn Kang·2022년 10월 16일
1

Flutter

목록 보기
4/4
post-thumbnail
이 글은 다크 모드에 최적화되어 있다. 강조 색이 노란색 계열이라 라이트 모드로 보면 눈뽕당할 확률이 크다. 참고 바란다.

개요

귀찮아서 맨날 Windows에서만 디버깅을 돌리다가, 어제 일부 기능이 모바일에서 실제로 동작하는지 확인해보기 위해 내 휴대폰에서 디버깅을 시도했다. 그리고 날 반갑게 맞이한 건 빌드 오류. 분명 한 달 전에는 잘 돌아갔는데 그 사이에 무슨 일이 있었는지 갑자기 앱이 실행되지 않았다.

대충 구글링을 해 본 결과, 이런 상황이 발생한 이유는 얼마 전 애플리케이션 패키지 이름을 수정한 것과 관련이 있는 듯했다. 나는 Android 앱을 개발해본 적이 없어서, 어떤 파일에서 어느 부분을 수정해야 하는지를 몰랐다. 그래서 관련 내용을 찾아 몇 가지 요소를 수정했고 오류를 해결할 수 있었다.


오류에 대해

로그 (내용)

나의 경우는 아래와 같은 오류가 발생했다:

E/AndroidRuntime(29600): FATAL EXCEPTION: main
E/AndroidRuntime(29600): Process: com.charity.soonaapp, PID: 29600
E/AndroidRuntime(29600): java.lang.RuntimeException: Unable to instantiate application $com.package.name package com.package.name:
						 java.lang.ClassNotFoundException: Didn't find class "$com.package.name" {너무 길어 생략}
E/AndroidRuntime(29600): 	at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1573)
E/AndroidRuntime(29600): 	at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1502)
E/AndroidRuntime(29600): 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7537)
E/AndroidRuntime(29600): 	at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
E/AndroidRuntime(29600): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2397)
E/AndroidRuntime(29600): 	at android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime(29600): 	at android.os.Looper.loopOnce(Looper.java:226)
E/AndroidRuntime(29600): 	at android.os.Looper.loop(Looper.java:313)
E/AndroidRuntime(29600): 	at android.app.ActivityThread.main(ActivityThread.java:8741)
E/AndroidRuntime(29600): 	at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(29600): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
E/AndroidRuntime(29600): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
E/AndroidRuntime(29600): Caused by: java.lang.ClassNotFoundException: {위와 같은 내용이라 생략}
E/AndroidRuntime(29600): 	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
E/AndroidRuntime(29600): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
E/AndroidRuntime(29600): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
E/AndroidRuntime(29600): 	at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:76)
E/AndroidRuntime(29600): 	at androidx.core.app.CoreComponentFactory.instantiateApplication(CoreComponentFactory.java:52)
E/AndroidRuntime(29600): 	at android.app.Instrumentation.newApplication(Instrumentation.java:1232)
E/AndroidRuntime(29600): 	at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1565)
E/AndroidRuntime(29600): 	... 11 more

중요한 문구를 찾아보자면 java.lang.RuntimeException: Unable to instantiate application com.package.name이 되겠다.

원인

나는 오류가 발생한 원인을 AndroidManifest.xml 파일로 추정하고 있다. 수정 전 파일 내용을 보자:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.package.name">
   <application
        android:label="내가 만든 앱"
        android:name="$com.package.name"
        android:icon="@mipmap/ic_launcher">
     	<!--(이하 생략)-->

android:name 항목을 보면 $com.package.name로 설정되어 있다. 이걸 건들면 안 됐었다. 그게 원인이 아닐까 추측한다.

원래 해당 항목의 기본값은 ${applicationName}인데, 난 이걸 패키지 이름으로 착각하고 $com.package.name으로 그냥 수정해버렸다. 심지어 특정한 변수를 지정하는 의미로 추정되는 $ 기호조차 빼지 않고 그냥 패키지 이름을 그대로 박아버렸다. 안타까운 일이다. 핑계를 대자면, 패키지 이름을 어떻게 바꿔야 하는지 알려주는 사람이 없었다. 그래서 일이 터지고 난 뒤에야 정확한 수정 절차를 알아봤고, 오류를 고칠 수 있었다.

결론적으로, 어떤 요소를 어떻게 수정해야 하는지를 이제부터 간단하게 설명해보겠다.


해결 방법: 패키지 이름을 잘 수정하는 법

패키지 이름을 바꾸기 위해 수정해야 할 요소로는 아래의 4가지가 있다:

  • {프로젝트 디렉토리}/android/app/build.gradle 파일 내용 수정하기
  • {프로젝트 디렉토리}/android/app/src/main/AndroidManifest.xml 파일 내용 수정하기
  • {프로젝트 디렉토리}/android/app/src/main/kotlin/ 이하 폴더의 디렉토리 이름 수정하기
  • {프로젝트 디렉토리}/android/app/src/main/kotlin/ 이하 폴더에 존재하는 MainActivity.kt 파일 내용 수정하기

차례차례 확인해보자.

build.gradle 수정

이 파일의 주소는 다음과 같다: {프로젝트 디렉토리}/android/app/build.gradle
파일을 열고 applicationId 항목을 아래와 같이 수정하도록 하자:

android {
	defalutConfig {
    	applicationId "{내가 원하는 패키지 이름}"
        
        // 이외 불필요한 내용 생략 
    }
}

AndroidManifest.xml 수정

이 파일의 주소는 다음과 같다: {프로젝트 디렉토리}/android/app/src/main/AndroidManifest.xml
파일을 열고 package 항목을 아래와 같이 수정하도록 하자:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="{내가 원하는 패키지 이름}">
  
    <!--(이하 불필요한 내용 생략)-->
</manifest>
     	

프로젝트 디렉토리 이름 수정

먼저 {프로젝트 디렉토리}/android/app/src/main/kotlin/ 경로로 이동하자. 만약 여러분이 프로젝트를 생성할 때 별도의 다른 옵션을 지정하지 않았다면, 다음과 같은 디렉토리 구조가 존재할 것이다:

{프로젝트 디렉토리}/android/app/src/main/kotlin/com/example/{프로젝트 이름}

색상을 칠해둔 부분이 수정해야 할 부분이다. 여러분이 원하는 패키지 이름이 "com.myapp.package"이라고 가정해보자. 그렇다면 디렉토리 구조는 아래와 같아야 한다:

{프로젝트 디렉토리}/android/app/src/main/kotlin/com/myapp/package

그리고 중요한 사항으로, 경로의 가장 끝에 위치하는 폴더에는 바로 다음에 수정할 MainActivity.kt 파일이 존재해야 한다. 위 예시 기준으로는 package 폴더가 되겠다. 아무튼 이렇게 수정하면 된다.

MainActivity.kt 수정

경우에 따라 파일 이름이 MainActivity.java인 경우도 있다고는 하는데, 아마 구버전일 확률이 높을 것 같다.
어쨌든 이 파일의 주소는 다음과 같다: {프로젝트 디렉토리}/android/app/src/main/kotlin/com/myapp/package
파일을 열고 package 항목을 아래와 같이 수정하도록 하자:

package {내가 원하는 패키지 이름}

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {
}

뭐, 이런 과정을 거쳐 오류를 수정하고 패키지 이름을 원활하게 바꿀 수 있었다.

그리고 내가 겪었던 몇 가지 빌드 오류가 더 있다. build.gradle 파일에서 설정해야 하는 Android 컴파일 SDK 버전이나 최소 SDK 버전과 같은 것들인데, 보통 이런 오류는 외부 패키지로 인해 발생하는 경우가 많은 것으로 생각된다. 무엇보다도 이 오류 내용에 대해서는 Flutter의 디버그 콘솔에서 아주 친절하게 잘 알려주므로 여기에서는 언급하지 않겠다. (대충 귀찮다는 말)

그으럼 20000

profile
i meant to be

0개의 댓글