`
473687880
  • 浏览: 535832 次
文章分类
社区版块
存档分类
最新评论

proguard学习

 
阅读更多

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中调用的方法

动态引用的fieldsmethods

这时,便会出现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_java_proguard_

    2. **examples**:这个目录可能包含了示例配置文件和用法说明,供用户参考和学习。 3. **wtk**:可能包含了Java Wireless Toolkit (WTK)的相关库,用于支持JME应用的混淆。 4. **ant**:Ant任务定义,允许通过Apache...

    proguard6.2.2.rar

    ProGuard 是一款强大的Java字节码混淆、优化、压缩和预校验工具,常用于Android应用开发中的代码保护。...这份"proguard6.2.2.rar"资源,结合中文教程,为开发者提供了学习和实践ProGuard的良好平台。

    修改Proguard混淆规则,自定义字符集

    通过实践和学习,你可以更好地理解和掌握Proguard,使其在项目中发挥出应有的作用。 总的来说,修改Proguard混淆规则和自定义字符集是Android开发中的重要技巧。正确设置混淆规则可以保证代码的安全性,同时避免...

    proguard4.11 混淆工具

    ProGuard是一款广泛使用的Java字节码混淆、优化和压缩工具,尤其在Android开发中起着至关重要的作用。...虽然现在的版本已经更新,但对于理解混淆原理和实践,ProGuard 4.11仍然是一个很好的学习起点。

    Proguard最新版6.0.3

    对于初学者,可以通过提供的链接(https://blog.csdn.net/Cjava_math/article/details/80663331)学习如何使用ProGuard 6.0.3。教程通常会涵盖基本的配置、混淆规则设置以及如何集成到构建流程中。 **8. 更新与兼容...

    proguard4.0

    提供的文档和社区支持也使得学习和掌握ProGuard变得相对容易。 总而言之,ProGuard 4.0是Java开发中不可或缺的安全和优化工具,它通过混淆、shrinking和优化代码,确保了应用的安全性和效率。配合Eclipse的使用,...

    proguard_v5.2.1_jdk1.8.zip

    `src`目录下存放了ProGuard的源代码,对于希望了解其内部工作原理或者想要对ProGuard进行定制的开发者来说,这是一个宝贵的学习资源。 总的来说,ProGuard_v5.2.1_jdk1.8.zip是一个完整的ProGuard工具包,适用于...

    混淆加密 proguard 5.3.3

    - 配置文件的编写需要一定的学习和实践,不正确的设置可能导致编译失败或运行时错误。 总之,ProGuard 5.3.3 是一个强大的工具,它为Java和Android开发者提供了有效的代码保护和优化手段。正确地使用它可以显著提高...

    springboot工程(单个maven工程)利用proguard实现代码混淆 java demo案例

    在Java开发中,尤其是对于发布到生产环境的项目,代码安全性和性能优化是至关重要的环节。Spring Boot作为Java领域广泛使用...通过学习这个案例,你可以了解到如何在实际项目中应用ProGuard,提升代码的安全性和性能。

    Android混淆 各个版本proguard文件

    在Android应用开发中,安全性和性能优化是至关重要的环节,其中混淆(Proguard)就是一种常用的工具,用于保护代码安全并减小程序...在实际开发中,开发者应持续学习和适应混淆工具的最新发展,以保持应用的最佳状态。

    proguard4.9

    这些资源对于学习和使用ProGuard 4.9版本非常有帮助,可以深入了解其功能和用法。 总之,ProGuard是Java开发中的重要工具,它通过混淆、优化和压缩代码来提高应用程序的安全性和性能。正确地配置和使用ProGuard,...

    proguard-elder-dictionary, 一份饱含敬意的 proguard 字典..zip

    开发者可以通过解压文件并查阅文档来学习如何有效地利用这份资源。为了最大化保护和优化你的应用,理解 ProGuard 原理和配置字典的使用方法至关重要。 总之,"proguard-elder-dictionary" 是一个宝贵的资源,为 ...

    android proguard

    在Android开发中,ProGuard是一个强大的代码混淆、优化和压缩工具。它被广泛应用于发布APK时,以保护代码安全、减小程序体积并提高运行...在实际开发中,持续学习和掌握混淆技术,对于提升应用的安全性和性能至关重要。

    proguard混淆器

    `proguard-base-5.2.1-sources.jar` 是ProGuard 5.2.1版本的源码包,开发者可以通过查看源码了解其内部工作原理,学习如何配置和使用ProGuard。 `proguard-base-5.2.1.jar` 是ProGuard 5.2.1的二进制库文件,包含了...

    proguard4.5beta4.tar.zip

    ProGuard 4.5beta4是该工具的一个较早版本,虽然现在已经有更新的版本,但这个版本仍具有一定的学习和参考价值。 在描述中提到的"proguard4.5beta4.tar"表明这是一个归档文件,使用了tar格式打包。tar是一种常见的...

    java代码混淆器proGuard

    学习ProGuard的相关知识,可以参考其官方文档、各种在线教程和Stack Overflow上的问答,以掌握混淆规则的编写和混淆问题的解决。 总的来说,ProGuard是Java开发中不可或缺的工具,它在保护代码安全、优化性能方面...

    proguard_better.rar

    总之,`proguard_better.rar`这个压缩包旨在帮助开发者更好地理解和应对ProGuard混淆过程中可能出现的问题,通过学习和实践这些资料,可以提升混淆技巧,确保应用在混淆后的稳定性和安全性。在实际项目中,正确配置...

    proguard4.5.zip

    总之,“proguard4.5.zip”是一个包含了ProGuard工具的完整发行版,它提供了丰富的文档、示例和源代码,方便用户学习、配置和使用这个强大的代码保护工具。无论你是移动应用开发者还是Java软件工程师,了解并掌握...

Global site tag (gtag.js) - Google Analytics