Как я могу использовать опцию `--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. Попробуйте добавить конкретную библиотеку. Это решит вашу проблему.

Другие вопросы по тегам