최초 작성일 : 25.04.10
수정일 : X.X.X
유니티에서는 문제가 없었지만, 테스트를 위해 안드로이드로 빌드 후 앱을 실행하니 다음과 같은 오류가 발생했다. 'AndroidJavaException: java.lang.ClassNotFoundException: com.google.unity.ads.UnityRewardedAdCallback' 관련하여 구글링을 진행하니 나와 같은 분이 있었지만 해결은 되지 않았다.
참고 1. https://tistory.wonsorang.com/795
에러 "Error Unity AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.ads.initialization.OnInitiali
구글플레이 콘솔에 내부 테스트 버전을 업로드 하고, 해당 버전으로 설치한 앱에서만 광고 초기화 시 에러가 발생. 에러 메시지는 아래와 같다. Error Unity AndroidJavaException: java.lang.ClassNotFoundExceptio
tistory.wonsorang.com
나의 에러의 전문은 다음과 같았다.
AndroidJavaException: java.lang.ClassNotFoundException: com.google.unity.ads.UnityRewardedAdCallback java.lang.ClassNotFoundException: com.google.unity.ads.UnityRewardedAdCallback java.lang.Class.classForName(Native Method) java.lang.Class.forName(Class.java:453) com.unity3d.player.UnityPlayer.nativeRender(Native Method) com.unity3d.player.UnityPlayer.access$300(Unknown Source:0) com.unity3d.player.UnityPlayer$e$1.handleMessage(Unknown Source:95) android.os.Handler.dispatchMessage(Handler.java:102) android.os.Looper.loop(Looper.java:193) com.unity3d.player.UnityPlayer$e.run(Unknown Source:20) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.unity.ads.UnityRewardedAdCallback" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.entereal.emotionteenieping-yhZsSYgFeYgTzDD6m4DbTQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.entereal.emotionteenieping-yhZsSYgFeYgTzDD6m4DbTQ==/lib/arm64, /data/app/com.entereal.emotionteenieping-yhZsSYgFeYgTzDD6m4DbTQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]] dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134) java.lang.ClassLoader.loadClass(ClassLoader.java:379) java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 8 more UnityEngine.AndroidJNISafe.CheckException () (at <00000000000000000000000000000000>:0) UnityEngine.AndroidJNISafe.FindClass (System.String name) (at <00000000000000000000000000000000>:0) UnityEngine.AndroidJavaClass._AndroidJavaClass (System.String className) (at <00000000000000000000000000000000>:0) UnityEngine.AndroidJavaProxy..ctor (System.String javaInterface) (at <00000000000000000000000000000000>:0) GoogleMobileAds.Android.RewardedAdClient..ctor () (at <00000000000000000000000000000000>:0) GoogleMobileAds.GoogleMobileAdsClientFactory.BuildRewardedAdClient () (at <00000000000000000000000000000000>:0) GoogleMobileAds.Api.RewardedAd.Load (System.String adUnitId, GoogleMobileAds.Api.AdRequest request, System.Action2[T1,T2] adLoadCallback) (at <00000000000000000000000000000000>:0) AdManager+<MakeRewardAd>d__11.MoveNext () (at <00000000000000000000000000000000>:0) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <00000000000000000000000000000000>:0)
이제 이를 해결하기 위해 GPT와 둘이서 대화를 나누며 해결했던 방법을 정리하여 작성한다.
1. 먼저 Project Settings - Player - Android - Settings for Android - Publishing Settings - Build의 Custom Proguard File을 체크하여 활성해주었다. 이후 참고 1의 블로그와 같이 D:\[프로젝트 명]\Assets\Plugins에 들어가 proguard-unity.txt에 아래 내용을 작성하였다.
-keep class com.google.unity.** { *; }
-keep public class com.google.android.gms.ads.**{ public *; }
-keep public class com.google.ads.**{ public *; }
-keepattributes *Annotation*
-dontobfuscate
위와 같이 작성하였다. 하지만 뭐가 뭔지 모르고 작성하면 모를 것 같아 GPT에게 부탁하여 해당 내용을 해석해달라고 하였다. 해석하자면 아래 이미지와 같다.

