当前是有些工具比方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代码的更多相关文章

  1. proguard 混淆android代码

    官网 http://proguard.sourceforge.net/#manual/examples.html android 2.3后,新建的project默认就有一个project.proper ...

  2. 使用proguard混淆android代码

    当前是有些工具比方apktool,dextojar等是能够对我们android安装包进行反编译,获得源代码的.为了降低被别人破解,导致源代码泄露,程序被别人盗代替码,等等.我们须要对代码进行混淆,an ...

  3. Android(java)学习笔记128:使用proguard混淆android代码

    1.当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的.为了减少被别人破解,导致源码泄露,程序被别人盗取代码,等等.我们需要对代码进行混淆,an ...

  4. Android(java)学习笔记68:使用proguard混淆android代码

    1. 当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的.为了减少被别人破解,导致源码泄露,程序被别人盗取代码,等等.我们需要对代码进行混淆,a ...

  5. Android 代码混淆 混淆方案

    本篇文章:自己在混淆的时候整理出比较全面的混淆方法,比较实用,自己走过的坑,淌出来的路.请大家不要再走回头路,可能只要我们代码加混淆,一点不对就会导致项目运行崩溃等后果,有许多人发现没有打包运行好好地 ...

  6. 值得细读!如何系统有效地提升Android代码的安全性?

    众所周知,代码安全是Android开发工作中的一大核心要素. 11月3日,安卓巴士全球开发者论坛线下系列沙龙第七站在成都顺利举办.作为中国领先的安卓开发者社区,安卓巴士近年来一直致力于在全国各大城市举 ...

  7. Android 代码混淆规则

    1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录toolsproguard下面.ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器 ...

  8. Android代码混淆官方实现方法

    首先查看一下 “project.properties” 这个文件: # This file is automatically generated by Android Tools.# Do not m ...

  9. apk反编译(6)ProGuard 工具 android studio版官方教程[作用,配置,解混淆,优化示例]

    ProGuard In this document Enabling ProGuard (Gradle Builds) Configuring ProGuard Examples Decoding O ...

随机推荐

  1. 0-20ma 0-5V,0-10V ,0-15V ,0-20V,0-30V模拟量(范围可以定制)多功能采集模块,支持1路继电器输出,2路Di输入,8路Ai输入,可电脑控制,支持485 modbus rtu协议。端口参数可以配置保存,支持定制修改。

    多功能模拟量采集模块MRD-5017具有8 通道模拟量采集(支持0-20mA,0-5V,0-10V混合测量),2路DI,1路继电器输出,1路485接口(支持MODBUS RTU),能实现8路AI(12 ...

  2. matlab绘制函数

    >> x1=linspace(,*pi,); x2=linspace(,*pi,); x3=linspace(,*pi,); y1=sin(x1); y2=+sin(x2); y3=+si ...

  3. java+android学习路线图

    java.android学习路线图  看图之前先按住Ctrl键同时滑动鼠标滚轮

  4. java 数字前自动补零实现

    /** * 里数字转字符串前面自动补0的实现. * */ public class TestStringFormat { public static void main(String[] args) ...

  5. strlen、strcmp、strcat、strcpy、memcpy基础函数的实现

    最近实习+投简历+琐事弄得自己忙的不行不行的,终于今天可以开始记录一些东西了... 1.strlen函数的实现 int strlen(const char *str){ assert(str!=NUL ...

  6. php技能考试每日一练

    PHP技術者認定 1, [日本語文字のメール送信] (2016年10月31日)以下のコードは桃家タローさん宛てにメールを送るためのものである.コード内の[(1)]に入る正しいものを1つ次の記述の中から ...

  7. kindeditor更改图片上传时网络图片的路径

    当我们想要使用kindeditor的图片上传功能时,有两种选择图片方式,一种是本地选择,一种是在图片空间中选择,图片空间的默认地址是server上的/kindeditor/attached/image ...

  8. javascript高级知识分析——作为对象的函数

    代码信息来自于http://ejohn.org/apps/learn/. 函数和对象是不是非常相似? var obj = {}; var fn = function(){}; console.log( ...

  9. DOM元素对象的属性和方法(2)

    11.contentEditable 作用:设置或返回元素内容可否编辑布尔值,HTML5新增属性 <!DOCTYPE html> <html> <head> < ...

  10. html标签总结。

    接触了一段时间的html和css,发现了其中的乐趣.在写代码时一定要仔细,很有可能一个细微的错误便会导致页面的错误 总结了一下html标签. <html></html> 创建一 ...