android 混淆 讲解

转载请标明出处:http://www.jianshu.com/p/1a16eb7fc402

Proguard的作用

proguard除了可以混淆代码,防止被反编译外,还有压缩,优化,预检代码的作用。

在app.gradle文件中的buildTypes里写了一段关于app混淆的语句,先看下

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

minifyEnabled true是来设置是否需要混淆
proguardFiles后面跟着两个写着混淆规则的文件,第一个是默认的,第二个是用户自己添加。默认除了proguard-android-optimize.txt之外,还有一个是proguard-android.txt,都在 sdk\tools\proguard 文件夹里,这两个的区别是前一个做过优化,当然添加优化后存在一定的风险,比如不是所有的虚拟机都支持这个优化,具体如下文。

Optimizations: If you don't want to optimize, use the proguard-android.txt configuration file instead of this one, which turns off the optimization flags. Adding optimization introduces certain risks, since for example not all optimizations performed by ProGuard works on all versions of Dalvik. The following flags turn off various optimizations known to have issues, but the list may not be complete or up to date. (The "arithmetic" optimization can be used if you are only targeting Android 2.0 or later.) Make sure you test thoroughly if you go this route.

用户自己添加的混淆规则文件位置是ProjectName\app\proguard-rules.pro,默认的混淆规则在一个大项目里都是不够的,必须要添加很多自定义的混淆规则。

不需要混淆

不混淆的(类、方法等)即名字是不能改变的,不然会出错

  • 反射用到的类不混淆,如一些注解框架需要保证类名方法不变,不然就反射不了。
  • Parcelable和它的子类,还有Creator成员变量不混淆
  • R类里及其所有内部static类中的所有static变量字段不混淆
  • JSON对象类不混淆,不然无法将JSON解析成对应的对象。
  • 使用第三方开源库或者引用其他第三方的SDK包时,需要在混淆文件中加入对应的混淆规则
  • 有用到WebView的Js调用也需要保证写的接口方法不混淆
  • JNI方法不混淆
  • ……

ProGuard的常用语法

-libraryjars class_path 应用的依赖包,如Android-support-v4
-keep [,modifier,...] class_specification 不混淆某些类
-keepclassmembers [,modifier,...] class_specification 不混淆类的成员
-keepclasseswithmembers [,modifier,...] class_specification 不混淆类及其成员
-keepnames class_specification 不混淆类及其成员名
-keepattributes {attribute_name,...} 不混淆给定的可选属性
-keepclassmembernames class_specification 不混淆类的成员名
-keepclasseswithmembernames class_specification 不混淆类及其成员名
-assumenosideeffects class_specification 假设调用不产生任何影响,在proguard代码优化时会将该调用remove掉。如Log等等
-dontwarn [class_filter] 不提示warnning
more

常用代码

  • 不混淆某类的构造方法,需指定构造函数的参数类型,如JSONObject
-keepclassmembersclass cn.trinea.android.common.service.impl.ImageCache{
   public<init>(int);
}
  • 不混淆某个包所有类或某个类class、某个接口interface, 不混淆指定类则把**换成类名
-keep class com.facebook.**
-keep class cn.trinea.android.common.**{ *;}
  • 不混淆指某个方法,*可换成指定的方法或类名
-keepclassmembersclass cn.trinea.android.common.service.impl.ImageCache{
   public boolean get(java.lang.String,android.view.View);
}
  • 不混淆Parcelable的子类,防止android.os.BadParcelableException
-keep class *implements android.os.Parcelable{
  public static final android.os.Parcelable$Creator*;
}
  • 添加android-support-v4.jar依赖包
-libraryjars  libs/android-support-v4.jar
-dontwarn android.support.v4.**    
-keep class android.support.v4.**{ *;}  
-keep interface android.support.v4.app.**{ *;}
  • proguard与log level结合解决debug模式Log问题,表示Log.d和Log.v代码无副作用,在proguard时会被从源码中remove掉,这样release模式(正式发布)就不会打印日志了,而debug模式(平常调试)照常打印。
-assumenosideeffects class android.util.Log{
    public static ***d(...);
    public static ***v(...);
}

more

映射

mapping.txt 列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码。
mapping文件在 \app\build\outputs\mapping\release

特别推荐以下几篇 参考资料:

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,056评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,427评论 2 45
  • 在离职之际,也没有啥事可以做,就自己捣腾下代码混淆,言归正传。 为了防止自己的劳动成果被别人窃取,混淆代码能有效防...
    Orz013阅读 1,010评论 0 0
  • 宝贝,你好! 早上下楼让你把垃圾带下楼,你一阵扭捏,嫌脏不肯拿。扔垃圾也是家务的一部分,应该算是最轻松的家务了吧?...
    安妮虾阅读 177评论 0 0
  • 咯MVP咯空压浓
    灵徒喔阅读 170评论 0 0