项目上线,准备打包发布的时候,点开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 implementationOK,找到原因就好,点开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版权协议,转载请附上原文出处链接和本声明。