常用混淆配置

我们的APK发布之前都需要混淆签名,打包,发布。最近接触混淆,所以写个文章记录一下自己的学习路径,以后用的时候也好回顾一下,善于总结,变成我自己的知识。
混淆是的官网地址:http://proguard.sourceforge.net/

AndroidStudiobuild.gradle中配置相应的混淆项,首先build.gradle里面默认有如下一段代码:

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

默认不开启混淆,如果需要开启混淆,则将minifyEnabled改成true.

常见库的混淆配置:
在Android中有默认的混淆配置,但是可能不满足你的所有的需求,有一些类或者方法不希望被混淆,这个时候就要配置自己的混淆项。

混淆文件是module的proguard-rules中。

混淆语法

-libraryjars class_path 避免混淆第三方jar包 ,后面连接包路径
-keep {Modifier} {class_specification} 保护指定的类文件和类的成员
-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好
-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。
-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员存在(在压缩步骤之后)

常见配置如下:

###-----------基本指令--------------------
###-----------指定代码的压缩级别------------
-optimizationpasses 5
###-----------是否使用大小写混合------------
-dontusemixedcaseclassnames
###-----------混淆时是否做预校验------------
-dontpreverify
###-----------混淆时是否记录日志------------
-verbose
###-----------忽略警告------------
-ignorewarnings
-keepattributes EnclosingMethod

###-----------保证异常时显示行号------------
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

 #dump文件列出apk包内所有class的内部结构
-dump class_files.txt        

#seeds.txt文件列出未混淆的类和成员
-printseeds seeds.txt

#usage.txt文件列出从apk中删除的代码
-printusage unused.txt

#mapping文件列出混淆前后的映射
-printmapping mapping.txt

###-----------注解------------
-keepattributes *Annotation*

###-----------泛型------------
-keepattributes Signature

###-----------异常------------
-keepattributes Exceptions

###-----------混淆时所采用的算法------------
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
###-----------避免混淆Android基本组件的配置--------------------
###-----------保持Activity类不被混淆------------
-keep public class * extends android.app.Activity
###-----------保持AppCompatActivity类不被混淆------------
-keep public class * extends android.support.v7.app.AppCompatActivity
###-----------保持DialogFragment类不被混淆------------
-keep public class * extends android.app.DialogFragment
###-----------保持Application类不被混淆------------
-keep public class * extends android.app.Application
###-----------保持Service类不被混淆------------
-keep public class * extends android.app.Service
###-----------保持BroadcastReceiver类不被混淆------------
-keep public class * extends android.content.BroadcastReceiver
###-----------保持ContentProvider类不被混淆------------
-keep public class * extends android.content.ContentProvider
###-----------保持BackupAgentHelper类不被混淆------------
-keep public class * extends android.app.backup.BackupAgentHelper
###-----------保持Preference类不被混淆------------
-keep public class * extends android.preference.Preference
###-----------保持ILicensingService类不被混淆------------
-keep public class com.android.vending.licensing.ILicensingService

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

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

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

###-----------保持自定义控件类不被混淆------------
-keepclassmembers class * extends android.app.Activity {
    public void *(android.view.View);
}

###-----------保持枚举 enum 类不被混淆------------
-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 *;
} 

###----------混淆第三方库-----------------

###-----------保持 retrofit client 不被混淆------------
-keep class com.excellence.retrofit.RetrofitHttpService { *; }

###-----------保持 retrofit 不被混淆------------
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-dontwarn javax.annotation.**

###-----------保持 okhttp 不被混淆------------
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**

###-----------保持 GreenDao 不被混淆------------
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties

###-----------保持 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);
}

###-----------保持 bugly 不被混淆------------
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}

###-----------保持 gson 不被混淆------------
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }

###-----------保持 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;
}

###-----------保持 volley 不被混淆------------
-keep class com.android.volley.** { *; }
-keep class com.android.volley.toolbox.** { *; }

当你的工程引用了其他库的时候,你应该对该库也进行混淆配置。混淆配置完了之后需要详细的测试是否有问题,可能由于混淆导致某个类找不到了从而程序不能正常运行。

混淆虽然可以一定程度上防止别人反编译你的代码,但是混淆也存在缺点,混淆之后的代码,对于开发人员定位问题的位置不太友好,因为报错都是abcd之类的名字,我们也不知道是哪个类,哪个方法了。不过还好,我们有工具协助。可以将错误还原成原来的代码。

首先找到你的Android的sdk目录。然后找到tools--> proguard -->bin-->proguardgui.bat.双击打开之后如下图:

2中mapping.txt的路径app\build\outputs\mapping\发布渠道\release\mapping.txt,这个文件记录了混淆的规则,混淆前类和混淆后类的对应关系,所以可以根据这个文件还原混淆前的类,我觉得翻译成原来的类更为贴切。
这样你就可以对已经发布的apk,bug的log进行翻译并且定位了。

PS: 工程配置了混淆之后,需要详细测试,因为可能由于混淆之后某些类找不到从而影响程序正常运作。

参考:
Android混淆总结篇(一)
5分钟搞定android混淆

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

推荐阅读更多精彩内容