Unity2022更新后安卓构建启动时出现ClassNotFoundException求助
Unity 2022升级后Android启动致命异常:Google Play Services类缺失问题
问题描述
将旧游戏Unity版本升级至2022版并更新所有相关包体后,构建可成功完成,但在Android设备启动时触发致命异常,核心报错为Google Play Services相关类无法找到,具体日志如下:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mycompany.mygame, PID: 1612 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/wrappers/Wrappers; at com.google.android.gms.ads.internal.client.zzek.attachInfo(com.google.android.gms:play-services-ads-lite@@22.3.0:1) at com.google.android.gms.ads.MobileAdsInitProvider.attachInfo(com.google.android.gms:play-services-ads-lite@@22.3.0:1) at android.app.ActivityThread.installProvider(ActivityThread.java:7724) at android.app.ActivityThread.installContentProviders(ActivityThread.java:7202) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7070) at android.app.ActivityThread.access$1500(ActivityThread.java:263) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2013) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:236) at android.app.ActivityThread.main(ActivityThread.java:8164) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.common.wrappers.Wrappers" on path: DexPathList[[zip file "/data/app/~~wWMnafso-cl80rzr01yToQ==/com.mycompany.mygame-memj5xJRNWIrb26_QayQTQ==/base.apk"],nativeLibraryDirectories=[/data/app/~~wWMnafso-cl80rzr01yToQ==/com.mycompany.mygame-memj5xJRNWIrb26_QayQTQ==/lib/arm64, /data/app/~~wWMnafso-cl80rzr01yToQ==/com.mycompany.mygame-memj5xJRNWIrb26_QayQTQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 13 more E/AppLovinSdk: [DataCollector] Could not collect Google Advertising ID - this will negatively impact your eCPMs! Please integrate the Google Play Services SDK into your application. More info can be found online at http://developer.android.com/google/play-services/setup.html. If you're sure you've integrated the SDK and are still seeing this message, you may need to add a ProGuard exception: -keep public class com.google.android.gms.** { public protected *; } java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/internal/Preconditions; at com.google.android.gms.ads.identifier.AdvertisingIdClient.<init>(com.google.android.gms:play-services-ads-identifier@@17.1.0:2) at com.google.android.gms.ads.identifier.AdvertisingIdClient.getAdvertisingIdInfo(com.google.android.gms:play-services-ads-identifier@@17.1.0:1) at com.applovin.impl.sdk.utils.d.collectGoogleAdvertisingInfo(SourceFile:173) at com.applovin.impl.sdk.utils.d.c(SourceFile:142) at com.applovin.impl.sdk.utils.d.b(SourceFile:88) at com.applovin.impl.sdk.utils.d.a(SourceFile:52) at com.applovin.impl.sdk.utils.j$1.run(SourceFile:37) at java.lang.Thread.run(Thread.java:923) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.common.internal.Preconditions" on path: DexPathList[[zip file "/data/app/~~wWMnafso-cl80rzr01yToQ==/com.mycompany.mygame-memj5xJRNWIrb26_QayQTQ==/base.apk"],nativeLibraryDirectories=[/data/app/~~wWMnafso-cl80rzr01yToQ==/com.mycompany.mygame-memj5xJRNWIrb26_QayQTQ==/lib/arm64, /data/app/~~wWMnafso-cl80rzr01yToQ==/com.mycompany.mygame-memj5xJRNWIrb26_QayQTQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 8 more E/AppLovinSdk: [DataCollector] Unable to determine if Fire OS limited ad tracking is turned on android.provider.Settings$SettingNotFoundException: limit_ad_tracking at android.provider.Settings$Secure.getIntForUser(Settings.java:5702) at android.provider.Settings$Secure.getInt(Settings.java:5692) at com.applovin.impl.sdk.utils.d.collectFireOSAdvertisingInfo(SourceFile:219) at com.applovin.impl.sdk.utils.d.c(SourceFile:147) at com.applovin.impl.sdk.utils.d.b(SourceFile:88) at com.applovin.impl.sdk.utils.d.a(SourceFile:52) at com.applovin.impl.sdk.utils.j$1.run(SourceFile:37) at java.lang.Thread.run(Thread.java:923)
当前使用的ProGuard配置文件:
-keep class com.google.unity.** { *; } -keep public class com.google.android.gms.ads.**{ public *; } -keep public class com.google.ads.**{ public *; } -keepattributes *Annotation* -dontobfuscate -keep class com.google.android.gms.games.leaderboard.** { *; } -keep class com.google.android.gms.games.snapshot.** { *; } -keep class com.google.android.gms.games.achievement.** { *; } -keep class com.google.android.gms.games.event.** { *; } -keep class com.google.android.gms.games.stats.** { *; } -keep class com.google.android.gms.games.* { *; } -keep class com.google.android.gms.common.api.ResultCallback { *; } -keep class com.google.android.gms.signin.** { *; } -keep class com.google.android.gms.dynamic.** { *; } -keep class com.google.android.gms.dynamite.** { *; } -keep class com.google.android.gms.tasks.** { *; } -keep class com.google.android.gms.security.** { *; } -keep class com.google.android.gms.base.** { *; } -keep class com.google.android.gms.actions.** { *; } -keep class com.google.games.bridge.** { *; } -keep class com.google.android.gms.common.ConnectionResult { *; } -keep class com.google.android.gms.common.GooglePlayServicesUtil { *; } -keep class com.google.android.gms.common.api.** { *; } -keep class com.google.android.gms.common.data.DataBufferUtils { *; } -keep class com.google.android.gms.nearby.** { *; } -keep class com.google.android.gms.common.** { *; } -keep class com.google.android.gms.common.internal.Preconditions { *; } -keep public class com.google.android.gms.** { public protected *; }
解决方案
1. 统一Google Play Services包版本
日志中play-services-ads-lite版本为22.3.0,play-services-ads-identifier为17.1.0,版本差异过大导致依赖类不兼容。需将所有com.google.android.gms相关包升级至同一大版本(例如22.x系列):
- 在Unity Package Manager中找到所有Google Play Services相关包,统一版本号。
- 使用Google Play Services Resolver工具重新解析依赖,确保所有包版本同步。
2. 完善ProGuard规则
添加缺失类的保护规则,避免ProGuard误删:
# 新增缺失类的保护规则 -keep class com.google.android.gms.common.wrappers.** { *; } -keep class com.google.android.gms.common.internal.** { *; }
确保-keep public class com.google.android.gms.** { public protected *; }规则位于配置文件末尾,覆盖所有子包,避免被更具体的规则覆盖。
3. 检查Unity Android构建配置
- 打开Player Settings > Publishing Settings,确认"Custom ProGuard File"已勾选,并指向当前配置文件路径。
- 确保"Minify"选项设置为"ProGuard",保证配置文件被正确应用。
- 删除项目根目录下的
Library文件夹,重新构建项目,让Unity重新下载并同步所有依赖包。
4. 启用MultiDex(针对Android 6.0以下设备)
如果目标设备包含Android 6.0(API 23)以下版本,需在Player Settings > Publishing Settings中开启"Enable MultiDex"选项,避免Dex方法数限制导致必要类未被打包进主Dex文件。
内容的提问来源于stack exchange,提问作者Gag Baghdasaryan
相关产品推荐
相关产品推荐

