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

当前环境

Android Studio: 3.2.1
Gradle 插件: 'com.android.tools.build:gradle:3.2.1'
Gradle : gradle-4.6

具体配置

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

#-ignorewarnings                     # 忽略警告,避免打包时某些警告出现
-optimizationpasses 5               # 指定代码的压缩级别
-dontusemixedcaseclassnames         # 是否使用大小写混合 混淆时不会产生形形色色的类名
-dontskipnonpubliclibraryclasses    # 是否混淆第三方jar
-dontpreverify                      # 混淆时是否做预校验
-verbose                            # 混淆时是否记录日志
-dontoptimize                       # 不优化输入的类文件

## 这个 SourceFile 可以字 Smali 文件里面 .source "xxxx" 保证原始类名不被抹掉
-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
#  *匹配任意字符不包括 “ . ” ,**匹配任意字符
#  下面这行的意思是,保留v4下面的类名及其v4下面子包的类名不被混淆
-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  保留类和类中的成员,防止被混淆,保留指明的成员,成员没有引用会被移除
# 保持 native 方法不被混淆
-keepclasseswithmembernames class * {     
    native <methods>;
}

#keepclasseswithmembers 保留类和类中的成员,防止被混淆或移除,保留指明的成员(和上面的区别是,这里会防止被移除)
#  保持自定义控件类名和构造方法不被混淆或移除
-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();
}

#####################上面这些是系统默认配置的#####################3
## 一般来说上面的这些即使我们不写,开了混淆也会自动启用
## 现在我用的 Android Studio Gradle的插件是 3.2.1 这个插件自带默认混淆文件
## 在启用混淆的时候解压出来,详情参考 /项目名/build/intermediates/proguard-files/proguard-android.txt-3.2.1 里面的注释
## 注释上说gradle 的 Android 插件,从2.2 版本开始,不再使用sdk本地的Proguard,而以后gradle插件自带默认Proguard配置文件


#-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(...);
#}

# 实体类不混淆(自己项目实体类不被混淆,因为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>;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容