好久没有写博客了…元旦前赶紧写一篇吧…
这些日子琢磨了一下gradle。对比起maven确实在配置上灵活很多,对groovy的支持可以更容易的自定义任务。
由于最近的几个项目中都使用到了moco这个开源项目,它使用gradle管理,使用命令gradle uberjar可以生成一个独立运行包,这个包有8M大。我使用的环境比较特殊…8M有点大了,就琢磨这使用ProGuard给它瘦个身,效果不错,简单配置以后大小变成了4.6M,只有原来的57%了。
在配置的过程中遇到了很多难题,google之后都没有什么中文参考,故记录下了这次尝试,分享给大家。
ProGuard简介
ProGuard是一个压缩、优化和混淆Java 字节码文件的软件。它可以删除无用的类、字段、方法和属性。还可以删除没用的注释,优化 字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。
我最开始接触ProGuard是在Android的开发中,这个工具已经成为标配了。其实ProGuard一样可以用于一般的Java项目。它的主要功能有三块:压缩,优化,混淆。其中压缩是删除没有用到的类等,当你的项目使用到了大量开源库的时候这个功能尤其明显。这也是本文主要用到的功能。优化可以去除一些无用参数,还可以进行一些代码内联。混淆功能是将包名、类名、方法名等等用无意义的字符替换掉,可以增加反编译的难度,保护你的代码。混淆也可以减少包的大小,但是混淆后不利于调试。
ProGuard的配置
大部分的工具都有配置,如果你没有太大的需求,一般可以直接使用。而ProGuard的配置是不可缺少的,特别是刚刚接触这个工具的时候,我觉得这个配置完全是自己写不出来的,我是针对每一个用到的包去搜索复制相关配置。后面慢慢发现其实还好,了解了原理以后就可以自己配置了。
ProGuard会从你给出的入口点切入开始分析,一般是程序的main方法,如果某个类或者方法没有时候就会被去除。然而有时候程序中用到了某些类是通过配置文件或者反射等方法得到的,这种情况ProGuard可能就会误删。虽然目前ProGuard可以分析一些简单的情况,但是更多的时候还是需要自己配置。
在Gradle中使用ProGuard
ProGuard提供了Gradle插件,这样我们可以更方便的将ProGuard集成进来了。当前最新版是4.10。
这个插件的介绍页面我死活打不开了…主要的参考也是其他项目的配置。
先来看看如果在Gradle中生成一个独立包。这个包需要包含自身的源码、资源还有所有的第三方依赖。如果你的项目是一个多项目,那么你的独立包还应该其他需要的子项目,一般情况下配置如下:
task uberjar(type: Jar, dependsOn: jar) {
classifier ='standalone'
from files(sourceSets.main.output.classesDir)
from files(sourceSets.main.output.resourcesDir)
fromconfigurations.runtime.asFileTree.files.collect { zipTree(it) }
manifest {
attributes'Main-Class': YOUR MAINCLASS,


































