开启ProGuard后App签名APK启动崩溃,Debug版本正常求助
看起来你遇到的核心问题是:Debug模式下应用正常运行,但生成签名Release APK后启动就崩溃,而ProGuard日志里明确提示了几个类找不到的警告——这是因为你只给ProGuard加了-dontwarn规则跳过警告,但没有保留必要的类,也没处理依赖缺失的问题,导致混淆过程中这些关键类被移除或者无法被正确引用。
下面针对每个警告给出具体的修复方案:
1. Picasso & OkHttp 类找不到的问题
日志里的com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient,说明Picasso依赖的OkHttp类在混淆时被处理掉了,或者你的依赖版本不匹配。
修复步骤:
- 先确认依赖配置:如果你的项目使用的是Picasso 2.5.2及以上版本,它默认依赖OkHttp 2.x;如果用的是OkHttp 3.x,需要额外引入
picasso-okhttp3-downloader依赖(在build.gradle里添加)。 - 更新ProGuard规则,替换原来的Picasso规则为:
# Picasso 相关保留规则 -keep class com.squareup.picasso.** { *; } -keepclassmembers class com.squareup.picasso.** { *; } # OkHttp 相关保留规则(根据你用的版本调整) # 如果你用的是OkHttp 2.x -keep class com.squareup.okhttp.** { *; } -keep interface com.squareup.okhttp.** { *; } # 如果你用的是OkHttp 3.x -keep class okhttp3.** { *; } -keep interface okhttp3.** { *; }
2. DataBinding 类找不到的问题
日志里的android.databinding.DataBindingUtil: can't find referenced class android.databinding.DataBindingComponent,说明DataBinding的混淆规则不完整,只加-dontwarn不足以保留DataBinding生成的绑定类和核心组件。
修复步骤:
替换原来的DataBinding规则为完整的保留规则:
# DataBinding 核心类保留 -keep class android.databinding.** { *; } -keep class * extends android.databinding.DataBindingComponent { *; } # 保留DataBinding相关注解和方法 -keepclasseswithmembers class * { @android.databinding.BindingMethods <methods>; } -keepclasseswithmembers class * { @android.databinding.InverseBindingMethods <methods>; } -keepclasseswithmembers class * { @android.databinding.InverseBindingAdapter <methods>; } # 保留自动生成的Binding类 -keep class **.*Binding { *; }
3. Apache HttpComponents 类找不到的问题
日志里的org.apache.http.entity.mime.content.StringBody: can't find referenced class org.apache.http.util.Args和org.apache.http.entity.ContentType,是因为Android 6.0之后系统默认移除了Apache HttpClient库,同时你的ProGuard规则也没保留相关类。
修复步骤:
- 首先在
app/build.gradle的android块里添加对Apache HttpClient的引用:android { // 其他配置... useLibrary 'org.apache.http.legacy' } - 然后更新ProGuard规则,保留Apache相关类:
# Apache HttpComponents 保留规则 -keep class org.apache.http.** { *; } -keep interface org.apache.http.** { *; }
最后要做的检查
- 执行
Build -> Clean Project清理项目,然后再重新生成签名APK - 如果还是有崩溃,可以尝试在ProGuard规则里添加以下内容,保留类的注解和签名信息,避免混淆破坏类结构:
-keepattributes *Annotation* -keepattributes Signature
内容的提问来源于stack exchange,提问作者The Bat

