Hello Readers, CoolMonkTechie heartily welcomes you in A Short Note Series (R8 vs Proguard In Android).
In this note series, we will understand about R8 vs Proguard in Android. Google released R8 as a replacement of Proguard to help developers shrink the code with the better-generated output (APK). They are considered much faster compared to Proguard.
So Let’s begin.
What is R8?
R8 is a tool that converts our java byte code into an optimized dex code. It iterates through the whole application and then it optimizes like removing unused classes, methods, etc. and runs on the compile time. It helps us to reduce the size of the build and to make our app to be more secure. R8 uses Proguard rules to modify its default behavior.
How does R8 shrinking work?
While optimizing the code, R8 reduces the code of our application, and then APK size is reduced.
To reduce the APK size, we have three different techniques:
- Shrinking or Tree Shaking: Shrinking is the process of removal of unreachable code from our Android project. R8 performs some static analysis to get rid of unreachable code and removes the un-instantiated object.
- Optimization: This is used to optimize the code for size. It involves dead code removal, unused argument removal, selective in-lining, class merging, etc.
- Identifier Renaming: In this process, we obfuscate the class name and other variable names. For example, if the name of the class is “MainActivity“, then it will be obfuscated to “a” or something else but smaller in size.
How to enable R8 Shrinking in our app?
R8 is present by default in our application but to enable R8 shrinking in our application, set the minifyEnabled
to true
in our app’s main build.gradle
file.
android {
...
buildTypes {
release {
minifyEnabled true
}
}
}
R8 vs Proguard
So, let’s now compare both R8 and Proguard both and see how it fares,
- With the Android app using Gradle plugin above 3.4.0 or more the project uses R8 by default and no longer uses the Proguard to perform optimizations. But, it uses Proguard rules only.
- R8 inlines the container classes and removes unused class, fields, and methods. Proguard reduces the app size by 8.5% and compared to R8 which reduces the code by 10%.
- R8 has more Kotlin support compared to Proguard.
- R8 gives better outputs than Proguard, and to do so faster than Proguard does, reducing overall build time.
So, let’s now compare how both Proguard and R8 performs.
Proguard
While using Proguard, it converts the Applications code to Java byte-code by the Java compiler. After the conversion, it is then optimized by Proguard using the rules which we have written. Then dex converts it to optimized Dalvik byte code.
This is roughly a 4 step process to convert it to Dalvik byte-code.
R8
While using R8, first the app’s code is converted to Java byte-code by the java compiler and then using R8 directly, it converts the java byte-code in Dalvik byte-code.
By using R8, it directly reduces the steps of conversion of Java byte-code to Dalvik Byte-code from 2 to 1.
- Proguard applies 520 peephole optimizations compared to R8, which is very less. Peephole optimizations are the optimizations that are performed on a set of compiler-generated code to improve the performance of the code by making it shorter and faster.
- In both Proguard and R8, we have to handle the reflection by writing the custom configuration.
- R8 is faster compared to Proguard in the execution of converting the code.
Optimization Comparison between Proguard and R8
Let us discuss a few features supported by both Proguard and R8.
For example, Proguard and R8 both make the methods private in the code. Both of them also remove unused class, fields, or even methods in the project are not in use. Both of them support the simplification of Enum types. They both inline methods, merge codes, etc.
Proguard also makes the classes final whereas R8 cannot do it. But comparing R8, which is highly supported by Kotlin, optimizes the Kotlin construct which is not possible with Proguard.
Now, If you also want to enable aggressive optimization in R8 and reduce the size more, enable the following in gradle.properties.
android.enableR8.fullMode=true
Conclusion
In this note series, we understood about R8 vs Proguard in Android. We have also discussed R8 and Proguard process and optimization differences. With R8 coming as a default compile-time optimizer, it reduces the size of the app.
Thanks for reading! I hope you enjoyed and learned about R8 vs Proguard in Android. Reading is one thing, but the only way to master it is to do it yourself.
Please follow and subscribe us on this blog and support us in any way possible. Also like and share the article with others for spread valuable knowledge.
You can find Other articles of CoolmonkTechie as below link :
You can also follow official website and tutorials of Android as below links :
If you have any comments, questions, or think I missed something, feel free to leave them below in the comment box.
Thanks again Reading. HAPPY READING !!???
Hey I am so happy I found your blog page, I really found you by accident,
while I was browsing on Bing for something else, Anyhow
I am here now and would just like to say thanks for a incredible post and
a all round thrilling blog (I also love the
theme/design), I don’t have time to read through it all at the
moment but I have saved it and also added in your RSS feeds, so when I have time I will be back to
read more, Please do keep up the superb work.
Thank you so much, I really appreciate hearing that from you.