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

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()".

分享到:
评论

相关推荐

    proguard4.7代码混淆器使用详细说明(自撰)

    自己写的proguard4.7代码混淆器使用详细说明,之前在网上找了一大堆都还是不会用,或不全,研究了一天,终于达到自己想要的结果,在此总结下,写成文档,一边以后需要,也供大家学习学习,工具包就不上传了,网上一...

    proguard 混淆类

    提供了混淆文件中相关的混淆代码,便于学习

    learning_gradle_android:学习如何构建启用 gradle 的 android 项目

    learning_gradle_android 学习如何构建启用 gradle 的 android 项目01_basic:将简单的 eclpise 项目转换为启用 gradle 的项目02_dependency:支持库项目03_sign:支持apk签名机制04_proguard:在gradle中使用...

    基于Spring Boot和Vue的校园社团管理系统前后端分离设计源码

    项目共包含177个文件,其中编译后的Class文件56个,Java源代码文件55个,Vue组件文件15个,XML配置文件11个,JavaScript文件7个,Git忽略配置文件3个,项目配置文件2个,Markdown文档2个,以及Proguard混淆配置文件2...

    搭建Android Studio开发环境

    • 优点:同样支持ProGuard工具和应用签名。 • 缺点:不过,目前版本的Android Studio不能在同一窗口中管理多个项目。每个项目都会打开一个新窗口。我猜这是借鉴了Intellij IDEA的行为,而且Google近期不会对此做出...

    eclipseme.feature_1.6.0_site.zip——eclipse的J2ME插件

    3. 解压proguard3.7.zip到某个目录下 4. 解压eclipsesdk_win32.zip(绿色程序)到一个目录,不要这时就打开eclipse,先解压eclipse汉化包,到 该目录下,否则会导致只有部分内容被汉化 5. 运行eclipse,配置自己...

    Android学习系列教程实例.pdf

    Android 学习文档总结 ................... 1 DevDiv 推荐资源 ........................ 2 Windows 8 ........................................................... 2 iOS .........................................

    基于android平台的学生选课系统的设计与实现-带文档和源码.zip

    高校选课系统利用计算机和各种网络终端设备完成课程管理,便于增强学生选课的自主性,提高学生的学习积极性,提高学校的教学管理质量和教学效益,本研究即是基于Android平台,设计的一款学生在线学科应用。...

    tengge手机端j2me编程教程完整版

    本套资料工具非常适合在手机上学习、开发j2me应用。具体包括: 1.8本官方j2me编程类库参考,可以使用uc浏览器查看。 2.tengge手机端j2me教程,80多节,内含示例程序、做好的软件和效果图片。 3.手机端j2me编译...

    使 Kotlin 进行 Android 开发教程

    占⽤:Kotlin 具有⾮常紧凑的运⾏时库,可以通过使⽤ ProGuard 进⼀步减少。在实际应⽤程序中,Kotlin 运⾏时 只增加百个法以及 .apk 件 不到 100K 。 编译时⻓:Kotlin ⽀持⾼效的增量编译,所以对于 清理构建会有...

    Kotlin 语⾔⽂档

    — 占⽤:Kotlin 具有⾮常紧凑的运⾏时库,可以通过使⽤ ProGuard 进⼀步减少。在实际应⽤程序中,Kotlin 运⾏时只增加⼏百个⽅法以及 .apk ⽂件 不到 100K ⼤⼩。 — 编译时⻓:Kotlin ⽀持⾼效的增量编译,所以...

    procexp64、进程管理工具

    procexp64怎样用,rocex64是一款进程管理工具。可以方便的对进程进行结束,挂起,新建等操作。十分方便,而且适合于初学者对进程的查看和学习。

    A J2ME game demo by The Old Game Factory-开源

    这个游戏演示是一个学习J2ME基础知识和一些图形技巧的工具。 它使用Ant脚本进行与代码相关的操作和分发管理。 它还很好地利用了出色的Java工具(Antic,ProGuard,MPowerPlayer)。

    DeDroid:Android应用的名称混淆处理

    关于许多Android应用程序都被诸如ProGuard和DexGuard之类的混淆工具最小化,例如,将有意义的标识符替换为简短的无意义符号,这使得直接理解代码变得困难。 DeDroid旨在使用机器学习来恢复缩小的标识符。

    eoe客户端源代码

    ├ proguard-project.txt └ project.properties 1、src目录 src目录用于存放工程的包及java源码文件。 下面是src目录的子目录: src ├ cn.eoe.app --存放程序全局性类的包 ├ cn.eoe.app.adapter --存放适配器的...

    Android帮助文档及一些资料打包放送

    新浪微博布局学习——活用RelativeLayout - 农民伯伯 - 博客园.mht453.32 KB Android 3.0 r1 API中文文档(113) ——SlidingDrawer .html116.92 KB Android 3.1 r1 中文API文档 (120) —— SearchView .html91.16 KB ...

Global site tag (gtag.js) - Google Analytics