ProGuard obfuscates Java and Android programs by renaming classes, fields, and methods using meaningless names (an implementation of security through obscurity), making it more difficult to reverse-engineer the final application.4
Besides removing unused instructions from the compiled bytecode, ProGuard optimizes it using techniques such as control flow analysis, data-flow analysis, partial evaluation, static single assignment, global value numbering, and liveness analysis.5
ProGuard can remove many types of unused and duplicated code, perform over 200 peephole optimizations, reduce variable allocation, inline constant and short methods, simplify tail recursion calls, remove logging code, amongst others.6
"ProGuard overview (official page)". February 2, 2015. Retrieved November 24, 2015. http://proguard.sourceforge.net/index.html ↩
"ProGuard license page". February 2, 2015. Retrieved November 24, 2015. http://proguard.sourceforge.net/license.html ↩
"Shrink your code and resources". Retrieved June 10, 2018. https://developer.android.com/studio/build/shrink-code ↩
"ProGuard FAQ". February 2, 2015. Archived from the original on October 28, 2016. Retrieved November 24, 2015. https://web.archive.org/web/20161028095555/http://proguard.sourceforge.net/FAQ.html ↩