问题
[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.
回答1:
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.
回答2:
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
回答3:
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
回答4:
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!
回答5:
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
回答6:
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.
来源:https://stackoverflow.com/questions/19955297/how-can-i-use-the-multi-dex-option