Android поддерживает реализацию библиотеки multidex

Я достиг волшебного предела dex, потому что мое приложение использует много jar-файлов (драйв API, greendao, текст в pdf, поддержка...).

Мое текущее решение заключалось в том, что я буквально создал второй apk только для диска Google, который я вызвал из основного apk. Но теперь я узнал, что Android, наконец, поддерживает это с этой библиотекой. Моя проблема в том, что я не знаю, как это реализовать (желательно без градиента). Я не могу найти хорошие учебники для него.

Хорошо, я схожу с ума, пытаясь реализовать это... Я нашел это

И я добавил:

 android:name="android.support.multidex.MultiDexApplication"

В мой файл манифеста и

protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
}

К моему mainactivity.java

Также установил плагин gradle для eclipse, экспортировал gradle, чтобы получить файл build.gradle, который я изменил на:

apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':android-support-v7-appcompat')
    compile project(':Sync')
    compile project(':gdrive:google-play-services_lib')
}


android {
    compileSdkVersion 14
    buildToolsVersion "21.1.1"


    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src-gen','src']
            resources.srcDirs = ['src-gen','src']
            aidl.srcDirs = ['src-gen','src']
            renderscript.srcDirs = ['src-gen','src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    dexOptions {
      preDexLibraries = false
   }
}

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

Но ошибка все та же :(


person Tadej Vengust    schedule 14.11.2014    source источник


Ответы (4)


Блог был старым решением.

С Android Studio 0.9.2 и плагином Gradle 0.14.1 вам нужно всего лишь:

  1. Добавьте в AndroidManifest.xml:

.

android:name="android.support.multidex.MultiDexApplication" 

or

Добавлять

MultiDex.install(this);

в методе attachBaseContext вашего пользовательского приложения

или расширение пользовательского приложения MultiDexApplication

  1. добавьте multiDexEnabled = true в свой build.gradle

.

android {
    defaultConfig {
        ...
        multiDexEnabled = true
    }
}

Готово.

Извините за мой плохой английский

Связанные ресурсы:

http://developer.android.com/tools/building/multidex.html

https://plus.google.com/+XavierDucrohet/posts/1FnzwdcBnyC

person darktiny    schedule 14.11.2014
comment
Могу ли я сделать это в eclipse, а не в студии Android? - person Tadej Vengust; 14.11.2014
comment
В данный момент нет. плагин ADT для Eclipse больше не находится в активной разработке. - person darktiny; 14.11.2014

Есть несколько вещей, которые вы должны сделать,

1- В вашем градле вам нужно указать multidex и добавить библиотеку поддержки:

android {
    defaultConfig {
        ...
        multiDexEnabled true
        ...
    }
}

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

2- В вашем манифесте вы должны настроить свое приложение на приложение multidex:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.package.name">
    <application
        ...
        android:name="com.package.name.my_application">
        ...
    </application>
</manifest>

3.1- В вашем классе приложения вы должны либо расширить MultiDexApplication:

public class my_application extends MultiDexApplication
{
    ...
}

3.2- Или переопределите метод attachBaseContext():

public class my_application extends Application
{
    protected void attachBaseContext(Context base)
    {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

Ограничения библиотеки поддержки multidex

Библиотека поддержки multidex имеет некоторые известные ограничения, о которых вы должны знать и проверять при включении ее в конфигурацию сборки вашего приложения:

  • Установка файлов .dex во время запуска в раздел данных устройства сложна и может привести к ошибкам «Приложение не отвечает» (ANR), если вторичные файлы dex велики. В этом случае вам следует применить методы сокращения кода с помощью ProGuard, чтобы минимизировать размер файлов dex и удалить неиспользуемые части кода.
  • Приложения, использующие multidex, могут не запускаться на устройствах с более ранними версиями платформы, чем Android 4.0 (уровень API 14), из-за ошибки Dalvik linearAlloc (ошибка 22586). Если вы ориентируетесь на уровни API ниже 14, обязательно выполните тестирование с этими версиями платформы, так как ваше приложение может иметь проблемы при запуске или при загрузке определенных групп классов. Сокращение кода может уменьшить или, возможно, устранить эти потенциальные проблемы.
  • Приложения, использующие конфигурацию multidex, которые делают очень большие запросы на выделение памяти, могут аварийно завершать работу во время выполнения из-за ограничения Dalvik linearAlloc (ошибка 78035). Предел выделения был увеличен в Android 4.0 (уровень API 14), но приложения могут по-прежнему работать с этим ограничением в версиях Android до Android 5.0 (уровень API 21).
  • Существуют сложные требования относительно того, какие классы необходимы в основном файле dex при выполнении в среде выполнения Dalvik. Обновления инструментов сборки Android отвечают требованиям Android, но возможно, что другие включенные библиотеки имеют дополнительные требования к зависимостям, включая использование самоанализа или вызов методов Java из собственного кода. Некоторые библиотеки нельзя будет использовать, пока инструменты сборки multidex не будут обновлены, чтобы вы могли указать классы, которые должны быть включены в основной файл dex.

ресурсы: http://developer.android.com/tools/building/multidex.html

person Nicolas Tyler    schedule 19.01.2015
comment
Можно ли это сделать в eclipse или только в студии Android? - person Tadej Vengust; 19.01.2015
comment
потому что мой проект составляет 40 000 строк + и включает в себя несколько библиотек, таких как greenDAO, у меня большие проблемы с переходом на студию Android, поэтому я хотел бы сделать это в eclipse, но у меня было много проблем с этим. Знаете ли вы, что решение для этого - затмение? - person Tadej Vengust; 20.01.2015
comment
Я безуспешно пытался сделать это 3 дня, и, поскольку я делаю это на деньги компании, я просто не могу тратить на это больше времени. Если у вас есть решение, как это сделать в eclipse, я был бы очень признателен. - person Tadej Vengust; 20.01.2015
comment
Step 1, Download android studio. Шаг 2. Создайте новый проект в студии Android с тем же именем пакета. Step 3, copy all the classes and resources from the eclipse project folder into the android studio. Шаг 4, нажмите кнопку запуска. - person Nicolas Tyler; 20.01.2015
comment
Давайте продолжим обсуждение в чате. - person Tadej Vengust; 20.01.2015
comment
здесь (developer.android.com/intl/ja/ tools/support-library/), в нем говорится, что вы должны добавить библиотеку multidex в свой gradle. Это не говорит о том, что вы должны добавить Multidex.install(this), как показано Николасом. Было бы полезно, если бы документация Android Dev добавила эту информацию :-) Спасибо, Николя, за указание на это. - person Christine; 28.07.2015
comment
Eclipse это не IDE, это просто текстовый редактор. я перехожу с eclipse на android studio, когда отказываюсь от +65K id. не теряйте время. просто мигрируй. - person Adnan Abdollah Zaki; 12.12.2015

Согласно документам на странице https://developer.android.com/studio/build/multidex.html#avoid

Если у вас minSdkVersion 21 и выше, все, что вам нужно сделать, это

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

если у вас minSdkVersion 20 или ниже, вам нужно использовать библиотеку поддержки

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

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

Вместе с

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>
person Sanket Berde    schedule 24.05.2017

Обновить:

если вы используете androidX, вы можете использовать это:

implementation 'androidx.multidex:multidex:2.0.1'

ссылка на все google maven, где можно искать артефакты google:
https://maven.google.com/web/index.html

person Mohammad Desouky    schedule 06.04.2020