복-붙 하더라도 알고쓰도록 하자. 🤣
2. 이 후 유니티 상에서 Assets > External Dependency Manager > Android Resolver > Force Resolve를 진행하였다. 하지만 Force Resolve를 실행하니 에러가 발생하였는데 에러 전문을 확인해보니 Custom Gradle Properties Template을 켜달라는 오류였다.
1번과 마찬가지로 Project Settings - Player - Android - Settings for Android - Publishing Settings - Build의 Custom Gradle Properties Template을 체크하여 활성해주었다. 이 후 다시 Force Resolve를 통해 종속성 버전 충돌을 처리하였다.
3. 하지만 이렇게 처리했음에도 불구하고 빌드를 진행하고 앱을 실행할 경우 마찬가지로 동일한 오류가 발생하였다. 여기서부터는 라이브러리(SDK)들의 문제 인 것 같아 구글 깃허브의 공식 페이지에서 최신 플러그인을 다시 다운로드 받았다.
https://github.com/googleads/googleads-mobile-unity
GitHub - googleads/googleads-mobile-unity: Official Unity Plugin for the Google Mobile Ads SDK
Official Unity Plugin for the Google Mobile Ads SDK - googleads/googleads-mobile-unity
github.com
나는 10.0.0 버전을 다운로드 받았으며, 혹시 몰라 Import 하기전에 프로젝트 내부에 있는 GoogleMobileAds 폴더를 삭제하고 진행하였다. Improt 하기전에 해당 유니티패키지에서 EDM을 건드리길래 EDM 부분은 추가하지 않고 진행하였으나 결국 빌드를 실패하였다. 따라서 다시 패키지를 열어 EDM 부분을 추가한 후, Force Resolve를 진행하였다.
4. 하지만 위와 같이 처리한 후 빌드를 진행하니 이제는 다른 문제가 발생하였다. 바로 ' Could not determine the dependencies of task ':launcher:lintVitalRelease'.' 문제 였다. 마찬가지로 해결을 위해 GPT와 소통하며 처리하였다.
에러 전문은 다음과 같다.
FAILURE: Build failed with an exception.
* What went wrong:
Could not determine the dependencies of task ':launcher:lintVitalRelease'.
> Could not resolve all artifacts for configuration ':launcher:debugRuntimeClasspath'.
> Failed to transform annotation-experimental-1.4.0.aar (androidx.annotation:annotation-experimental:1.4.0) to match attributes {artifactType=android-manifest, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.libraryelements=aar, org.gradle.status=release, org.gradle.usage=java-runtime}.
> Execution failed for JetifyTransform: C:\Users\USER\.gradle\caches\modules-2\files-2.1\androidx.annotation\annotation-experimental\1.4.0\c7a2038d831d0cfbfb9a440890b287c2e839ecf\annotation-experimental-1.4.0.aar.
> Failed to transform 'C:\Users\USER\.gradle\caches\modules-2\files-2.1\androidx.annotation\annotation-experimental\1.4.0\c7a2038d831d0cfbfb9a440890b287c2e839ecf\annotation-experimental-1.4.0.aar' using Jetifier. Reason: IllegalArgumentException, message: Unsupported class file major version 61. (Run with --stacktrace for more details.)
Suggestions:
- Check out existing issues at https://issuetracker.google.com/issues?q=componentid:460323&s=modified_time:desc, it's possible that this issue has already been filed there.
- If this issue has not been filed, please report it at https://issuetracker.google.com/issues/new?component=460323 (run with --stacktrace and provide a stack trace if possible).
GPT가 다양한 방법을 추천해주었다. JDK 버전을 낮추라던가 Jetifier를 끄라던가. 하지만 이는 문제가 있을 것 같아 다른 방법을 요청하였더니 Assets/Plugins/Android/mainTemplate.gradle의 annotation-experimental의 버전을 낮추라고 하였다. 따라서 mainTemplate.gradle 파일의 dependencies 블록에 있는 항목에 다음과 같이 내용을 추가하였다.
implementation('androidx.annotation:annotation-experimental:1.3.0') {
force = true
}
5. 이래도 안됐다. 확인해보니 ' the minSdk version can not be specified in the AndroidManifest.xml file. you have to remove it.' 에러가 발생하였다. AndroidManifest 안에서 minSdk 버전을 강제로 할당해서 생긴 문제인데 Assets/Plugins/Android/AndroidManifest를 확인해도 android:minSdkVersion을 할당하는 부분이 없었다. 도대체 뭐가 문제인가 싶어서 다시 GPT에게 질문하였다.
알고보니, 일전에 광고 유니티 패키지내부의 Assets/Plugins/Android/GoogleMobileAdsPlugin.androidlib/AndroidManifest 파일에서 버전을 강제로 할당하고 있었다. 이 후 해당 파일에서 <uses-sdk android:minSdkVersion="21" /> 내용을 지우고 저장후 빌드를 진행하니 빌드가 정상적으로 진행되었다.
또한 인 게임에 들어가 로그를 확인해봐도 UnityRewardedAdCallback 에러가 나타나지 않았다.
결론 및 요약
- ✅ GoogleMobileAds 최신 설치
- ✅ Proguard 설정
- ✅ mainTemplate.gradle 수정
- ✅ Jetifier 에러 해결 (annotation-experimental)
- ✅ Manifest에서 <uses-sdk> 제거
위와 같이 설정하니 더 이상 문제가 발생하지 않았다. 분명 나와 같이 문제가 생길 수 있는 사람이 있어 버그를 수정하자마자 블로그 글을 작성했다. 끝. 😎
참고
'개발 > 유니티' 카테고리의 다른 글
유니티 AOS 빌드 시 나타나는 에러 정리 (0) | 2024.03.04 |
---|---|
뒤끝 GPGS V2 관련 SDK 전환 시, Xcode 빌드 시 나타나는 에러 (0) | 2024.03.04 |
프리팹 Original Prefab, Prefab Variant 차이 (0) | 2024.01.10 |
어떤 코딩 스타일이 가장 좋을까? (0) | 2023.06.19 |
이벤트 주도적 프로그래밍 (0) | 2023.06.19 |