proguard
proguard copied to clipboard
ProGuard, Java optimizer and obfuscator
Quick Start • Features • Contributing • License
ProGuard is a free shrinker, optimizer, obfuscator, and preverifier for Java bytecode:
-
It detects and removes unused classes, fields, methods, and attributes.
-
It optimizes bytecode and removes unused instructions.
-
It renames the remaining classes, fields, and methods using short meaningless names.
The resulting applications and libraries are smaller, faster, and a bit better hardened against reverse engineering. ProGuard is very popular for Android development, but it also works for Java code in general.
❓ Getting Help
If you have usage or general questions please ask them in the Guardsquare Community.
Please use the issue tracker to report actual bugs 🐛, crashes, etc.
🚀 Quick Start
ProGuard has its own Gradle plugin, allowing you to shrink, optimize and obfuscate Android projects.
ProGuard Gradle Plugin
You can apply the ProGuard Gradle plugin in AGP 4+ projects by following these steps:
- Add a
classpath
dependency in your root levelbuild.gradle
file:
buildscript {
repositories {
google() // For the Android Gradle plugin.
mavenCentral() // For the ProGuard Gradle Plugin and anything else.
}
dependencies {
classpath 'com.android.tools.build:gradle:x.y.z' // The Android Gradle plugin.
classpath 'com.guardsquare:proguard-gradle:7.2.1' // The ProGuard Gradle plugin.
}
}
- Apply the
proguard
plugin after applying the Android Gradle plugin as shown below:
apply plugin: 'com.android.application'
apply plugin: 'com.guardsquare.proguard'
- ProGuard expects unobfuscated class files as input. Therefore, other obfuscators such as R8 have to be disabled.
android {
...
buildTypes {
release {
// Deactivate R8.
minifyEnabled false
}
}
}
- Configure variants to be processed with ProGuard using the
proguard
block:
android {
...
}
proguard {
configurations {
release {
defaultConfiguration 'proguard-android-optimize.txt'
configuration 'proguard-project.txt'
}
}
}
You can then build your application as usual:
gradle assembleRelease
The repository contains some sample configurations in the examples directory. Notably, examples/android has a small working Android project that applies the ProGuard Gradle plugin.
Integrated ProGuard (AGP < 7.0)
If you have an older Android Gradle project you can enable ProGuard instead of the default R8 compiler:
- Disable R8 in your
gradle.properties
:
android.enableR8=false
android.enableR8.libraries=false
- Override the default version of ProGuard with the most recent one in your
main
build.gradle
:
buildscript {
//...
configurations.all {
resolutionStrategy {
dependencySubstitution {
substitute module('net.sf.proguard:proguard-gradle') with module('com.guardsquare:proguard-gradle:7.2.1')
}
}
}
}
- Enable minification as usual in your
build.gradle
:
android {
//...
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
proguardFile 'proguard-project.txt'
}
}
}
- Add any necessary configuration to your
proguard-project.txt
.
You can then build your application as usual:
gradle assembleRelease
The repository contains some sample configurations in the examples directory. Notably, examples/android-agp3-agp4 has a small working Android project that uses the old integration.
✨ Features
ProGuard works like an advanced optimizing compiler, removing unused classes, fields, methods, and attributes, shortening identifiers, merging classes, inlining methods, propagating constants, removing unused parameters, etc.
-
The optimizations typically reduce the size of an application by anything between 20% and 90%. The reduction mostly depends on the size of external libraries that ProGuard can remove in whole or in part.
-
The optimizations may also improve the performance of the application, by up to 20%. For Java virtual machines on servers and desktops, the difference generally isn't noticeable. For the Dalvik virtual machine and ART on Android devices, the difference can be worth it.
-
ProGuard can also remove logging code, from applications and their libraries, without needing to change the source code — in fact, without needing the source code at all!
The manual pages (markdown, html) cover the features and usage of ProGuard in detail.
💻 Building ProGuard
Building ProGuard is easy - you'll just need a Java 8 JDK installed. To build from source, clone a copy of the ProGuard repository and run the following command:
./gradlew assemble
The artifacts will be generated in the lib
directory. You can then execute ProGuard using the
scripts in bin
, for example:
bin/proguard.sh
You can publish the artifacts to your local Maven repository using:
./gradlew publishToMavenLocal
🤝 Contributing
Contributions, issues and feature requests are welcome in both projects. Feel free to check the issues page and the contributing guide if you would like to contribute.
📝 License
Copyright (c) 2002-2022 Guardsquare NV. ProGuard is released under the GNU General Public License, version 2, with exceptions granted to a number of projects.