`
1025250620
  • 浏览: 229988 次
  • 性别: 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
分享到:
评论

相关推荐

    Proguard最新版6.0.3

    **ProGuard**是一款广泛使用的Java代码混淆、优化和压缩工具,尤其在Android开发中被大量应用,用于保护应用程序源码安全、减小程序体积并提高运行效率。标题提及的"Proguard最新版6.0.3"是ProGuard的一个更新版本,...

    proguard使用

    混淆可能导致运行时错误,因此在测试阶段,可以开启 ProGuard 的日志记录,以便于分析问题。添加以下规则: ```properties -printmapping mapping.txt # 输出映射文件 -verbose # 输出详细日志 ``` 映射文件 `...

    proguard混淆器

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

    【android开发】混淆打包proguard模板

    ProGuard是一款强大的Java字节码混淆、优化、预校验和分析工具,它可以为我们的Android项目提供必要的保护,防止恶意逆向工程分析。本文将深入探讨"【android开发】混淆打包proguard模板"的相关知识点。 一、...

    混淆压缩

    在Java和Android开发中,常见的混淆工具是ProGuard,它可以自动混淆、优化、压缩和预校验Java字节码。开发者可以通过配置ProGuard的规则文件来指定哪些代码需要混淆,哪些需要保留。在JavaScript开发中,UglifyJS和...

    Android 新浪微博客户端源码.rar

    通过学习和分析这个源码,开发者不仅可以提升Android编程技巧,还能了解到如何构建一个功能完备、性能良好的社交应用。对于想要深入理解Android平台的开发者来说,这是一份不可多得的学习资料。

    appRTCDemo工程源码

    在【压缩包子文件的文件名称列表】中提到了"androidapp",这可能是指压缩包中的主要目录,包含了整个Android应用程序的源代码、资源文件、构建脚本等。在这个目录下,我们可以期待找到以下关键组成部分: 1. **src*...

    android客户端乐淘网源码

    通过分析这个源码,我们可以深入理解Android客户端开发中的各种技术和最佳实践。 1. **Activity管理**: - Android应用的基本单元是Activity,乐淘客户端源码中必定包含多个Activity,分别对应不同的界面,如商品...

    Camera2 系统源码

    源码分析: 1. **proguard.flags**:这个文件通常包含了ProGuard的配置规则,用于在构建过程中混淆、优化和压缩代码,以提高应用的安全性和性能。在Camera2项目中,可能包含了一些特定的类或方法需要保留,因为它们...

    安卓Android源码——捕鱼达人源代码.zip

    通过分析和学习这个源码,开发者可以了解到如何在Android平台上构建一个完整的游戏应用,包括游戏逻辑、用户界面设计、数据管理、动画效果等方面的知识。 【标签】"android 源码 安卓" 明确了该源码的主要技术领域...

    viva手机杂志开发源码

    源码中可能包含了性能调优的实践,例如使用ProGuard进行代码混淆,或者通过分析工具如Traceview和Systrace找出并优化瓶颈。 10. **版本管理和发布流程**:了解源码的构建过程,如何使用Gradle进行依赖管理和打包,...

    secondary-dex-gradle-源码.rar

    6. **源码分析** 在解压后的`secondary-dex-gradle-源码.zip`文件中,我们可以看到Gradle插件的源代码,包括`DexArchiveBuilderTask`、`DexArchiveMerger`等相关类。通过阅读这些源码,可以深入了解Dex分包、合并和...

    Freegemas.zip

    【标签】虽然没有明确的标签,但我们可以根据内容推测这可能与Android开发、Java编程、源码分析、移动应用开发等相关。 【文件列表详解】 1. `proguard.cfg`:这是Android项目中的ProGuard配置文件,用于混淆、...

    Android 淘宝客户端源码.

    源码中还包含了性能优化的实践,如代码混淆、资源压缩、ProGuard规则设置等,以减小APK体积,提高应用启动速度和运行效率。 十、安全性与隐私保护 为了保护用户数据的安全,源码中会涉及HTTPS通信、数据加密、权限...

    安卓Android源码——精典源码之查询工具源代码.zip

    ProGuard是Android开发中的一个代码混淆、优化和压缩工具,可以减小APK的大小,保护代码安全,防止反编译。在发布应用时,通常会启用ProGuard以提高应用的安全性和效率。 2. **.classpath**:这是Eclipse或Android ...

    Email程序源码.zip

    【标题】"Email程序源码.zip" 是一个包含Android平台上电子邮件应用程序源代码的压缩文件,主要功能似乎是实现发送邮件。 【描述】这个Email程序源码专为Android设备设计,核心功能集中在邮件的发送上。虽然描述中...

    安卓Android源码——LumaQQ- qq 代码.zip

    本篇文章将聚焦于LumaQQ这款应用的源码分析,它是一款基于Android平台的QQ客户端,旨在提供更加流畅、个性化的用户体验。 1. **安卓系统基础** 安卓系统是Google主导的开源移动操作系统,采用Linux内核,支持多种...

    邮件箱源码

    1. **proguard.cfg**:这是一个ProGuard配置文件,用于混淆、优化和压缩Java字节码,以提高代码的安全性和性能,防止反编译。 2. **.classpath**:这是Eclipse或类似的Java IDE中的一个配置文件,定义了项目的类...

    单机斗地主安卓源码

    5. `proguard-project.txt`:ProGuard配置文件,用于混淆和优化代码,防止反编译和保护版权。 6. `AndroidManifest.xml`:这是Android应用的核心元数据文件,定义了应用的组件、权限、版本信息以及所需的硬件和软件...

    Android应用源码之查询工具源代码.zip

    首先,"proguard.cfg"文件是ProGuard配置文件,它用于在构建过程中对Java代码进行混淆、优化和压缩,以提高应用的安全性和减少体积。开发者可以在此文件中定义规则,避免关键类和方法被混淆,同时移除无用代码。 "....

Global site tag (gtag.js) - Google Analytics