Android 混淆配置及Bug处理

//**为了防止apk反编译后源码泄漏,我们需要对发布的应用进行混淆打包。**

好东西要分享:

使用proguard混淆android代码
Android混淆打包那些事儿

本项目的proguard-rules.pro文件

#==================================【基本配置】==================================

# 代码混淆压缩比,在0~7之间,默认为5,一般不下需要修改
-optimizationpasses 5 
# 混淆时不使用大小写混合,混淆后的类名为小写
# windows下的同学还是加入这个选项吧(windows大小写不敏感)
-dontusemixedcaseclassnames 
# 指定不去忽略非公共的库的类
# 默认跳过,有些情况下编写的代码与类库中的类在同一个包下,并且持有包中内容的引用,此时就需要加入此条声明
-dontskipnonpubliclibraryclasses 
# 指定不去忽略非公共的库的类的成员
-dontskipnonpubliclibraryclassmembers 
# 不做预检验,preverify是proguard的四个步骤之一
# Android不需要preverify,去掉这一步可以加快混淆速度
-dontpreverify 
# 有了verbose这句话,混淆后就会生成映射文件
-verbose #apk 包内所有 class 的内部结构
-dump class_files.txt #未混淆的类和成员
-printseeds seeds.txt #列出从 apk 中删除的代码
-printusage unused.txt #混淆前后的映射
-printmapping mapping.txt 
# 指定混淆时采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不改变
-optimizations !code/simplification/artithmetic,!field/*,!class/merging/* 
# 保护代码中的Annotation不被混淆
# 这在JSON实体映射时非常重要,比如fastJson
-keepattributes *Annotation* 
# 避免混淆泛型
# 这在JSON实体映射时非常重要,比如fastJson
-keepattributes Signature 
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable 
#忽略警告
-ignorewarning 
#==================================【项目配置】==================================

# 保留所有的本地native方法不被混淆
-keepclasseswithmembernames class * {     native <methods>;
}

# 保留了继承自Activity、Application这些类的子类
-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.preference.Preference -keep public class * extends android.view.View -keep public class * extends android.database.sqlite.SQLiteOpenHelper{*;} 
# 如果有引用android-support-v4.jar包,可以添加下面这行
-keep public class com.null.test.ui.fragment.** {*;} 
#如果引用了v4或者v7包
-dontwarn android.support.** 
# 保留Activity中的方法参数是view的方法,
# 从而我们在layout里面编写onClick就不会影响
-keepclassmembers class * extends android.app.Activity {     public void * (android.view.View);
}

# 枚举类不能被混淆
-keepclassmembers enum * {     public static **[] values();
    public static ** valueOf(java.lang.String);
}

# 保留自定义控件(继承自View)不能被混淆
-keep public class * extends android.view.View {     public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(***);
    *** get* ();
}

# 保留Parcelable序列化的类不能被混淆
-keep class * implements android.os.Parcelable{     public static final android.os.Parcelable$Creator *;
}

# 保留Serializable 序列化的类不被混淆
-keepclassmembers class * implements java.io.Serializable {    static final long serialVersionUID;
   private static final java.io.ObjectStreamField[] serialPersistentFields;
   !static !transient <fields>;
   private void writeObject(java.io.ObjectOutputStream);
   private void readObject(java.io.ObjectInputStream);
   java.lang.Object writeReplace();
   java.lang.Object readResolve();
}

# 对R文件下的所有类及其方法,都不能被混淆
-keepclassmembers class **.R$* {     *;
}

# 对于带有回调函数onXXEvent的,不能混淆
-keepclassmembers class * {     void *(**On*Event);
}

#==================================【三方配置】==================================

#高德地图
-keep class com.amap.api.location.**{*;} -keep class com.amap.api.fence.**{*;} -keep class com.autonavi.aps.amapapi.model.**{*;} 
#arcgis地图
-dontwarn com.esri.** -keep class com.esri.** {*;} -dontwarn org.codehaus.jackson.** -keep class org.codehaus.jackson.** {*;} -dontwarn org.codehaus.jackson.** -keep class org.codehaus.jackson.** {*;} -dontwarn jcifs.** -keep class jcifs.** {*;} 
#butterknife
-keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * {    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {  @butterknife.* <methods>;
}

常见Bug:

No1:

一堆警告,编译失败,MD。。

Android 混淆配置及Bug处理_第1张图片

解决方法:

添加以下代码

#忽略警告
-ignorewarning

No2:

终于编译成功,点击直接闪退,MD。。

这里写图片描述

解决方法:

Android 混淆配置及Bug处理_第2张图片

看下日志,打开项目目录\app\build\outputs\mapping\release文件,打开映射文件,找到错因,原来又是少声明SQLiteOpenHelper类,然后进行更改

-keep public class * extends android.database.sqlite.SQLiteOpenHelper{*;}

No3:

成功编译并且进去应用后,当点到某个页面时突然闪退,MD。。

Android 混淆配置及Bug处理_第3张图片

解决方法:

Android 混淆配置及Bug处理_第4张图片

查看页面代码,因为常用的类已经声明防止混淆过了,所以看看这个页面有没有用到一些三方包,果然又少配置了,继续添加声明防止混淆

-dontwarn org.codehaus.jackson.** -keep class org.codehaus.jackson.** {*;}

总结:

混淆出错80%是因为你混淆了不该混淆的类

你可能感兴趣的:(android,混淆)