Android 混淆 minifyReleaseWithR8 failed NullPointerException

Android 混淆 minifyReleaseWithR8 failed NullPointerException,第1张

概述记录一次混淆编译遇到的问题,和排查的经过。先说下这个错误是由于混淆规则设置不对出现的,就是组件化的module混淆规则设置有冲突或者设置不对,产生了NullPointerException在我的组件化项目进行混淆编译时,gradle混淆编译总是会出现 minifyReleaseWithR8failedNullPointerExce

记录一次混淆编译遇到的问题,和排查的经过。先说下这个错误是由于 混淆规则设置不对出现的,就是组件化的module混淆规则设置有冲突或者设置不对,产生了NullPointerException

在我的组件化项目进行混淆编译时,gradle 混淆编译总是会出现 MinifyReleaseWithR8 Failed NullPointerException。我的gradle设置如下:

buildTypes {        release {            MinifyEnabled true            shrinkResources true            proguardfiles getDefaultProguardfile('proguard-androID-optimize.txt'), 'proguard-rules.pro'            signingConfig signingConfigs.release            androID.applicationVariants.all { variant ->                variant.outputs.all {                    outputfilename = "mall_${variant.buildType.name}_${variant.versionname}.apk"                }            }        }        deBUG {            MinifyEnabled false            proguardfiles getDefaultProguardfile('proguard-androID-optimize.txt'), 'proguard-rules.pro'            signingConfig signingConfigs.release        }    }

然后我在AndroID studio teminal 中键入gradlew build -stacktrace -info 查看具体编译信息,并没有得到有效日志。

从网上和StackOverflow上搜的几个相关的博客并不是和我一样的问题。无奈只好自己找原因。

看到一篇博客,介绍组件化混淆打包,可以将各module的混淆规则放在自己的 proguard-rules.pro文件中,module的build.gardle中设置 consumerProguardfiles属性。

