ProGuard 是一个免费的 Java 字节码压缩、优化、混淆和预校验工具:
- 它可以检测并移除未使用的类、字段、方法和属性。
- 它可以优化字节码并移除未使用的指令。
- 它可以使用简短的无意义名称重命名剩余的类、字段和方法。
经过处理的应用程序和库文件更小、运行更快。
❓ 获取帮助
如果您有使用或一般问题,请在 Guardsquare 社区中提问。
请使用问题追踪器来报告实际的错误 🐛、崩溃等问题。
🚀 快速开始
命令行
首先,从 GitHub releases 下载最新版本。
在 Linux/MacOS 上运行 ProGuard,只需输入:
bin/proguard.sh <选项...>
在 Windows 上:
bin\proguard.bat <选项...>
通常,您会将大多数选项放在配置文件中(比如 myconfig.pro
),然后只需调用:
bin/proguard.sh @myconfig.pro
在 Windows 上:
bin\proguard.bat @myconfig.pro
所有可用选项都在手册的配置部分中有描述。
Gradle 任务
ProGuard 可以作为 Gradle 中的一个任务运行。在使用 proguard 任务之前,您需要确保 Gradle 在构建时能在其类路径中找到它。一种方法是在 build.gradle
文件中添加以下行,这将从 Maven Central 下载 ProGuard:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.guardsquare:proguard-gradle:7.5.0'
}
}
然后您可以定义一个带有配置的任务:
tasks.register('proguard', ProGuardTask) {
configuration file('proguard.pro')
injars(tasks.named('jar', Jar).flatMap { it.archiveFile })
// 自动处理此构建的 Java 版本。
if (System.getProperty('java.version').startsWith('1.')) {
// Java 9 之前,运行时类被打包在一个单独的 jar 文件中。
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
} else {
// 从 Java 9 开始,运行时类被打包在模块化的 jmod 文件中。
libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class'
//libraryjars "${System.getProperty('java.home')}/jmods/....."
}
verbose
outjars(layout.buildDirectory.file("libs/${baseCoordinates}-minified.jar"))
}
嵌入式配置与标准 ProGuard 配置非常相似。您可以在 Gradle 设置页面上找到更多详细信息。
✨ 特性
ProGuard 的工作原理类似于高级优化编译器,它可以移除未使用的类、字段、方法和属性,缩短标识符,合并类,内联方法,传播常量,移除未使用的参数等。
-
这些优化通常可以将应用程序的大小减小 20% 到 90%。减小的程度主要取决于 ProGuard 可以全部或部分移除的外部库的大小。
-
这些优化还可能提高应用程序的性能,最多可提升 20%。对于服务器和桌面上的 Java 虚拟机来说,差异通常不明显。
-
ProGuard 还可以移除应用程序及其库中的日志代码,而无需更改源代码 —— 实际上,甚至不需要源代码!
手册页面(markdown,html)详细介绍了 ProGuard 的特性和用法。
💻 构建 ProGuard
构建 ProGuard 很简单 —— 您只需安装 Java 8 JDK。 要从源代码构建,请克隆一份 ProGuard 仓库的副本,然后运行以下命令:
./gradlew assemble
生成的构件将位于 lib
目录中。然后您可以使用 bin
中的脚本执行 ProGuard,例如:
bin/proguard.sh
您可以使用以下命令将构件发布到本地 Maven 仓库:
./gradlew publishToMavenLocal
🤝 贡献
我们欢迎对这两个项目提出贡献、问题和功能请求。 如果您想贡献,请随时查看问题页面和贡献指南。
📝 许可证
版权所有 (c) 2002-2023 Guardsquare NV。 ProGuard 根据 GNU 通用公共许可证第 2 版发布,并为一些项目授予例外。