美文网首页
android混淆

android混淆

作者: pisfans | 来源:发表于2020-01-06 14:25 被阅读0次

    目的

    Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向(破解)。

    开启

    buildTypes {
            release {
                minifyEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig signingConfigs.config
                }
            }
    }
    

    minifyEnabled为true,打开混淆;加上shrinkResources true,打开资源压缩。
    proguard-android.txt代表系统默认的混淆规则配置文件,该文件在<Android SDK目录>/tools/proguard下
    proguard-rules.pro代码表当前project的混淆配置文件,在app module下

    追溯Crash堆栈信息

    使用<SDK目录>\tools\proguard\bin下的proguardgui.bat脚本将Crash堆栈信息还原到混淆前的状态。步骤如下:
    双击打开脚本,选择左边的ReTrace选项
    选择Mapping file文件,也就是混淆后打包后在app module/build/outputs/mapping/release下生成的mapping.txt
    拷贝混淆后的堆栈信息
    点击右下角的ReTrace!按钮,完成Crash堆栈信息的追溯

    注意

    Proguard混淆规则一般在以下情况下不混淆,
    1.使用了自定义控件,四大组件保证它们不参与混淆
    2.使用了枚举要保证枚举不被混淆
    3.对第三方库中的类不进行混淆
    4.运用了反射的类也不进行混淆
    5.使用了 Gson 之类的工具要使 JavaBean 类即实体类不被混淆
    6.在引用第三方库的时候,一般会标明库的混淆规则的,建议在使用的时候就把混淆规则添加上去,免得到最后才去找
    7.有用到 WebView 的 JS 调用也需要保证写的接口方法不混淆,原因和第一条一样
    8.Parcelable 的子类和 Creator 静态成员变量不混淆,否则会产生 Android.os.BadParcelableException 异常,Serializable序列化也是不混淆

    命令及作用

    保持相关元素不参与混淆的规则相关的几种命令
    keep 保留类和类成员,防止被混淆或移除
    keepnames 保留类和类成员,防止被混淆,但没有被引用的类成员会被移除
    keepclassmembers 只保留类成员,防止被混淆或移除
    keepclassmembernames 只保留类成员,防止被混淆,但没有被引用的成员会被移除
    keepclasseswithmembers 保留类和类成员,防止被混淆或移除,如果指定的类成员不存在还是会被混淆
    keepclasseswithmembernames 保留类和类成员,防止被混淆,如果指定的类成员不存在还是会被混淆,没有被引用的类成员会被移除

    -Keep

    #保持类名不混淆
    -keep class pr.tongson.bean.KeyBoardBean
    #包内的类
    -keep class pr.tongson.bean.*
    #包内及子包的类
    -keep class pr.tongson.bean.**
    #保持类名和类里面的内容不被混淆,加上{*;}
    -keep class pr.tongson.bean.*{*;}
    -keep class pr.tongson.algorithm.Calculate{
      #保持该类下所有的共有方法不被混淆
      public <methods>;
      #保持该类下所有的共有内容不被混淆
      public *;
      #保持该类下所有的私有方法不被混淆
      private <methods>;
      #保持该类下所有的私有内容不被混淆
      private *;
      #保持该类的String类型的构造方法
      public <init>(java.lang.String);
    }
    #保持Calculate中的内部类MyClass不被混淆
    -keep class pr.tongson.algorithm.Calculate$MyClass{*;}
    #用extends,implement等这些Java规则
    -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.view.View
    #不需要保持类名,保持该类下的特定方法,用keepclassmembers,而不是keep
    -keepclassmembernames class pr.tongson.algorithm.Calculate{
      public void test(java.lang.String);
    }
    #jni方法不可混淆,因为native方法是要完整的包名类名方法名
    #保持native方法不被混淆
    -keepclasseswithmembernames class * {    
      native <methods>; 
    }
    #Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常
    -keep class * implements Android.os.Parcelable { 
      # 保持Parcelable不被混淆            
      public static final Android.os.Parcelable$Creator *;
    }
    #enum类的特殊性,以下两个方法会被反射调用
    -keepclassmembers enum * {  
      public static **[] values();  
      public static ** valueOf(java.lang.String);  
    }
    

    常用

    # 代码混淆压缩比,在0~7之间
    -optimizationpasses 5
    # 混合时不使用大小写混合,混合后的类名为小写
    -dontusemixedcaseclassnames
    # 指定不去忽略非公共库的类
    -dontskipnonpubliclibraryclasses
    # 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
    -dontpreverify
    # 这句话能够使我们的项目混淆后产生映射文件
    # 包含有类名->混淆后类名的映射关系
    -verbose
    # 避免混淆泛型
    -keepattributes Signature
    
    # 保留Annotation不混淆
    -keepattributes *Annotation*,InnerClasses
    #google推荐算法
    -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
    # 避免混淆Annotation、内部类、泛型、匿名类
    -keepattributes *Annotation*,InnerClasses,Signature,EnclosingMethod
    # 重命名抛出异常时的文件名称
    -renamesourcefileattribute SourceFile
    # 抛出异常时保留代码行号
    -keepattributes SourceFile,LineNumberTable
    # 处理support包
    -dontnote android.support.**
    -dontwarn android.support.**
    # 保留继承的
    -keep public class * extends android.support.v4.**
    -keep public class * extends android.support.v7.**
    -keep public class * extends android.support.annotation.**
    
    # 保留R下面的资源
    -keep class **.R$* {*;}
    # 保留四大组件,自定义的Application等这些类不被混淆
    -keep public class * extends android.app.Activity
    -keep public class * extends android.app.Appliction
    -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 com.android.vending.licensing.ILicensingService
    
    # 保留在Activity中的方法参数是view的方法,
    # 这样以来我们在layout中写的onClick就不会被影响
    -keepclassmembers class * extends android.app.Activity{
        public void *(android.view.View);
    }
    # 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆
    -keepclassmembers class * {
        void *(**On*Event);
        void *(**On*Listener);
    }
    # 保留本地native方法不被混淆
    -keepclasseswithmembernames class * {
        native <methods>;
    }
    
    # 保留枚举类不被混淆
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    
    # 保留Parcelable序列化类不被混淆
    -keep class * implements android.os.Parcelable {
        public static final android.os.Parcelable$Creator *;
    }
    
    -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();
    }
    #assume no side effects:删除android.util.Log输出的日志
    -assumenosideeffects class android.util.Log {
        public static *** v(...);
        public static *** d(...);
        public static *** i(...);
        public static *** w(...);
        public static *** e(...);
    }
    #保留Keep注解的类名和方法
    -keep,allowobfuscation @interface android.support.annotation.Keep
    -keep @android.support.annotation.Keep class *
    -keepclassmembers class * {
        @android.support.annotation.Keep *;
    }
    #3D 地图 V5.0.0之前:
    
    -dontwarn com.amap.api.**
    -dontwarn com.autonavi.**
    -keep class com.amap.api.**{*;}
    -keep class com.autonavi.**{*;}
    
    -keep   class com.amap.api.maps.**{*;}
    -keep   class com.autonavi.amap.mapcore.*{*;}
    -keep   class com.amap.api.trace.**{*;}
    
    #3D 地图 V5.0.0之后:
    -keep   class com.amap.api.maps.**{*;}
    -keep   class com.autonavi.**{*;}
    -keep   class com.amap.api.trace.**{*;}
    
    #定位
    -keep class com.amap.api.location.**{*;}
    -keep class com.amap.api.fence.**{*;}
    -keep class com.autonavi.aps.amapapi.model.**{*;}
    
    #搜索
    -keep   class com.amap.api.services.**{*;}
    
    #2D地图
    -keep class com.amap.api.maps2d.**{*;}
    -keep class com.amap.api.mapcore2d.**{*;}
    
    #导航
    -keep class com.amap.api.navi.**{*;}
    -keep class com.autonavi.**{*;}
    # Retain generic type information for use by reflection by converters and adapters.
    -keepattributes Signature
    
    # Retain service method parameters when optimizing.
    -keepclassmembers,allowshrinking,allowobfuscation interface * {
        @retrofit2.http.* <methods>;
    }
    
    # Ignore annotation used for build tooling.
    -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
    
    # Ignore JSR 305 annotations for embedding nullability information.
    -dontwarn javax.annotation.**
    
    # JSR 305 annotations are for embedding nullability information.
    -dontwarn javax.annotation.**
    
    # A resource is loaded with a relative path so the package of this class must be preserved.
    -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
    
    # Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
    -dontwarn org.codehaus.mojo.animal_sniffer.*
    
    # OkHttp platform used only on JVM and when Conscrypt dependency is available.
    -dontwarn okhttp3.internal.platform.ConscryptPlatform
    
    #fastjson混淆
    -keepattributes Signature
    -dontwarn com.alibaba.fastjson.**
    -keep class com.alibaba.**{*;}
    -keep class com.alibaba.fastjson.**{*; }
    -keep public class com.ninstarscf.ld.model.entity.**{*;}
    

    一些第三方

    # okhttp
    -dontwarn okhttp3.**
    -dontwarn okio.**
    -dontwarn javax.annotation.**
    -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
    
    # Retrofit
    -dontwarn okio.**
    -dontwarn javax.annotation.**
    -dontnote retrofit2.Platform
    -dontwarn retrofit2.Platform$Java8
    -keepattributes Signature
    -keepattributes Exceptions
    
    # RxJava RxAndroid
    -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.** { *; }
    -keepattributes EnclosingMethod
    # xxx代表model类的全包名路径
    -keep class xxx.** { *; }
    
    # butterknie
    -keep class butterknife.** { *; }
    -dontwarn butterknife.internal.**
    -keep class **$$ViewBinder { *; }
    -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
    }
    -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
    }
    
    # eventbus
    -keepattributes *Annotation*
    -keepclassmembers class ** {
        @org.greenrobot.eventbus.Subscribe <methods>;
    }
    -keep enum org.greenrobot.eventbus.ThreadMode { *; }
    # Only required if you use AsyncExecutor
    -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
        <init>(java.lang.Throwable);
    }
    

    相关文章

      网友评论

          本文标题:android混淆

          本文链接:https://www.haomeiwen.com/subject/tmihactx.html