ProGuard runs only when you build your application in release mode,so you do not have to deal with obfuscated code when you build your applicationin debug mode.

http://developer.android.com/intl/zh-CN/tools/help/proguard.html

在default.properties中配置:(如果隐藏在某个路径中,则需要加上路径)

proguard.config=proguard.cfg

When you build yourapplication in release mode, either by running antrelease or by using the Export Wizard inEclipse, the build system automatically checks to see if theproguard.config property is set. If it is, ProGuardautomatically processes the application's bytecode before packaging everythinginto an .apk file. Building in debug mode does not invoke ProGuard,because it makes debugging more cumbersome.

ProGuard outputs thefollowing files after it runs:

dump.txt···描述apk文件中所有类文件的内部结构

mapping.txt···列出了类、方法、成员的原貌与混淆后的映射表。在收到错误报告时,可以用它翻译混淆后的堆栈信息。

seeds.txt···列出未混淆的类与成员

usage.txt···列出从apk中清除的无用代码

这些文件的位置在:

<project_root>/bin/proguard if you are using Ant.

<project_root>/proguard if you are using Eclipse.

但是,proguard.cfg文件在以下情况下可能移除开发者要用到的类:

仅在AndroidManifest.xml文件中用到的类

从JNI中调用的方法

动态引用的fields和methods

这时,便会出现ClassNotFoundException的问题,需要在文件中加入:

-keep public class<MyClass>

The retrace.bat script on Windows or the retrace.shscript on Linux or Mac OS X can convert an obfuscated stack trace to a readableone. It is located in the <sdk_root>/tools/proguard/directory. The syntax for executing the retrace tool is:

retrace.bat|retrace.sh[-verbose] mapping.txt [<stacktrace_file>]

For example: retrace.bat -verbosemapping.txt obfuscated_trace.txt

Proguard manual的学习

http://proguard.sourceforge.net/index.html#manual/introduction.html

经历四步(shrink 瘦身-去除无用代码,optimize 优化-优化方法的字节码 ,obfuscate 混淆-用无意义段短名称替代 ,preverify 预验证-添加预验证信息)。

对于使用反射的类,类名称设置可能从配置文件中读出,故需要专门指定为entry points.

不过,proguard还是对以下情况做了处理:

Class.forName("SomeClass")

SomeClass.class

SomeClass.class.getField("someField")

SomeClass.class.getDeclaredField("someField")

SomeClass.class.getMethod("someMethod",new Class[] {})

SomeClass.class.getMethod("someMethod",new Class[] { A.class })

SomeClass.class.getMethod("someMethod",new Class[] { A.class, B.class })

SomeClass.class.getDeclaredMethod("someMethod",new Class[] {})

SomeClass.class.getDeclaredMethod("someMethod",new Class[] { A.class })

SomeClass.class.getDeclaredMethod("someMethod",new Class[] { A.class, B.class })

AtomicIntegerFieldUpdater.newUpdater(SomeClass.class,"someField")

AtomicLongFieldUpdater.newUpdater(SomeClass.class,"someField")

AtomicReferenceFieldUpdater.newUpdater(SomeClass.class,SomeType.class, "someField")

瘦身阶段,保留以上类与方法;混淆阶段,更新上面的字串。

指定injar/outjar时,可以使用文件夹或者非jar文件,而libraryjars允许我们处理android,j2ee等运行文件,例子:

-injars      bin/classes

-injars      libs

-outjars     bin/classes-processed.jar

-libraryjars/usr/local/java/android-sdk/platforms/android-9/android.jar

-skipnonpubliclibraryclasses

跳过库中非public的类,可以加快proguard处理速度;

但是有些类库包含从public类中继承来的非public类,

这时如果加了这条会产生一个warning(find classes)

-dontskipnonpubliclibraryclasses

从prog4.5开始,这时默认设置

-dontskipnonpubliclibraryclassmembers

默认会跳过,不过有时位于同一个包中的程序类作为库类,

且他们引用了包内可见的类成员。

-printmapping myapplication.map

指定输出映射文件

-keep

保留某类

-keepclassmembers

保留某类成员

-keepclasseswithmembers

保留类和类成员

-keepnames

相当于-keep,allowshrinking class_specification.同理,

对于其他的-keepXXXXXnames,同样是加了allowshrinking 的简称

通配符:

?        matchesany single character in a file name.

*        matchesany part of a filename not containing the directory separator.

**        matches any part of a filename, possibly containingany number of directory separators(可以跨文件夹或者包).

For example,"java/**.class,javax/**.class" matches all class files in the javaand javax.

Keep

From being removed or renamed

From being renamed

Classes and class members

-keep

-keepnames

Class members only

-keepclassmembers

-keepclassmembernames

Classes and class members, if class members present

-keepclasseswithmembers

-keepclasseswithmembernames

替代符:

<init>        matchesany constructor.

<fields>        matchesany field.

<methods>        matchesany method.

*        matchesany field or method.

Note that the abovewildcards don't have return types. Only the <init> wildcard has anargument list.

