본문 바로가기
Works/Unity 3D

[Unity3D] Admob Proguard Issue

by Vader87 2019. 8. 19.
반응형

Unity 2018.4.6f1 버전에서 Admob 라이브러리 추가시 발생한 이슈와 해결 방법을 기록합니다.

 

이슈가 발생한 상황은 다음과 같습니다.

1. Admob 라이브러리를 추가하고 Debug 빌드에서 정상 구동을 확인했습니다.

2. Release를 하고 났더니 광고가 나오지 않고 Logcat을 확인해 보니 다음과 같은 에러가 발생중 입니다.

AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.ads.initialization.OnInitializationCompleteListener 
java.lang.ClassNotFoundException: com.google.android.gms.ads.initialization.OnInitializationCompleteListener 
at java.lang.Class.classForName(Native Method) 
at java.lang.Class.forName(Class.java:453) 
at java.lang.Class.forName(Class.java:378) 
at com.unity3d.player.UnityPlayer.nativeRender(Native Method) 
at com.unity3d.player.UnityPlayer.c(Unknown Source:0) 
at com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source:62) 
at android.os.MessageQueue.next(MessageQueue.java:395) 
at android.os.Looper.loop(Looper.java:181) 
at com.unity3d.player.UnityPlayer$e.run(Unknown Source:32) 
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.ads.initialization.OnInitializationCompleteListener" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.nocount.sudoku-aWGmSXMR6cgkqe3OHm7x5w==/base.apk", zi

구글링을 해보니 Proguard 라는 키워드가 눈에 보입니다.

Project Settings > Player > Publishing Settings > Minify 에 Release 의 Proguard 설정이 걸립니다.

설정의 Minify 에서 Release 옵션을 Proguard 에서 None 으로 바꿔봅니다.

광고가 나옵니다. 아무래도 Proguard 에서 난독화 후 외부 라이브러리를 이용할때 문제가 되는 것 같습니다..

내 코드는 소중하니까 Proguard 를 끄지 않고 Admob 만 정상 작동시킬 수 있는 방법을 시도해 봅니다.

Unity 에서 Proguard 사용자 설정을 다음과 같은 방법으로 추가할 수 있습니다.

Project Settings > Player Settings > Publishing Settings > Build > User Proguard File 체크

해당 경로의 파일 (Assets/Plugins/Android/proguard-user.txt) 에 원하는 설정 추가

Proguard 사용자 설정에 관한 구글 공식 문서는 아래 링크에서 확인 가능합니다.

https://developer.android.com/studio/build/shrink-code?hl=ko

 

코드 및 리소스 축소  |  Android Developers

Make your APK file smaller and more secure by shrinking your code and resources.

developer.android.com

유지할 코드는 -keep 구문을 사용해서 사용자 설정 파일에 추가하면 된다고 설명해 주네요.

Proguard 사용자 설정 파일에 문제가 되는 class를 예외 처리 해 봅시다.

-keep public class com.google.android.gms.ads.initialization.OnInitializationCompleteListener

에러의 내용이 바뀌었습니다. 하나씩 바꾸면 끝이 안날꺼 같습니다. 아무래도 com.google.android.gms.ads 쪽의 모든 것을 예외 처리해 주어야 할 것 같습니다.

AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.ads.MobileAds
java.lang.ClassNotFoundException: com.google.android.gms.ads.MobileAds
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:453)
at java.lang.Class.forName(Class.java:378)
at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
at com.unity3d.player.UnityPlayer.c(Unknown Source:0)
at com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source:62)
at android.os.MessageQueue.next(MessageQueue.java:395)
at android.os.Looper.loop(Looper.java:181)
at com.unity3d.player.UnityPlayer$e.run(Unknown Source:32)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.ads.MobileAds" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.nocount.sudoku-FmjPicG7rw_3qhLsPo6u6g==/base.apk", zip file "/data/app/com.nocount.sudoku-FmjPicG7rw_3qhLsPo6u6g==/split_config.arm64_v8a.apk"],nativeLibraryDirectorie

다시 Proguard 사용사 설정을 바꿔 봅니다.

-keep public class com.google.android.gms.ads.**

다른 에러가 발생합니다...

AndroidJavaException: java.lang.NoSuchMethodError: no static method with name='initialize' signature='(Lcom.unity3d.player.UnityPlayerActivity;Ljava/lang/String;)V' in class Ljava.lang.Object;
java.lang.NoSuchMethodError: no static method with name='initialize' signature='(Lcom.unity3d.player.UnityPlayerActivity;Ljava/lang/String;)V' in class Ljava.lang.Object;
at com.unity3d.player.ReflectionHelper.getMethodID(Unknown Source:167)
at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
at com.unity3d.player.UnityPlayer.c(Unknown Source:0)
at com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source:62)
at android.os.MessageQueue.next(MessageQueue.java:395)
at android.os.Looper.loop(Looper.java:181)
at com.unity3d.player.UnityPlayer$e.run(Unknown Source:32)
at UnityEngine.AndroidJNISafe.CheckException () [0x00000] in <00000000000000000000000000000000>:0
08-at UnityEngine.AndroidJNISafe.CallStaticObjectMethod (System.IntPtr clazz, System.IntPtr methodID, UnityEngine.jvalue[] args) [0x00000] in

끝이 없네요.. 성공한 사람의 케이스를 찾아봅시다.

How to implement AdMob in Unity? A bit more detailed guide.

 

How to implement AdMob in Unity? A bit more detailed guide.

Some tips to avoid C# problems and how to solve the ClassNotFoundException unity.ads.UnityAdListener on Android.

medium.com

다음과 같이 추가하면 된다고 합니다.

-keep class com.google.unity.** {
   *;
}
-keep public class com.google.android.gms.ads.**{
   public *;
}
-keep public class com.google.ads.**{
   public *;
}
-keepattributes *Annotation*
-dontobfuscate

성공 이네요.

 Proguard 옵션을 활성화 시키고 라이브러리 사용시 주의 해야 할 것 같습니다.

 

https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/main.html

 

ProGuard

 

stuff.mit.edu

Proguard 에 대한 자세한 설명입니다. 궁금하면 참고.

반응형

댓글