Implementing ProGuard in Open Event Orga App
In the Open Event Orga App there has been an issue with the size of the app. So to decrease the size of the app, we had to enable Proguard. By implementing proguard the size of the app has reduced from 5.9 Mb to 2.9 Mb. The following article shows the steps taken to implement Proguard.
- Firstly the following parameters need to set to true in the the app level build.gradle file.
release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ |
The built-in shrinker in minify enabled removes the dead code. It doesn’t obfuscate or optimizes the code. In this section of code, we also set the proguard-rules.pro file in which all the rules regarding code obfuscation are set. The file is a custom file unlike the default proguard-android.txt file which is already a part of Android Studio.
- Now we head over to the proguard-rules.pro file. But first we need to understand the 2 most important terms –dontwarn and –keep class.
2.1 -dontwarn → When proguard is implemented, code obfuscation takes place and the name of the classes get shortened to single letters. Because of this there might be a few conflicts. But there might be some unresolved references in the obfuscated code. dontwarn ignores all these references.
2.2 –keep class → Suppose there are certain classes which shouldn’t be obfuscated then they are preceded with keep class annotation.
- In the proguard-rules.pro file the following lines are added
# Platform calls Class.forName on types which do not exist on Android to determine platform. –dontnote retrofit2.Platform # Platform used when running on Java 8 VMs. Will not be used at runtime. –dontwarn retrofit2.Platform$Java8 # Retain generic type information for use by reflection by converters and adapters. –keepattributes Signature # Retain declared checked exceptions for use by a Proxy instance. –keepattributes Exceptions |
The keepattributes annotation is basically used for Generics which are JAVA JDK 5 and higher. It basically prevents the code from obfuscation.
- Now Retrofit classes also need to be obfuscated. For that we add the following lines of code. The obfuscation considerably reduces the size of the app.
-dontwarn okio.** -dontwarn com.squareup.okhttp.** |
- The model classes need to be prevented from getting obfuscated or else it may lead to app crash. Hence these classes need to be kept and so we add the following lines of code to prevent app crash. The link for the PR which fixed the app crash cause due to buggy proguard rule.
–keep class org.fossasia.openevent.app.data.** { *; } |
- The orga app uses the Jackson library for parsing JSON data. Proguard rules also needs to be applied for this library.
# Jackson –keepattributes *Annotation*,EnclosingMethod,Signature –keepnames class com.fasterxml.jackson.** { *; } –dontwarn com.fasterxml.jackson.databind.** –keep class org.codehaus.** { *; } -keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility { public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; } –keep class com.github.jasminb.** { *; } |
- The other libraries used in the app also have specific proguard rules. These are listed below.
# General –keepattributes SourceFile,LineNumberTable,*Annotation*,EnclosingMethod,Signature,Exceptions,InnerClasses –keep class android.support.v7.widget.SearchView { *; } –keep class com.github.mikephil.charting.** { *; } G –keep public class * extends com.bumptech.glide.module.AppGlideModule –keep class com.bumptech.glide.GeneratedAppGlideModuleImpl |
References:
- Medium article by Jon Finerty https://medium.com/@jonfinerty/beginner-to-proguard-b3327ff3a831
Official Developer documentation https://developer.android.com/studio/build/shrink-code