귀찮아서 맨날 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
파일을 열고 applicationId
항목을 아래와 같이 수정하도록 하자:
android {
defalutConfig {
applicationId "{내가 원하는 패키지 이름}"
// 이외 불필요한 내용 생략
}
}
이 파일의 주소는 다음과 같다: {프로젝트 디렉토리}/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.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