美文网首页Android开发技术中心Android安全Android
我的Android混淆(Proguard文件)是怎么写的

我的Android混淆(Proguard文件)是怎么写的

作者: 千山万水迷了鹿 | 来源:发表于2017-03-24 14:48 被阅读606次

    因为proguard文件要靠手写,所以有时候感觉很难,但是找到规律之后也挺简单的,感觉难是因为,不熟悉它的一些关键字,这里列出了常用的关键字,以及人能看懂的含义,其实要想看明白,自己写的Demo测试一下就好了,借助于反编译工具看下到底什么被混淆了,工具看这。我下面写了详细的注释github,常用的也就这么多了,其余的可以根据命令行进行调试,然后逐个添加。

    #-ignorewarnings                     # 忽略警告,避免打包时某些警告出现
    -optimizationpasses 5               # 指定代码的压缩级别
    -dontusemixedcaseclassnames         # 是否使用大小写混合 混淆时不会产生形形色色的类名
    -dontskipnonpubliclibraryclasses    # 是否混淆第三方jar
    -dontpreverify                      # 混淆时是否做预校验
    -verbose                            # 混淆时是否记录日志
    -dontoptimize                       # 不优化输入的类文件
    
    -keepattributes *Annotation*, SourceFile, InnerClasses, LineNumberTable, Signature, EnclosingMethod
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*    #优化 混淆时采用的算法
    
    -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.app.View
    -keep public class * extends android.app.IntentService
    -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.hardware.display.DisplayManager
    -keep public class * extends android.os.UserManager
    -keep public class com.android.vending.licensing.ILicensingService
    -keep public class * extends android.app.Fragment
    
    -keep public class * extends android.support.v4.widget
    -keep public class * extends android.support.v4.**    #  *匹配任意字符不包括.  **匹配任意字符
    -keep interface android.support.v4.app.** { *; }    #{ *;}    表示一个接口中的所有的东西都不被混淆
    # 下面这行表示保持这个包下面的所有的类里面的所有内容都不混淆
    -keep class android.support.v4.** { *; }        
    -keep class android.os.**{*;}
    -keep class android.support.v8.renderscript.** { *; }
    
    -keep class **.R$* { *; }
    -keep class **.R{ *; }
    
    #实现了android.os.Parcelable接口类的任何类,以及其内部定义的Creator内部类类型的public final静态成员变量,都不能被混淆和删除
    -keep class * implements android.os.Parcelable {    # 保持Parcelable不被混淆
      public static final android.os.Parcelable$Creator *;
    }
    
    -keepclasseswithmembernames class * {     # 保持 native 方法不被混淆
        native <methods>;
    }
    
    -keepclasseswithmembers class * {         # 保持自定义控件类不被混淆
        public <init>(android.content.Context, android.util.AttributeSet);
    }
    
    -keepclasseswithmembers class * {         # 保持自定义控件类不被混淆
        public <init>(android.content.Context, android.util.AttributeSet, int);
    }
    
    -keepclasseswithmembers class * {
      public <init>(android.content.Context, android.util.AttributeSet, int, int);
    }
    
    -keepclassmembers class * extends android.app.Activity { #保持类成员
       public void *(android.view.View);
    }
    
    -keepclassmembers class * extends android.content.Context {
      public void *(android.view.View);
      public void *(android.view.MenuItem);
    }
    
    -keepclassmembers enum * {                  # 保持枚举 enum 类不被混淆
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    
    # Explicitly preserve all serialization members. The Serializable interface
    # is only a marker interface, so it wouldn't save them.
    -keepnames class * implements java.io.Serializable
    
    -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();
    }
    
    #-libraryjars   libs/jar包名字.jar   #缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
    -dontwarn android.support.v4.**
    -dontwarn android.os.**
    
    #编译时关掉Log的打印,
    #-assumenosideeffects class android.util.Log {    #如果是自定义Log类,修改下面的包名
    #        public static *** d(...);
    #        public static *** e(...);
    #        public static *** i(...);
    #        public static *** v(...);
    #        public static *** println(...);
    #        public static *** w(...);
    #        public static *** wtf(...);
    #}
    
    ##############################--------以上是Android基本配置----------##############################
    
    # 实体类不混淆(自己项目实体类不被混淆,因为Gson中用到了反射)
    #-keep class me.febsky.entity.** { *; }
    ### -----这是个列子---- ###
    #这个类里面的所有的成员变量和方法都不混淆
    -keep class me.febsky.testprogard.MainActivity { *; }
    #这个类里面的内部类的所有的成员变量和方法都不混淆
    -keep class me.febsky.testprogard.MainActivity$* { *; }
    #这个类里面的所有public的内部类的所有的成员变量和方法都不混淆
    -keep public class me.febsky.testprogard.MainActivity$* { *; }
    #这个类里面的内部类的类名不备混淆,方法和变量还是混淆的
    -keep class me.febsky.testprogard.MainActivity$*
    #保持一个类的类名不被混淆,里面的方法和成员变量名还是被混淆的
    -keep public class me.febsky.testprogard.MyOutClass
    ### -----这是个列子---- ###
    
    ## for sharedSDK
    -keep class android.net.http.SslError
    -keep class android.webkit.**{*;}
    -keep class cn.sharesdk.**{*;}
    -keep class com.sina.**{*;}
    -keep class m.framework.**{*;}
    
    
    #butter knife
    -keep class butterknife.** { *; }
    -dontwarn butterknife.internal.**
    -keep class **$$ViewBinder { *; }
    -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
    }
    -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
    }
    
    

    相关文章

      网友评论

      本文标题:我的Android混淆(Proguard文件)是怎么写的

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