How can I use the `--multi-dex` option?
Asked Answered
M

6

7
[2013-11-13 18:39:09 - XlApp] Dx 
trouble writing output: Too many method references: 66024; max is 65536.
You may try using --multi-dex option.
References by package:
    13 java.lang
     1 java.lang.reflect
     5 java.util
     1 javax.xml.namespace
    66 org.apache.xmlbeans
    19 org.apache.xmlbeans.impl.values
     1 org.apache.xmlbeans.impl.xb.xmlschema
  2500 org.openxmlformats.schemas.drawingml.x2006.chart
  1430 org.openxmlformats.schemas.drawingml.x2006.chart.impl
  8767 org.openxmlformats.schemas.drawingml.x2006.main
  5258 org.openxmlformats.schemas.drawingml.x2006.main.impl
    86 org.openxmlformats.schemas.drawingml.x2006.picture
    33 org.openxmlformats.schemas.drawingml.x2006.picture.impl
   745 org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing
   417 org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.impl
   230 org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing
   164 org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.impl
   298 org.openxmlformats.schemas.officeDocument.x2006.customProperties
   256 org.openxmlformats.schemas.officeDocument.x2006.customProperties.impl
   617 org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes
   596 org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.impl
   285 org.openxmlformats.schemas.officeDocument.x2006.extendedProperties
   196 org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.impl
    23 org.openxmlformats.schemas.officeDocument.x2006.math
    24 org.openxmlformats.schemas.officeDocument.x2006.relationships
     2 org.openxmlformats.schemas.officeDocument.x2006.relationships.impl
  2076 org.openxmlformats.schemas.presentationml.x2006.main
  1224 org.openxmlformats.schemas.presentationml.x2006.main.impl
     1 org.openxmlformats.schemas.schemaLibrary.x2006.main
  7271 org.openxmlformats.schemas.spreadsheetml.x2006.main
  4556 org.openxmlformats.schemas.spreadsheetml.x2006.main.impl
 11448 org.openxmlformats.schemas.wordprocessingml.x2006.main
  9217 org.openxmlformats.schemas.wordprocessingml.x2006.main.impl
     4 schemaorg_apache_xmlbeans.system.sE130CAA0A01A7CDE5A2B4FEB8B311707
  1170 schemasMicrosoftComOfficeExcel
  1223 schemasMicrosoftComOfficeExcel.impl
   285 schemasMicrosoftComOfficeOffice
   124 schemasMicrosoftComOfficeOffice.impl
     2 schemasMicrosoftComOfficePowerpoint
     3 schemasMicrosoftComOfficeWord
  2858 schemasMicrosoftComVml
  2529 schemasMicrosoftComVml.impl
[2013-11-13 18:39:09 - XlApp] Conversion to Dalvik format failed with error 2

I am getting this error when I included 5 external .jar files in my android project. I have no idea what to do. Please help me out anyone!!!

I thought of doing what is suggested in this You may try using --multi-dex option

But I could not find method of using this option anywhere.

Metamorphose answered 13/11, 2013 at 13:37 Comment(3)
My question is a little bit different. What I am asking is how to use --multi-dex optionMetamorphose
If you're using Gradle, this should get you going.Curable
For ANT, see #27903559Overgrowth
H
7

If you are using Gradle/Android Studio, you can add this to your gradle configuration:

android {
....
   dexOptions {
    preDexLibraries = false
   }
}

afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = []
        }
        dx.additionalParameters += '--multi-dex'

        // this is optional
        // dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
    }
}

Then you need to add the multidex support library jar, located in sdk/extras/android/support/multidex/library/libs. And install it either by extending your application from MultiDexApplication, or calling Multidex.install() from your application's attachBaseContext method.

For more details look at this blogpost: http://blog.osom.info/2014/10/multi-dex-to-rescue-from-infamous-65536.html

UPDATE:

Here https://developer.android.com/tools/building/multidex.html you can find the official way to use multidex with Gradle.

Basically you need to change your gradle file like this:

android {
   compileSdkVersion 21
   buildToolsVersion "21.1.0"

   defaultConfig {
       ...
       minSdkVersion 14
       targetSdkVersion 21
       ...

       // Enabling multidex support.
       multiDexEnabled true
   }
   ...
}

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

