Rolf ツ Rolf ツ - 3 months ago 24
Android Question

Shrink Google Play Services library for use with Google Analytics only

Is it possible to remove unnecessary packages from the Google Play Services library so that the library will only contain everything needed for Google Analytics?

I'm asking this because the Google Play Services library is bloated with extra packages, images and resources of which I think are unused by Google Analytics.

Answer

Proguard removes unused code from jar files by default also from the Google Play Services library. But proguard cant be used to remove (unused) resources, but I have found that there are other options to further optimize the library.

I was able using method two to shrink an app from 1827 KB down to 1115 KB. I tested the app and it works fine and Google Analytics statics are appearing on the online dashboard as expected.


Method 1: Just include the google-play-services.jar file and ignore R warnings.

The first method is probably the most easy.

Step 1: Copy the google-play-services.jar file from the library project to your own project and past it in the libs folder.

Step 2: Remove the library reference to the original google-play-services_lib project from your project.

Right click on your project -> Properties -> Android -> Select library -> Remove

Step 3: Add dontwarn flags to your progruard settings file.

-dontwarn com.google.**.R
-dontwarn com.google.**.R$*

Explanation: The google-play-services-jar contains references to generated Java files (R.java). These files are normally generated when the google-play-services_lib project is being build. Proguard will normally warn you (By exiting with an error) that these files are missing when optimizing the google-play-services.jar file. By adding the dontwarn flags proguard will just ignore the fact that these files are missing and won't exit with an error.


Method 2: Create an optimized google-play-services(-analytics).jar

Method two is an more optimized version of method one. The difference is that instead of copying the google-play-services.jar file from the library project to your own project you first optimize the library using proguard.

So what you want to do is manually run proguard on just the google-play-services.jar file. For keeping just Google Analytics I used this proguard settings file.

-injars google-play-services.jar
-outjars google-play-services-analytics.jar

-libraryjars [add your path to sdk]/sdk/extras/android/support/v4/android-support-v4.jar
-libraryjars [add your path to sdk]/sdk/platforms/android-21/android.jar

-dontoptimize
-dontobfuscate
-dontwarn com.google.**.R
-dontwarn com.google.**.R$*
-dontnote

-keep public class com.google.android.gms.analytics.**, com.google.android.gms.common.**, com.google.android.gms.location.** {
    public protected *;
}

-keep class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    java.lang.String NULL;
}

Step 1: Copy the google-play-services.jar file from the library project to the sdk\tools\proguard\lib folder.

Step 2: Copy your proguard settings file to the sdk\tools\proguard\lib folder.

Step 3: Run progaurd with your settings file:

On windows: Open command window -> Navigate to the sdk\tools\proguard\lib folder -> Run proguard using:

java -jar proguard.jar @analytics-settings.txt

Step 4: Use the first method explained in this post to add the optimized google-play-services-analytics.jar to your project. (Don't forget Step 3 in the first method!)


Optimization results

Before + proguard = 1827 KB
Method 1 = 1206 KB
Method 2 = 1115 KB
Comments