Android Proguard打包签名APK报错:原因、解决方案及规则请求
关于Proguard打包Android APK报错的原因、解决方案及默认规则
Hey,我来帮你拆解下这个Proguard打包时的报错问题,都是踩过的坑,给你捋清楚~
一、报错原因分析
咱们对应报错里的两个提示逐一拆解:
- 未知类引用(3个):大概率是你的Proguard配置里有拼写错误——比如类名、包名写错了大小写或者少了字符;也可能是你引用了某个已经被移除、或者压根不存在的类;还有一种常见情况是第三方依赖库的类没被Proguard正确识别,比如有些SDK的类在混淆时找不到定义。
- 未保留描述符类(22个):这个是说你已经保留了某个类的成员(比如方法、字段),但这些成员的参数、返回值对应的类没被保留,Proguard混淆时把这些“描述符类”给处理掉了,导致保留的成员找不到对应的类定义,自然就报错了。
二、针对性解决方案
解决“未知类引用”问题
- 先去检查你的
proguard-rules.pro配置文件,把所有-keep、-dontwarn这类规则的类名、包名逐行核对,有没有拼写错误,比如把com.example.MyClass写成com.exmaple.MyClass这种低级错误。 - 如果是第三方库的锅,先确认依赖有没有正确引入,然后去查该库的官方文档,一般都会提供专属的Proguard规则,直接复制到你的配置文件里就行。
- 可以加两个辅助定位的参数:
-printseeds会输出所有被保留的类,-printmapping会生成混淆映射表,帮你精准找到哪个类找不到。
解决“未保留描述符类”问题
- 按照提示显式保留提到的描述符类:比如报错里说某个方法的参数类
com.example.MyData没被保留,就加一条-keep class com.example.MyData { *; };如果不需要保留所有成员,也可以只保留必要的方法/字段。 - 敲黑板!加
-keepattributes Signature这个参数,它会保留代码里的泛型和签名信息,能避免绝大多数描述符类被误删的情况,尤其是你代码里用了泛型的时候,这个参数几乎是必加的。 - 要是你本来就要保留某个类的所有成员,不如直接把整个类都保留下来,比如
-keep class com.example.MyUtils { *; },这样它的成员依赖的类也会被Proguard正确处理。
三、默认的Proguard基础规则
Android SDK自带了一套默认的Proguard规则,一般在proguard-android.txt里,核心内容如下,你可以直接参考或者放到自己的配置文件里:
# 保留Android核心组件类 -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService # 保留Parcelable接口类的CREATOR字段 -keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; } # 保留R类的所有静态字段(避免资源ID被混淆) -keepclassmembers class **.R$* { public static <fields>; } # 保留枚举类的values()和valueOf()方法 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保留注解信息 -keepattributes *Annotation* # 保留泛型签名,解决描述符类问题 -keepattributes Signature # 保留源代码行号,方便崩溃日志定位 -keepattributes SourceFile,LineNumberTable # 忽略Android系统相关类的警告 -dontwarn android.** -dontwarn com.android.**
内容的提问来源于stack exchange,提问作者Tech1st Tutorials
相关产品推荐
相关产品推荐