And set your Application class to android.support.multidex.MultiDexApplication or if you already have an Application class you can override the attachBaseContext() method and call MultiDex.install(this) to enable multidex.

Highroad answered 21/10, 2014 at 15:15 Comment(1)
For ANT, see #27903559Overgrowth
S
3

Update: You can now find detailed instructions how to configure multi dex at the following page: https://developer.android.com/tools/building/multidex.html

Simple answer is that the currently the Android Studio tools do not allow you to specify the options for generating multiple dex files (--multi-dex). So you would need to script your build process by hand ... a real pain.

There are a couple of Android bugs which look relevant: 63936 and 20814

Succory answered 20/1, 2014 at 10:46 Comment(0)
T
1

From the javadoc documentation:

usage:
  dx --dex [--debug] [--verbose] [--positions=<style>] [--no-locals]
    [--no-optimize] [--statistics] [--[no-]optimize-list=<file>] [--no-strict]
    [--keep-classes] [--output=<file>] [--dump-to=<file>] [--dump-width=<n>]
    [--dump-method=<name>[*]] [--verbose-dump] [--no-files] [--core-library]
    [--num-threads=<n>] [--incremental] [--force-jumbo]
    [--multi-dex [--main-dex-list=<file> [--minimal-main-dex]]
    [<file>.class | <file>.{zip,jar,apk} | <directory>] ...
     Convert a set of classfiles into a dex file, optionally embedded in a
     jar/zip. Output name must end with one of: .dex .jar .zip .apk or be a directory.
     Positions options: none, important, lines.\n
    --multi-dex: allows to generate several dex files if needed. This option is
      exclusive with --incremental, causes --num-threads to be ignored and only
      supports folder or archive output.
    --main-dex-list=<file>: <file> is a list of class file names, classes defined by
      those class files are put in classes.dex.
    --minimal-main-dex: only classes selected by --main-dex-list are to be put in
      the main dex.

dx is a tool that used on dexing as part of android build process. In the build.xml (located at sdk.dir/tools/ant/buildxml) which used for default android build, it is used as part of target name="-dex", declared within macro dex-helper. It have outdated Anttask which still doesn't support --multi-dex.

From the dexer source code, --main-dex-list options receive file input which have all class file that you wanted to be in main dex, separated with new line. Like this:

bin/classes/com/example/MainActivity.class

Every other classes not declared in this list will go to secondary dex.

Or you can use the old way before --multi-dex introduced: http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html

Titmouse answered 2/2, 2014 at 21:57 Comment(0)
S
0

Right now, I edit

.../sdk/build-tools/19.0.3/dx

replacing the last line:

exec java $javaOpts -jar "$jarpath" --multi-dex "$@"

It's a hack. It's not maintainable. Probably your CI administrator will hate you...

BUT IT'S WORKING!

Southworth answered 14/5, 2014 at 8:14 Comment(3)
I got the error: --multi-dex supports only archive or directory output I had to change the output file from 'classes.dex' to 'classes.zip'. I wonder if the apkbuilder can use the zip file...Jung
Hi @VinceStyling. I think this is too old to be good. There is official multi-dex support now. Check this out developer.android.com/tools/building/multidex.html CheersSouthworth
to be honest, I did this, eventually, I found we can't be a part on IDEA's packaging, it's too sad.Waikiki
R
0

As you know you have to modify build.xml a little bit which is located in tools if using ant build. you change output property from an archive to a directory (i.e $project/bin) and dx step will be done successfully. It may be so, but ant-tasks.jar and sdklib.jar are required to modify to complete 'apkbuilder' step.

  • ApkBuilder, ApkBuilderTask classes
Riccio answered 6/11, 2014 at 4:49 Comment(0)
M
0

If anyone stumbles here after all this time, you can check the libraries you are adding. Generally this error:
trouble writing output: Too many method references: 66024; max is 65536. comes when you add a lot of libraries. One example that I have seen too many times is when you want to add a particular google-play service like google-play-analytics, you add whole google-play library. Try adding specific library. This will solve your problem.

Metamorphose answered 26/1, 2016 at 10:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.