`
1025250620
  • 浏览: 225636 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Proguard源码分析(四) 压缩

 
阅读更多

上一次我们讲了seed文件,这次我们说压缩,对应的输出文件是usage,可以通过命令-printusage usage.txt来配置

压缩的目的是为了删除一些我们不使用的类和方法,从而达到字节码压缩的目的。

这里我贴出我的微博:http://weibo.com/1752090185/profile?rightmod=1&wvr=5&mod=personinfo

有意向可以加我。

直接切入主题吧,压缩是用Shrinker来实现的压缩功能,看过我之前的分析,应该对这种写法并不陌生,这种写法我还没有发现它不好的地方,姑且我们就默认这种写法吧。

一样我们找execute方法。我不知道大家对访问者模式和装饰器模式是否已经有了比较深刻的了解,Proguard里面大量使用了这两种模式,访问者的目的是将业务的实现移交给访问者,这样保持被访问者的高度扩展性,当然设计模式这种东西在不同的场景下可能呈现不同的概念功能,我不想多做深究。而对于装饰器的话就像你吃巧克力,必须脱了外面的装饰才能吃到里面的巧克力,在面向方面,安全性验证方面,装饰器模式发挥着重要的作用。慢慢体会吧。

programClassPool.classesAccept(new ClassCleaner());
libraryClassPool.classesAccept(new ClassCleaner());

代码刚上来和前文一样,先做了初始化操作,其次定义了

UsageMarker usageMarker 这个对象,我们跟一下它的实现

public void visitProgramClass(ProgramClass programClass)
    {
        if (shouldBeMarkedAsUsed(programClass))
        {
            // Mark this class.
            markAsUsed(programClass);

            markProgramClassBody(programClass);
        }
    }

其实功能很简单就是将这个类和它的超类标记为used,好回到刚才

之后又定义一个对象,

ClassVisitor classUsageMarker =
            new MultiClassVisitor(new ClassVisitor[]
            {
                usageMarker,
                new NamedMethodVisitor(ClassConstants.INTERNAL_METHOD_NAME_INIT,
                                       ClassConstants.INTERNAL_METHOD_TYPE_INIT,
                                       usageMarker)
            });

NamedMethodVisitor 的目的是为了让表示为name的签名类型的方法执行visitor操作,

这里的visitor就是usageMarker。

这个对象很明显是为了保持住构造器方法。

接下来又是我们的老朋友:

ClassPoolVisitor classPoolvisitor =
            ClassSpecificationVisitorFactory.createClassPoolVisitor(configuration.keep,
                                                                    classUsageMarker,
                                                                    usageMarker,
                                                                    true,
                                                                    false,
                                                                    false);

ClassSpecificationVisitorFactory通过keep条件列表来生成池访问者共类池访问,createClassPoolVisitor方法中会定义个复合的访问者,这个访问者的目的是加入了正则匹配认证,当然这个正则可能不大准确,就是Proguard本身的一套规则.主要实现类是ListParser和new ClassNameParser()

匹配的细节我们有时间再讨论,这个解析器将解析类似:

"!*.test.*",“**.test.*”这类的类通配表达式。

也就是相当于在usageMarker外加了一层解析器验证.

接下来

programClassPool.classesAccept(new InterfaceUsageMarker(usageMarker));

这个目的是比如你的类实现某个接口,那么你既然不压缩这个类,自然不能压缩这个类所实现的接口。

programClassPool.classesAccept(
            new UsedClassFilter(usageMarker,
            new AllAttributeVisitor(true,
            new MultiAttributeVisitor(new AttributeVisitor[]
            {
                new InnerUsageMarker(usageMarker),
                new AnnotationUsageMarker(usageMarker),
                new SignatureUsageMarker(usageMarker),
                new LocalVariableTypeUsageMarker(usageMarker)
            }))));

这个和上面就完全一致了,要保持住你的内部类,注解,签名,和变量类型等等。

if (configuration.printUsage != null)
        {
            PrintStream ps =
                configuration.printUsage == Configuration.STD_OUT ? System.out :
                    new PrintStream(
                    new BufferedOutputStream(
                    new FileOutputStream(configuration.printUsage)));

            // Print out items that will be removed.
            programClassPool.classesAcceptAlphabetically(
                new UsagePrinter(usageMarker, true, ps));

            if (ps == System.out)
            {
                ps.flush();
            }
            else
            {
                ps.close();
            }
        }

这段代码很明显是为了打印出文件,如果你没有配置configuration.printUsage的话,那么就不会走这些。

 

 

 

 

0
0
分享到:
评论

相关推荐

    newProguard

    找到proguard源码中proguard\src\proguard\classfile\ClassConstants.java类,然后修改ATTR_StackMapTable的值,将原来的的StackMapTable改为dummy. 然后重新ant打包proguard,使用新的proguard来混淆就不会出现...

    解决proguard混淆报错-Proguard5.1

    解决方案:找到proguard源码中proguard\src\proguard\classfile\ClassConstants.java类,然后修改ATTR_StackMapTable的值,将原来的的StackMapTable改为dummy.然后重新ant打包proguard。资源已经处理(源码+proguard...

    java混淆器ProGuard4.7

    ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、...

    重新打包的Proguard

    找到proguard源码中proguard\src\proguard\classfile\ClassConstants.java类,然后修改ATTR_StackMapTable的值,将原来的的StackMapTable改为dummy. 然后重新ant打包proguard,使用新的proguard来混淆就不会出现上面...

    java 源码加密 混淆 proguard 配置文件

    java 源码加密 混淆,proguard 配置文件,很详细,经测试可以用

    Proguard 免费的class文件压缩、优化和混淆

    该工具解压后,点击目录下bat文件,即可对java的class文件进行压缩,优化,混淆器

    proguard最新版本proguard6.0.13

    proguard6.0.13最新版本的资源。proguard6.0.13最新版本的资源。

    proguard 6.2.2魔改版

    proguard 6.2.2的魔改版本用于混淆app、jar、class等,将所有a,b,c等等的字符改成不可见字符,从而提高安全性。里面包括源码和编译好的jar包。编译源码使用core/build.sh,编译好的jar包在lib目录下。android app...

    java代码混淆工具proguard5.2

    ProGuard是一款免费的Java类文件压缩器、优化器和混淆器。它能发现并删除无用类、字段(field)、方法和属性值(attribute)。它也能优化字节码并删除无用的指令。最后,它使用简单无意义的名字来重命名你的类名、...

    proguard-proguard6.2.2.zip

    1.支持ant 使用proguard标签 2.支持windows环境混淆代码 3.支持Java8+ 新版本6x系列不再提供编译好的jar包 需要自己手动编译,7系列使用的gradle编译管理 国内不太好用,6x系列基本满足Java8+ 的代码混淆,具体可以...

    Eclipse+ProGuard配置

    Eclipse+ProGuard配置 Eclipse+ProGuard配置

    proguard6.2.2.rar

    资源是proguard6.2.2版本,里面附上了中文的使用教程,一看就懂,非常简单,不懂的可以私信问我。

    proguard4.8

    ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、...

    Java代码混淆工具 Proguard4.10(官方免费下载)

    5、混淆只是 proguard 功能之一,其它还有压缩、优化等 6、proguard混淆首先得根据自己工程具体情况 来决定,哪些类需要混淆,哪些 类不能混淆,对包名、类名、方法名、参数名、变量名等其它信息 如何处理 可以...

    ProGuard-java混淆加密

    ProGuard能够对Java类中的代码进行压缩(Shrink),优化(Optimize),混淆(Obfuscate),预检(Preveirfy)。  1. 压缩(Shrink):在压缩处理这一步中,用于检测和删除没有使用的类,字段,方法和属性。  2. 优化...

    ProGuard_java_proguard_

    This ProGuard used to obfuscate Java source code.

    proguard 混淆 demo

    混淆了四天,亲测可用,建议先从网上浏览proguard用法,特别是四步骤中混淆那一步,最重要,及验证是否能够省略

    proguard6.4.rar

    proguard6.4.rar

    proguard4.9 全

    ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、...

    Proguard5.2.1 资源 使用教程

    java代码混洗工具 proGuard 最新Proguard5.2.1混淆器,以及ProGuard使用教程

Global site tag (gtag.js) - Google Analytics