%        matchesany primitive type ("boolean", "int", etc, but not"void").

?        matchesany single character in a class name.

*        matchesany part of a class name not containing the package separator.

**        matchesany part of a class name, possibly containing any number of package separators.

***        matchesany type (primitive or non-primitive, array or non-array).

...        matchesany number of arguments of any type.

Note,only the ***wildcards will match array types of any dimension. For example, "**get*()" matches "java.lang.Object getObject()", but not"float getFloat()", nor "java.lang.Object[] getObjects()".

proguard学习相关推荐

  1. Android代码混淆工具Proguard学习

    概述 Proguard代码混淆工具:可以对代码进行去冗余压缩,代码优化,代码混淆等.在Android中的主要应用就是对代码混淆:就是将类名,方法名,Field名变成如a,b,c或者1,2,3等难以阅读 ...

  2. 代码混淆技术yguard、ProGuard、Allatori

    混淆 Java的bytecode很容易通过JAD等反编译工具还原出源代码.这样势必不满足安全的定义.如何一定程度上保护需要防止被反编译的源代码呢?混淆(obfuscate)技术.注意:用obfusca ...

  3. 关于ProGuard的学习了解(从别处转来)

    from:http://www.cnitblog.com/zouzheng/archive/2011/01/12/72639.html 在Android项目中用到JNI,当用了proguard后,发现 ...

  4. [转载]关于Android ProGuard混淆学习记录

    转自:http://www.cnitblog.com/zouzheng/archive/2011/01/12/72630.aspx 前段时间把Android的工程用Ant Build搞定后,现在需要把 ...

  5. 深入学习ProGuard之:ProGuard简介与android的应用

    什么是ProGuard 在ProGuard的官网中,关于ProGuard的描述是这样的: ProGuard is a Java class file shrinker, optimizer, obfu ...

  6. Android开发究竟该如何学习,重难点整理

    背景 面是是上海的Android leader岗位,周日一轮面试,自我感觉答的都还不错. 结果收到邮件面试结束了,说什么"你优秀的学识和能力给我们留下了深刻的印象!经过对你综合情况的仔细评估 ...

  7. main java game,playgame 一个JAVA编写的飞行小游戏,有基本完整的 框架,适合初学者参照学习 Other s 其他 238万源代码下载- www.pudn.com...

    文件名称: playgame下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 7050 KB 上传时间: 2013-06-06 下载次数: 3 提 供 者: Lyq ...

  8. Android FrameWork学习(一)Android 7 0系统源码下载 编译

    最近计划着研究下 Android 7.0 的系统源码,之前也没做过什么记录,这次正好将学习的内容记录下来,方便以后复习巩固. 既然要学习我们的系统源码,那我们第一步要做的就是下载源码并进行编译了. # ...

  9. androidstudio学习总结_Android 开发工程师自述:2年的开发,我总结了7条经验

    全文共3547字,预计学习时长11分钟 "纸上得来终觉浅,绝知此事要躬行." "没有调查就没有发言权." "实践出真知." 古今中外,无数名 ...

最新文章

  1. How to use xxnet for linux
  2. 个人开发者帐号+wireless install 实现非app store程序的在线更新功能
  3. mybatis 联查
  4. 《程序员的思维修炼》思维导图
  5. python编写木马攻击_用Python写一个自动木马程序
  6. vue知识点归纳与总结(笔记)
  7. C++与tolua++的完整调用流程,超级详解解决交互疑难
  8. 计算机office demo,办公软件应用(Office2007)中级 DEMO盘-2013.doc
  9. Printf 输出格式总结
  10. 海马模拟器linux,Droid4X Mac版-海马玩模拟器Mac版下载 V0.8.3Beta-PC6苹果网
  11. notejs 视频教程 智能社
  12. python爬取知乎热搜_python爬取知乎
  13. python自学多久能精通-python多久可以精通
  14. Java map集合实现上一条(篇),下一条(篇)新闻翻篇功能
  15. input调起ios摄像头拍照旋转问题解决思路
  16. 竞品分析——崩坏3 战双帕弥什
  17. 已知顺序表中元素值递增有序。 用算法实现将元素x查到表中适当的位置上,以保持顺序表的有序性。
  18. 無名の主页个人主页html源码(附源码)
  19. SSM商家进销存网站系统
  20. solr group分组查询

热门文章

  1. CodeCombat代码全记录(Python学习利器)--边地森林(第二章)代码4
  2. UEFI安装Win10/Ubuntu16.04双系统记录
  3. C++的运算符重载 --http://blog.csdn.net/zgl_dm/article/details/1767201
  4. CentOS安装MySql和配置
  5. python 身份证识别器_基于Python的身份证验证识别和数据处理
  6. [龙讯2号]我用带有胡伟武签名的龙芯电脑
  7. workbench应力应变曲线_workbench ansys 每个时刻的应力应变变形云图 如何查看?
  8. MySQL 设置 创建时间 和 更新时间
  9. 将一坨很大数据保存为json,然后读取json。
  10. php读取西门子plc_西门子PLC读取/修改V90 PN参数