使用proguard混淆android代码
当前是有些工具比方apktool,dextojar等是能够对我们android安装包进行反编译,获得源代码的。为了降低被别人破解,导致源代码泄露,程序被别人盗代替码,等等。我们须要对代码进行混淆,android的sdk中为我们提供了ProGrard这个工具,能够对代码进行混淆(通常是用无意义的名字来重命名),以及去除没有使用到的代码,对程序进行优化和压缩,这样能够添加�你想的难度。近期我做的项目,是我去配置的混淆配置,因此研究了一下,这里分享一下。
怎样启用ProGuard
ant项目和eclipse项目启用方法
在项目的project.properties文件里加入�一下代码
proguard.config=proguard.cfg //proguard.cfg为proguard的配置文件
proguard.config=/path/to/proguard.cfg //路径不在项目根文件夹时,填写实际路径
填写这句配置后,在release打包时就会依照我们的配置进行混淆,注意,在我们平时的debug时是不会进行混淆的。
Gradle项目(以及Android Studio)
在build.gradle中进行配置
android {
buildTypes {
release {
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'),'some-other-rules.txt'
//proguardFile 'some-other-rules.txt' 配置单个文件这样
}
}
}
如上面代码所看到的,我们能够使用runProguard true开启,而且对其配置混淆配置,能够配置多个文件或单个文件。
android的sdk中已经为我们提供了两个默认的配置文件,我们能够拿过来进行使用,proguard-android.txt和proguard-android-optimize.txt。
ProGuard配置
上面说到android为我们提供了两个默认的配置文件,在当中,我们能够看到他的一些语法。本节进行描写叙述。
保留选项(配置不进行处理的内容)
-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} 使用给定文件里的keyword作为要混淆方法的名称
-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提供的默认配置中都有。
ProGuard的输出文件及用处
混淆之后,会给我们输出一些文件,在gradle方式下是在<project_dir>/build/proguard/文件夹下,ant是在<project_dir>/bin/proguard文件夹,eclipse构建在<project_dir>/proguard文件夹像。
分别有下面文件:
+ dump.txt 描写叙述apk文件里全部类文件间的内部结构。
+ mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。
+ seeds.txt 列出了未被混淆的类和成员
+ usage.txt 列出了从apk中删除的代码
当我们公布的release版本号的程序出现bug时,能够通过以上文件(特别时mapping.txt)文件找到错误原始的位置,进行bug改动。同一时候,可能一開始的proguard配置有错误,也能够通过错误日志,依据这些文件,找到哪些文件不应该混淆,从而改动proguard的配置。
注意:又一次release编译后,这些文件会被覆盖,所以没吃公布程序,最好都保存一份配置文件。
调试Proguard混淆后的程序
上面说了输出的几个文件,我们在改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工具会从标准输入读取。
一些经常使用包的Proguard配置
以下再写一些我在项目中使用到的一些第三方包须要单独配置的混淆配置
sharesdk混淆注意
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class com.sina.**{*;}
-keep class m.framework.**{*;}
Gson混淆配置
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.idea.fifaalarmclock.entity.***
-keep class com.google.gson.stream.** { *; }
Umeng sdk混淆配置
-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
原文地址:http://blog.isming.me/blog/2014/05/31/use-proguard/,欢迎转载,转载请注明出处。
使用proguard混淆android代码的更多相关文章
- proguard 混淆android代码
官网 http://proguard.sourceforge.net/#manual/examples.html android 2.3后,新建的project默认就有一个project.proper ...
- Android(java)学习笔记128:使用proguard混淆android代码
1.当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的.为了减少被别人破解,导致源码泄露,程序被别人盗取代码,等等.我们需要对代码进行混淆,an ...
- Android(java)学习笔记68:使用proguard混淆android代码
1. 当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的.为了减少被别人破解,导致源码泄露,程序被别人盗取代码,等等.我们需要对代码进行混淆,a ...
- 采用proguard困惑android代码
当前是有些工具比方apktool,dextojar等是能够对我们android安装包进行反编译.获得源代码的.为了降低被别人破解,导致源代码泄露,程序被别人盗代替码,等等.我们须要对代码进行混淆.an ...
- 转载:混淆包含SlidingMenu、gson等Android代码的proguard写法
描述:作为一个写了几年c#的码农,咱的java水平实在不敢恭维,但是最近有个任务需要弄点java的代码,还要研究混淆.网上百度并实验了整整一天,终于算是有点成果了.其中混淆的时候由于用到了gson包, ...
- 利用android proguard混淆代码
利用android proguard混淆代码 2014-02-05 17:50 1207人阅读 评论(1) 收藏 举报 网上虽然有很多相关博客,不过貌似都不是最新版的..于是百度+谷歌+github上 ...
- Android 代码混淆、Android Proguard(混淆)
Android Proguard(混淆) 混淆(Proguard)用法 最近项目中遇到一些混淆相关的问题,由于之前对proguard了解不多,所以每次都是面向Stackoverflow的编程.co ...
- Android:如何从堆栈中还原ProGuard混淆后的代码
本文翻译自Android: How To Decode ProGuard's Obfuscated Code From Stack Trace 本篇文章是写给那些在他们的应用中使用ProGuard并且 ...
- Android代码混淆官方实现方法
首先查看一下 “project.properties” 这个文件: # This file is automatically generated by Android Tools.# Do not m ...
随机推荐
- python easy_install centos 下安装过程和原理解析
一.easy_install 安装过程 其安装过程有很多种,我也找了很多的例子,但是结果都不太好,以下方法的结果是不错的. easy_install与yum类似,使用easy_install,可以轻松 ...
- 2.2……测试
概述 黑盒测试: 是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的. 白盒测试: 又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试. 单元测试: 又称模块测试,是开发者编写的 ...
- 最短路+线段交 POJ 1556 好题
// 最短路+线段交 POJ 1556 好题 // 题意:从(0,5)到(10,5)的最短距离,中间有n堵墙,每堵上有两扇门可以通过 // 思路:先存图.直接n^2来暴力,不好写.分成三部分,起点 终 ...
- Multiple reportviewers on one page With reportviwer 11.0
Hi, evreryone: When I use VS 2012 to create report with reportviwer 11.0, I meet a problem abou ...
- Java Client for Google Cloud Storage
关于Google Cloud Storage Google Cloud Storage有益于大文件的存储与服务(serve).此外,Cloud Storage提供了对访问控制列表(ACLs)的使用,提 ...
- HDU 5842 Lweb and String (水题)
Lweb and String 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5842 Description Lweb has a string S ...
- Codeforces 622B The Time 【水题】
B. The Time time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- FIREDAC连接MSSQL 2000报不能支持连接MSSQL2000及更低版本的解决办法
FIREDAC连接MSSQL 2000的时候会报错,原因是MSSQL CLIENT11或MSSQL CLIENT10客户端驱动程序已经不支持连接MSSQL2000及更低版本的数据库. 解决办法: 设置 ...
- iOS 将图片保存到本地
//将图片保存到本地 + (void)SaveImageToLocal:(UIImage*)image Keys:(NSString*)key { NSUserDefaults* prefer ...
- dns解析对SEO产生的影响
DNS 是域名系统 (Domain Name System) 的缩写,它是由解析器和域名服务器组成的.域名服务器是指保存有该网络中所有主机的域名和对应的IP地址,并具有将域名转换为IP地址功能的服务器 ...