Unity构建AAB时Proguard无法保留Google Play插件类的问题求助
解决Unity构建AAB时Google Play Asset Delivery类被ProGuard/R8剥离的问题
一、修正ProGuard/R8规则
你的现有规则仅保留了public类和public成员,但Google Play Core、Asset Delivery库中大量关键的内部类、接口、非public方法会被Unity的Java桥接调用,很容易被误剥离。替换为以下规则:
# 保留Google Play相关所有类、接口及成员(包括非public、内部类) -keep class com.google.play.core.** { *; } -keep interface com.google.play.core.** { *; } -keep class com.google.play.common.** { *; } -keep interface com.google.play.common.** { *; } -keep class com.google.play.appbundle.** { *; } -keep interface com.google.play.appbundle.** { *; } -keep class com.google.play.assetdelivery.** { *; } -keep interface com.google.play.assetdelivery.** { *; } # 保留必要元数据属性,防止R8/ProGuard剥离交互所需信息 -keepattributes *Annotation*, Signature, InnerClasses, EnclosingMethod -keepattributes SourceFile, LineNumberTable # 禁用代码混淆(若不需要混淆),但保留类保留规则 -dontobfuscate # 若仍存在剥离问题,可临时禁用收缩/优化排查根源 # -dontshrink # -dontoptimize
说明:去掉public修饰符确保全访问级别类都被保留;新增接口的保留规则;补充Signature、InnerClasses等属性,这些是IL2CPP与Java交互必须的元数据。
二、验证Gradle配置
确保mainTemplate.gradle中正确引入自定义ProGuard文件,且顺序正确(自定义文件放在最后,覆盖默认规则):
android { buildTypes { release { minifyEnabled true useProguard true // 明确使用ProGuard,若用R8则改为false并适配对应规则 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-unity.txt', 'Assets/Plugins/Android/你的自定义规则文件名.pro' } } }
若尝试使用R8,可添加-keep class com.google.play.core.** { <methods>; }强制保留所有方法,适配R8的优化逻辑。
三、调整Unity构建配置
- Managed Stripping Level:在
Player Settings > Other Settings > Optimization中,将该项设为Low或Disable。如果设为High,Unity可能会剥离托管层与Java交互的桥接代码,间接导致Java类被误删。 - Strip Engine Code:临时关闭该选项测试,若崩溃消失,说明引擎代码剥离影响了插件依赖,可通过添加
link.xml排除相关托管代码(此步用于排查,你的问题核心在Java端)。 - Minify设置:如果之前用R8正常、更新后异常,可尝试切换回ProGuard(上述Gradle中设置
useProguard true),或者更新Google插件到最新稳定版,大概率修复了R8兼容问题。
四、排查辅助步骤
- 生成混淆映射文件:在ProGuard规则中添加
-printmapping build/outputs/mapping/release/mapping.txt,构建后查看哪些类/方法被剥离,针对性补充-keep规则。 - 检查插件完整性:删除
Assets/Plugins/Android下的Google相关库,重新导入插件,确保所有依赖的aar/jar文件完整。
内容的提问来源于stack exchange,提问作者EAYAJB
相关产品推荐
相关产品推荐

