Android应用发布前加混淆及注意事项

代码混淆

代码混淆的是Java代码,无法混淆Native代码,资源文件drawable、xml等。

1、作用:代码压缩、代码混淆以及资源压缩等的优化过程;

      代码压缩:混淆流程将主项目以及依赖库中未被使用的类、类成员、方法、属性移除,这有助于规避64K方法数的瓶颈

混淆: 将类名、属性名、方法名混淆为难以读懂的字母,比如a,b,c

资源压缩:移除项目及依赖的库中未被使用的资源。

2、混淆规则proguard-android.txt混淆默认规则proguard-rules.pro中自定义混淆规则;

    注意:JavaBean类即实体类不被混淆、自定义控件那么要保证它们不参与混淆、枚举要保证枚举不被混淆、对第三方库中的类不进行混淆。

3 moudle.gradle中写混淆配置

buildTypes {
    release {
        minifyEnabled true//打开混淆
        shrinkResources true//打开资源压缩
        zipAlignEnabled true//减少应用在运行时的内存消耗。
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

4、混淆输出文件 module/build/outputs/mapping文件夹下:

      dump.txt 描述apk文件中所有类文件间的内部结构;

      mapping.txt 原始的类,方法,和字段名与混淆后代码之间的映射;

      seeds.txt 未被混淆的类和成员;

      usage.txt apk中删除的代码 。

5、proguard-rules.pro中自定义混淆规则示例:

#------基本指令区------
# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5
# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类,是否混淆第三方jar
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers
# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度
-dontpreverify
# 混淆时是否记录日志,包含有类名->混淆后类名的映射关系
-verbose
#混淆映射文件输出
-printmapping proguardMapping.txt
#保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 抛出异常时保留源文件名及行号
-keepattributes SourceFile,LineNumberTable
# 指定混淆是采用的算法,后面的参数是一个过滤器,这个过滤器是谷歌推荐的算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*

# ------默认保留区------
#保留我们使用的四大组件,自定义的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.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

# 保留support下的所有类及其内部类
-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.**
#Fragment不需要在AndroidManifest.xml中注册,需要额外保护下
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment

#如果引用了v4或者v7包,可以忽略警告,因为用不到android.support
-dontwarn android.support.**

# 保持 native 方法不被混淆
-keepclasseswithmembernames class * {
    native ;
}

# 保留在Activity中的方法参数是view的方法,这样以来我们在layout中写的onClick就不会被影响
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

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

# 保持自定义控件类不被混淆
-keepclasseswithmembers class * {
    public (android.content.Context);
    public (android.content.Context, android.util.AttributeSet);
    public (android.content.Context, android.util.AttributeSet, int);
}

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

#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable

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

#保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

#保持实体类不被混淆
-keep class com.mys.example.common.entity.**{*;}

#过滤R文件的混淆:
-keep class **.R$* {
 *;
}

#------第三方框架避免混淆------
# butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector{ *; }#7.0以下
-keep class **$$ViewBinder { *; }#7.0以上
-keepclasseswithmembernames class * {
    @butterknife.* ;
}
-keepclasseswithmembernames class * {
    @butterknife.* ;
}
#OkHttp3
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**
-keep class okio.**{*;}
#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
   **[] $VALUES;
   public *;
 }
#AndPermission
-dontwarn com.yanzhenjie.permission.**
-keep class com.yanzhenjie.permission.** { *; }
-keepclassmembers class ** {
    @com.yanzhenjie.permission.PermissionYes ;
}
-keepclassmembers class ** {
    @com.yanzhenjie.permission.PermissionNo ;
}
#leakcanary
-dontwarn com.squareup.leakcanary.**
-keep class com.squareup.leakcanary.** { *; }
#blockcanary
-dontwarn com.github.moduth.**
-keep class com.github.moduth.** { *; }
#Bugly日志Sdk
-dontwarn com.tencent.bugly.**
-keep class com.tencent.bugly.**{*;}
#smartrefresh
-dontwarn com.scwang.smartrefresh.**
-keep class com.scwang.smartrefresh.** { *; }
#WheelPicker
-dontwarn cn.qqtheme.framework.**
-keep class cn.qqtheme.framework.** { *; }
#BaseRecyclerViewAdapterHelper
-dontwarn com.github.CymChad.**
-keep class com.github.CymChad.** { *; }
#firebase
-dontwarn com.google.firebase.**
-keep class com.google.firebase.** { *; }
-dontwarn com.google.android.gms.**
-keep class com.google.android.gms.** { *; }
#materialish-progress
-dontwarn com.pnikosis.**
-keep class com.pnikosis.** { *; }
#ultimatebar
-dontwarn com.github.zackratos.ultimatebar.**
-keep class com.github.zackratos.ultimatebar.** { *; }
# Gson 相关的混淆配置
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
# 注解类避免混淆
-keep class * extends java.lang.annotation.Annotation { *; }
-keep interface * extends java.lang.annotation.Annotation { *; }
#根据项目实际情况添加
-keep class com.my.example.common.utils.NotificationUtils { *; }

 

你可能感兴趣的:(Android开发,Android,Studio)