What kind of optimizations does ProGuard support?
Apart from removing unused classes, fields, and methods in the shrinking step, ProGuard can also perform optimizations at the bytecode level, inside and across methods. Thanks to techniques like control flow analysis, data flow analysis, partial evaluation, static single assignment, global value numbering, and liveness analysis, ProGuard can: • Evaluate constant expressions. • Remove unnecessary field accesses and method calls. • Remove unnecessary branches. • Remove unnecessary comparisons and instanceof tests. • Remove unused code blocks. • Merge identical code blocks. • Reduce variable allocation. • Remove write-only fields and unused method parameters. • Inline constant fields, method parameters, and return values. • Inline methods that are short or only called once. • Simplify tail recursion calls. • Merge classes and interfaces. • Make methods private, static, and final when possible. • Make classes static and final when possible. • Replace interfaces that have single implementat