How to shrink code - 65k method limit in dex How to shrink code - 65k method limit in dex android android

How to shrink code - 65k method limit in dex


It looks like Google has finally implementing a workaround/fix for surpassing the 65K method limit of dex files.

About the 65K Reference Limit

Android application (APK) files contain executable bytecode files in the form of Dalvik Executable (DEX) files, which contain the compiled code used to run your app. The Dalvik Executable specification limits the total number of methods that can be referenced within a single DEX file to 65,536, including Android framework methods, library methods, and methods in your own code. Getting past this limit requires that you configure your app build process to generate more than one DEX file, known as a multidex configuration.

Multidex support prior to Android 5.0

Versions of the platform prior to Android 5.0 use the Dalvik runtime for executing app code. By default, Dalvik limits apps to a single classes.dex bytecode file per APK. In order to get around this limitation, you can use the multidex support library, which becomes part of the primary DEX file of your app and then manages access to the additional DEX files and the code they contain.

Multidex support for Android 5.0 and higher

Android 5.0 and higher uses a runtime called ART which natively supports loading multiple dex files from application APK files. ART performs pre-compilation at application install time which scans for classes(..N).dex files and compiles them into a single .oat file for execution by the Android device. For more information on the Android 5.0 runtime, see Introducing ART.

See: Building Apps with Over 65K Methods


Multidex Support Library

This library provides support for building apps with multiple Dalvik Executable (DEX) files. Apps that reference more than 65536 methods are required to use multidex configurations. For more information about using multidex, see Building Apps with Over 65K Methods.

This library is located in the /extras/android/support/multidex/ directory after you download the Android Support Libraries. The library does not contain user interface resources. To include it in your application project, follow the instructions for Adding libraries without resources.

The Gradle build script dependency identifier for this library is as follows:

com.android.support:multidex:1.0.+ This dependency notation specifies the release version 1.0.0 or higher.


You should still avoid hitting the 65K method limit by actively using proguard and reviewing your dependencies.


you can use the multidex support library for that, To enable multidex

1) include it in dependencies:

dependencies {  ...  compile 'com.android.support:multidex:1.0.0'}

2) Enable it in your app:

defaultConfig {    ...    minSdkVersion 14    targetSdkVersion 21    ....    multiDexEnabled true}

3) if you have a application class for your app then Override the attachBaseContext method like this:

package ....;...import android.support.multidex.MultiDex;public class MyApplication extends Application {  ....   @Override   protected void attachBaseContext(Context context) {    super.attachBaseContext(context);    MultiDex.install(this);   }}

4) if you don't have a application class for your application then register android.support.multidex.MultiDexApplication as your application in your manifest file. like this:

<application    ...    android:name="android.support.multidex.MultiDexApplication">    ...</application>

and it should work fine!


Play Services 6.5+ helps:http://android-developers.blogspot.com/2014/12/google-play-services-and-dex-method.html

"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"

...

"this will transitively include the ‘base’ libraries, which are used across all APIs."

This is good news, for a simple game for example you probably only need the base, games and maybe drive.

"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