关于android混淆打包那些坑

项目上线,准备打包发布的时候,点开Build开始签名的时候,蛋疼的一个窗口弹出来了

这里写图片描述

然而我又不想用第三方混淆(加固)工具,咋办呢?硬着头皮开始上吧!

由于项目使用的是MVP(Retrofit+RxJava)架构,平时debug的时候混淆文件基本不碰,以下情况仅供借鉴。。

  • 基本配置
################################COMM##########################################
-dontshrink
-dontpreverify
-dontoptimize
-optimizations optimization_filter
-dontusemixedcaseclassnames

-flattenpackagehierarchy
-allowaccessmodification
-printmapping map.txt

-optimizationpasses 7
-verbose
-keepattributes Exceptions,InnerClasses
-dontwarn InnerClasses
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-ignorewarnings
-keepattributes Signature

-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 java.lang.Throwable {*;}
-keep public class * extends java.lang.Exception {*;}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

# adding this in to preserve line numbers so that the stack traces
# can be remapped
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

-keepattributes *Annotation*

-keep public class **.R$*{
   public static final int *;
}

###############################框架搭建完毕###################

OK,继续签名。

这里写图片描述

喜闻乐见。点开proguard-rules.pro文件,加上

#-keepattributes EnclosingMethod

没效果?not work?OK,升级你的android Build Tool到最新版吧,如果还有问题,那,我就没办法了,好好检查下吧

  • OkHttp3
-dontwarn okhttp3.logging.**
-keep class okhttp3.internal.**{*;}
-dontwarn okio.**
  • Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
  • RxJava
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
    long producerIndex;
    long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
  • Gson
-keep class com.google.gson.stream.** { *; }
-keep class com.xx.xx.model.bean.**{*;}//这里需要保留自己定义的实体类不被混淆

OK,到这里如果开启了屏蔽warning基本上可以打包成功了,但。。。

如果你打包成功就直接上架了,那我只能说,你太年轻了!

装上你刚打的包,跑起来。进去就闪了?

好吧,继续爬坑。。。。

打开app build.gradle文件加上

debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

debug运行起来吧,查看报错log再进行调整

以我的项目为例吧,点击登录的时候,在返回数据的时候NullPoint异常

这里就是Gson混淆没配置好,接受到的javabean为null

  • Glide
    由于我项目中图片加载库使用的Glide,在没有配置混淆的时候会抛
java.lang.RuntimeException: Unable to resume activity {dt.cz.oa/dt.cz.oa.ui.MainActivity}: java.lang.IllegalArgumentException: Unable to find GlideModule implementation

OK,找到原因就好,点开proguard-rules.pro,添加

#Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

到这里基本上就完全OK了,当然,因人而异,我也可能是没有碰到比较麻烦的

  • 第三方SDK混淆

像现在用的比较多的第三方SDK,umeng、IM、sharedsdk、等等,去他们的官网

文档查阅吧,上面有混淆的代码配置

  • 写在最后

博客的初衷:记下自己的心得,免得忘得太快,如果恰好帮到你了,那我只能说,

小伙子,你的运气不错,如果有什么写的不对的地方,欢迎指正和交流!~~

如果你觉得我的这篇文章帮了你的大忙,偏要慷慨解囊施舍一个亿什么的,我也是不会介意的

这里写图片描述



版权声明:本文为u011754975原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。