当前是有些工具好比apktool,dextojar等是能够对咱们android安装包进行反编译,得到源码的。为了减小被别人破解,致使源码泄露,程序被别人盗取代码,等等。咱们须要对代码进行混淆,android的sdk中为咱们提供了ProGrard这个工具,能够对代码进行混淆(通常是用无心义的名字来重命名),以及去除没有使用到的代码,对程序进行优化和压缩,这样能够增长你想的难度。最近我作的项目,是我去配置的混淆配置,所以研究了一下,这里分享一下。html
在项目的project.properties文件中添加一下代码linux
proguard.config=proguard.cfg //proguard.cfg为proguard的配置文件
proguard.config=/path/to/proguard.cfg //路径不在项目根目录时,填写实际路径android
填写这句配置后,在release打包时就会按照咱们的配置进行混淆,注意,在咱们平时的debug时是不会进行混淆的。web
在build.gradle中进行配置apache
android { buildTypes { release { runProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'),'some-other-rules.txt' //proguardFile 'some-other-rules.txt' 配置单个文件这样 } } }
如上面代码所示,咱们能够使用runProguard true开启,而且对其配置混淆配置,能够配置多个文件或单个文件。json
android的sdk中已经为咱们提供了两个默认的配置文件,咱们能够拿过来进行使用,proguard-android.txt和proguard-android-optimize.txt。app
上面说到android为咱们提供了两个默认的配置文件,在其中,咱们能够看到他的一些语法。本节进行描述。eclipse
保留选项(配置不进行处理的内容)ide
-keep {Modifier} {class_specification} 保护指定的类文件和类的成员
-keepclassmembers {modifier} {class_specification} 保护指定类的成员,若是此类受到保护他们会保护的更好
-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是全部指定的类和类成员是要存在。
-keepnames {class_specification} 保护指定的类和类的成员的名称(若是他们不会压缩步骤中删除)
-keepclassmembernames {class_specification} 保护指定的类的成员的名称(若是他们不会压缩步骤中删除)
-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,若是全部指定的类成员出席(在压缩步骤以后)
-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件工具
压缩
-dontshrink 不压缩输入的类文件
-printusage {filename}
-whyareyoukeeping {class_specification}
优化
-dontoptimize 不优化输入的类文件
-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何反作用
-allowaccessmodification 优化时容许访问并修改有修饰符的类和类的成员
混淆
-dontobfuscate 不混淆输入的类文件
-obfuscationdictionary {filename} 使用给定文件中的关键字做为要混淆方法的名称
-overloadaggressively 混淆时应用侵入式重载
-useuniqueclassmembernames 肯定统一的混淆类的成员名称来增长混淆
-flattenpackagehierarchy {package_name} 从新包装全部重命名的包并放在给定的单一包中
-repackageclass {package_name} 从新包装全部重命名的类文件中放在给定的单一包中
-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名
-keepattributes {attribute_name,...} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
-renamesourcefileattribute {string} 设置源文件中给定的字符串常量
后面的文件名,类名,或者包名等能够使用占位符代替
?表示一个字符
在android中在android Manifest文件中的activity,service,provider, receviter,等都不能进行混淆。一些在xml中配置的view也不能进行混淆,android提供的默认配置中都有。
混淆以后,会给咱们输出一些文件,在gradle方式下是在*<project_dir>/build/proguard/目录下,ant是在<project_dir>/bin/proguard目录,eclipse构建在<project_dir>/proguard*目录像。
分别有如下文件:
当咱们发布的release版本的程序出现bug时,能够经过以上文件(特别时mapping.txt)文件找到错误原始的位置,进行bug修改。同时,可能一开始的proguard配置有错误,也能够经过错误日志,根据这些文件,找到哪些文件不该该混淆,从而修改proguard的配置。
注意:从新release编译后,这些文件会被覆盖,因此没吃发布程序,最好都保存一份配置文件。
上面说了输出的几个文件,咱们在改bug时能够使用,经过mapping.txt,经过映射关系找到对应的类,方法,字段等。
另外Proguard文件中包含retrace脚本,能够将一个被混淆过的堆栈跟踪信息还原成一个可读的信息,window下时retrace.bat,linux和mac是retrace.sh,在*<sdk_root>/tools/proguard/*文件夹下。语法为:
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
若是你没有指定*<stacktrace_file>*,retrace工具会从标准输入读取。
下面再写一些我在项目中使用到的一些第三方包须要单独配置的混淆配置
-keep class android.net.http.SslError -keep class android.webkit.**{*;} -keep class cn.sharesdk.**{*;} -keep class com.sina.**{*;} -keep class m.framework.**{*;}
-keepattributes *Annotation* -keep class sun.misc.Unsafe { *; } -keep class com.idea.fifaalarmclock.entity.*** -keep class com.google.gson.stream.** { *; }
-keepclassmembers class * { public <init>(org.json.JSONObject); } -keep class com.umeng.** -keep public class com.idea.fifaalarmclock.app.R$*{ public static final int *; } -keep public class com.umeng.fb.ui.ThreadView { } -dontwarn com.umeng.** -dontwarn org.apache.commons.** -keep public class * extends com.umeng.** -keep class com.umeng.** {*; }
关于配置方面,我写的不够详细,能够去看参考资料第二条,proguard官方文档。也欢迎你们交流使用遇到的问题和心得。
资料参考:
1.http://proguard.sourceforge.net/
2.http://developer.android.com/tools/help/proguard.html