Google Play services and DEX method limits
December 9th, 2014 | Published in Google Android
Posted by Laurence Moroney, Developer Advocate
A constraint for some Android apps is the total number of methods that the underlying compiled .dex file can support. It’s limited by 16 bits, or 65,536 values.
When you include third-party libraries in your application, you will have all of their methods in your .dex file. Larger APIs, such as those included in Google Play services, will then begin eating into the limit very quickly.
You can learn more about this, and ways that you can work around it with the Android Studio 1.0 build system here.
Additionally, with Google Play services version 6.5 or later, it is possible for you to include Google Play services in your application using a number of smaller client libraries, so that only Google Play services APIs you use will get compiled into your .dex file, and therefore their methods won't count towards your method limit.
Prior to version 6.5, you would typically have a line like this in your build.gradle file:
compile 'com.google.android.gms:play-services:6.5.87'
Starting with version 6.5, of Google Play services, you’ll be able to pick from a number of individual APIs, and you can see which ones have their own include files in the documentation. For example, if all you want to use is Maps, you would instead have:
compile 'com.google.android.gms:play-services-maps:6.5.87'
Note that this will transitively include the ‘base’ libraries, which are used across all APIs. You can include them independently with the following line:
compile 'com.google.android.gms:play-services-base:6.5.87'
The complete list of API names is below. More details can be found on the Android Developer site.
com.google.android.gms:play-services-base:6.5.87
com.google.android.gms:play-services-ads:6.5.87
com.google.android.gms:play-services-appindexing:6.5.87
com.google.android.gms:play-services-maps:6.5.87
com.google.android.gms:play-services-location:6.5.87
com.google.android.gms:play-services-fitness:6.5.87
com.google.android.gms:play-services-panorama:6.5.87
com.google.android.gms:play-services-drive:6.5.87
com.google.android.gms:play-services-games:6.5.87
com.google.android.gms:play-services-wallet:6.5.87
com.google.android.gms:play-services-identity:6.5.87
com.google.android.gms:play-services-cast:6.5.87
com.google.android.gms:play-services-plus:6.5.87
com.google.android.gms:play-services-appstate:6.5.87
com.google.android.gms:play-services-wearable:6.5.87
com.google.android.gms:play-services-all-wear:6.5.87
Note: At the time of writing, the correct version to use is 6.5.87. As this is a very granular number, it will get updated quite quickly, so be sure the check the latest version when you are coding. Often people will use a ‘+’ to denote versions, such as 6.5.+ to use the latest 6.5 build. However, it’s typically discouraged to use a ‘+’ as it can lead to inconsistencies.
Also, there are some changes to the names of the libraries that will impact you if you build applications for Android Wear. Previously you may have used play-services-wearable
to include the entire Google Play services library for your wearable, and if you want to continue doing so, you should now use play-services-all-wear
instead. You can continue to use play-services-wearable
which will instead give you just the Wearable Data Layer API (see here). Should you do this, and you want to continue working with other Google Play services features, such as the Location APIs on your wearable, you would need to add play-services-location
.
+Android Developers