(介绍组件化混淆博客链接:https://blog.csdn.net/yuzhiqiang_1993/article/details/80676170)

buildTypes {        release {            consumerProguardfiles "proguard-rules.pro"        }    }

这里提一下,最好不要将app各module的混淆规则全部写在主aplication 中,一旦混淆编译出现错误,增加判断难度。我就是卡在这的,最后将各module的

混淆规则放在他们自己 proguard-rules.pro文件中,在主application中设置 通用基础的混淆规则,如下:

# 指定代码的压缩级别 0 - 7(指定代码进行迭代优化的次数,在AndroID里面默认是5,这条指令也只有在可以优化时起作用。)-optimizationpasses 5# 混淆时不会产生形形色色的类名(混淆时不使用大小写混合类名)-dontusemixedcaseclassnames# 指定不去忽略非公共的库类(不跳过library中的非public的类)-dontskipnonpubliclibraryclasses# 指定不去忽略包可见的库类的成员-dontskipnonpubliclibraryclassmembers#不进行优化,建议使用此选项,-dontoptimize # 不进行预校验,AndroID不需要,可加快混淆速度。-dontpreverify# 屏蔽警告-ignorewarnings# 指定混淆是采用的算法,后面的参数是一个过滤器# 这个过滤器是谷歌推荐的算法,一般不做更改-optimizations !code/simplification/arithmetic,!fIEld/*,!class/merging/*# 保护代码中的Annotation不被混淆-keepattributes *Annotation*# 避免混淆泛型, 这在JsON实体映射时非常重要-keepattributes Signature# 抛出异常时保留代码行号-keepattributes Sourcefile,lineNumbertable #优化时允许访问并修改有修饰符的类和类的成员,这可以提高优化步骤的结果。# 比如,当内联一个公共的getter方法时,这也可能需要外地公共访问。# 虽然java二进制规范不需要这个,要不然有的虚拟机处理这些代码会有问题。当有优化和使用-repackageclasses时才适用。#指示语:不能用这个指令处理库中的代码,因为有的类和类成员没有设计成public ,而在API中可能变成public-allowaccessmodification#当有优化和使用-repackageclasses时才适用。#-repackageclasses com.test # 混淆时记录日志(打印混淆的详细信息) # 这句话能够使我们的项目混淆后产生映射文件 # 包含有类名->混淆后类名的映射关系-verbose# ---------------------------------------- 默认保留 -------------------------------------------# 保持哪些类不被混淆#继承activity,application,service,broadcastReceiver,contentprovIDer....不进行混淆-keep public class * extends androID.app.Activity-keep public class * extends androID.app.Application-keep public class * extends androID.support.multIDex.MultIDexApplication-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 class androID.support.** {*;}## 保留support下的所有类及其内部类# 保留继承的-keep public class * extends androID.support.v4.**-keep public class * extends androID.support.v7.**-keep public class * extends androID.support.annotation.**#表示不混淆任何包含native方法的类的类名以及native方法名,这个和我们刚才验证的结果是一致-keepclasseswithmembernames class * {    native <methods>;}#这个主要是在layout 中写的onclick方法androID:onclick="onClick",不进行混淆#表示不混淆Activity中参数是VIEw的方法,因为有这样一种用法,在XML中配置androID:onClick=”buttonClick”属性,#当用户点击该按钮时就会调用Activity中的buttonClick(VIEw vIEw)方法,如果这个方法被混淆的话就找不到了-keepclassmembers class * extends androID.app.Activity{    public voID *(androID.vIEw.VIEw);}#表示不混淆枚举中的values()和valueOf()方法,枚举我用的非常少,这个就不评论了-keepclassmembers enum * {    public static **[] values();    public static ** valueOf(java.lang.String);}#表示不混淆任何一个VIEw中的setXxx()和getXxx()方法,#因为属性动画需要有相应的setter和getter的方法实现,混淆了就无法工作了。-keep public class * extends androID.vIEw.VIEw{    *** get*();    voID set*(***);    public <init>(androID.content.Context);    public <init>(androID.content.Context, androID.util.AttributeSet);    public <init>(androID.content.Context, androID.util.AttributeSet, int);}-keepclasseswithmembers class * {    public <init>(androID.content.Context, androID.util.AttributeSet);    public <init>(androID.content.Context, androID.util.AttributeSet, int);}#表示不混淆Parcelable实现类中的CREATOR字段,#毫无疑问,CREATOR字段是绝对不能改变的,包括大小写都不能变,不然整个Parcelable工作机制都会失败。-keep class * implements androID.os.Parcelable {  public static final androID.os.Parcelable$Creator *;}# 这指定了继承Serizalizable的类的如下成员不被移除混淆-keepclassmembers class * implements java.io.Serializable {    static final long serialVersionUID;    private static final java.io.ObjectStreamFIEld[] serialPersistentFIElds;    private voID writeObject(java.io.ObjectOutputStream);    private voID readobject(java.io.ObjectinputStream);    java.lang.Object writeReplace();    java.lang.Object readResolve();}# 保留R下面的资源-keep class **.R$* { *;}#不混淆资源类下static的-keepclassmembers class **.R$* {    public static <fIElds>;}# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆-keepclassmembers class * {    voID *(**On*Event);    voID *(**On*Listener);}# 保留我们自定义控件(继承自VIEw)不被混淆-keep public class * extends androID.vIEw.VIEw{    *** get*();    voID set*(***);    public <init>(androID.content.Context);    public <init>(androID.content.Context, androID.util.AttributeSet);    public <init>(androID.content.Context, androID.util.AttributeSet, int);}#(可选)避免Log打印输出-assumenosIDeeffects class androID.util.Log {   public static *** v(...);   public static *** d(...);   public static *** i(...);   public static *** w(...); }

最后我一个一个module添加到 主application中进行混淆编译,终于排查出是支付组件module中设置的 支付宝支付SDK混淆规则引起的 NullPointerException,我仔细删除了支付宝支付SDK中没什么用的混淆规则后,再次混淆编译就成功了。

总结

以上是内存溢出为你收集整理的Android 混淆 minifyReleaseWithR8 failed NullPointerException全部内容,希望文章能够帮你解决Android 混淆 minifyReleaseWithR8 failed NullPointerException所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1033088.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存