Как я могу использовать опцию `--multi-dex`?
[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
Я получаю эту ошибку, когда я включил 5 внешних файлов.jar в свой проект Android. Я понятия не имею, что делать. Пожалуйста, помогите мне кто-нибудь!
Я думал о том, чтобы делать то, что предлагается в этом. Вы можете попробовать использовать опцию --multi-dex.
Но я нигде не мог найти способ использования этой опции.
6 ответов
Если вы используете Gradle/Android Studio, вы можете добавить это в свою конфигурацию Gradle:
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()
}
}
Затем вам нужно добавить jar библиотеки поддержки multidex, расположенный в sdk/extras/android/support/multidex/library/libs
, И установите его либо, расширив свое приложение от MultiDexApplication
или звонит Multidex.install()
из вашего приложения attachBaseContext
метод.
Для получения более подробной информации смотрите этот блог: http://blog.osom.info/2014/10/multi-dex-to-rescue-from-infamous-65536.html
ОБНОВИТЬ:
Здесь https://developer.android.com/tools/building/multidex.html вы можете найти официальный способ использования мультидекса с Gradle.
В основном вам нужно изменить свой файл Gradle следующим образом:
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'
}
И установите для своего класса Application значение android.support.multidex.MultiDexApplication или, если у вас уже есть класс Application, вы можете переопределить метод attachBaseContext() и вызвать MultiDex.install(this), чтобы включить multidex.
Обновление. Теперь вы можете найти подробные инструкции по настройке мультидекса на следующей странице: https://developer.android.com/tools/building/multidex.html
Простой ответ заключается в том, что в настоящее время инструменты Android Studio не позволяют указывать параметры для создания нескольких файлов dex (--multi-dex). Таким образом, вам нужно будет написать сценарий процесса сборки вручную... настоящая боль.
Есть пара ошибок Android, которые выглядят актуально: 63936 и 20814
Из документации Javadoc:
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
это инструмент, который используется на dexing как часть процесса сборки Android. в build.xml
(расположен в sdk.dir/tools/ant/buildxml
), который используется для сборки Android по умолчанию, он используется как часть target name="-dex"
, объявленный в макросе dex-helper
, Он устарел Anttask, который до сих пор не поддерживает --multi-dex.
От dexer
Исходный код, опции --main-dex-list получают входной файл, в котором есть все файлы классов, которые вы хотели бы видеть в главном dex, отделенные новой строкой. Как это:
bin/classes/com/example/MainActivity.class
Все остальные классы, не объявленные в этом списке, перейдут на вторичный dex.
Или вы можете использовать старый способ до введения --multi-dex: http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html
Как вы знаете, вам нужно немного изменить build.xml, который находится в инструментах, если вы используете ant build. вы изменяете выходное свойство из архива в каталог (то есть $ project / bin), и шаг dx будет выполнен успешно. Это может быть так, но ant-tasks.jar и sdklib.jar необходимо изменить, чтобы завершить этап 'apkbuilder'.
- Классы ApkBuilder, ApkBuilderTask
Щас редактирую
.../sdk/build-tools/19.0.3/dx
заменив последнюю строку:
exec java $javaOpts -jar "$jarpath" --multi-dex "$@"
Это хак. Это не ремонтопригодно. Возможно, ваш администратор CI будет ненавидеть вас...
НО ЭТО РАБОТАЕТ!
Если кто-то споткнется здесь после всего этого времени, вы можете проверить библиотеки, которые вы добавляете. Вообще эта ошибка: trouble writing output: Too many method references: 66024; max is 65536.
приходит, когда вы добавляете много библиотек. Один пример, который я видел слишком много раз, - когда вы хотите добавить определенный сервис google-play, такой как google-play-analytics, вы добавляете целую библиотеку google-play. Попробуйте добавить конкретную библиотеку. Это решит вашу проблему.