Количество ссылок на методы в файле .dex не может превышать 64k API 17
Я создаю приложение с помощью библиотеки SugarORM, но когда я пытаюсь построить проект для API 17 (не проверял другие), он показывает ошибку сборки.
Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console
Но когда я строю этот проект для Android v5.0 или выше, он работает нормально. Если я удаляю зависимость от SugarORM gradle, она отлично работает для обоих устройств v4.2.2 и v5.0.
Ответы
Ответ 1
У тебя слишком много методов. Для dex может быть только 65536 методов..
Как и предполагалось, вы можете использовать мультидекс поддержку.
Просто добавьте эти строки в module/build.gradle
:
android {
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
Также в свой Manifest
добавьте класс MultiDexApplication
из библиотеки поддержки multidex в элемент приложения
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
<!--If you are using your own custom Application class then extend -->
<!--MultiDexApplication and change above line as-->
android:name=".YourCustomApplicationClass">
...
</application>
</manifest>
переопределить метод attachBaseContext
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
MultiDex.install(this);
}
Если вы используете свой собственный класс Application
, измените родительский класс с Application
на MultiDexApplication
.
Другое решение состоит в том, чтобы попытаться удалить неиспользуемый код с помощью ProGuard. Настройте параметры ProGuard для своего приложения для запуска ProGuard и убедитесь, что у вас включено сжатие для сборок выпусков.
Ответ 2
В android/app/build.gradle
android {
compileSdkVersion 23
buildToolsVersion '23.0.0'
defaultConfig {
applicationId "com.dkm.example"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
Поместите это в ваш defaultConfig:
multiDexEnabled true
меня устраивает
Ответ 3
Я получил это сообщение об ошибке, потому что, кодируя мою версию автоматического обновления моего проекта в моем файле build.gradle
:
android {
...
buildToolsVersion "23.0.2"
...
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0' }
Решите его, исправив версию:
android {
...
buildToolsVersion "23.0.2"
...
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
}
Ответ 4
Это то, что сработало для меня:
Это происходит потому, что слишком много неиспользуемых методов.
Большинство из этих методов поступают из встроенных библиотек в файл build.gradle
Используйте minify и shrink resources, чтобы исправить это с помощью gradle и очистить свой код одновременно.
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled true
shrinkResources true
}
}
Ответ 5
Эта ошибка также может возникать при загрузке всех сервисов google play, когда вы используете их только.
Как указано google: "В версиях сервисов Google Play до 6.5 вам пришлось скомпилировать весь пакет API в ваше приложение. В некоторых случаях это затрудняло сохранение количества методов в вашем приложении приложение (включая интерфейсные API, библиотечные методы и собственный код) под лимитом 65 536.
В версии 6.5 вы можете выборочно компилировать API-интерфейс сервисов Google Play в свое приложение.
Например, когда вашему приложению нужны карты игровых сервисов, расположение игровых сервисов. Вам нужно добавить только два apis в файле build.gradle на уровне приложения, как показано ниже:
compile 'com.google.android.gms:play-services-maps:10.2.1'
compile 'com.google.android.gms:play-services-location:10.2.1'
Вместо:
compile 'com.google.android.gms:play-services:10.2.1'
Для полной документации и списка сервисов google play нажмите здесь
Ответ 6
Я столкнулся с одной и той же проблемой и для поддержки multidex, вы должны иметь в виду minSdkVersion вашего приложения. Если вы используете minSdkVersion 21 или выше, просто напишите multiDexEnabled true, как этот
defaultConfig {
applicationId *******************
minSdkVersion 21
targetSdkVersion 24
versionCode 1
versionName "1.0"
multiDexEnabled true
}
Он работает для меня, и если вы используете minSdkVersion ниже 21 (ниже lolipop), вам нужно сделать две лишние простые вещи
1. Сначала добавьте эту зависимость
compile 'com.android.support:multidex:1.0.1'
в файле build.gradle.
2. Последний и второй добавить одну нижеприведенную строку в ваше приложение в манифесте
Android: name= "android.support.multidex.MultiDexApplication"
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:name="android.support.multidex.MultiDexApplication"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Бинго, тогда он будет работать и в нижней версии..:)
Счастливое кодирование
Ответ 7
Когда ссылки на приложения превышают 65 536 методов, вы сталкиваетесь с ошибкой сборки, которая указывает на то, что ваше приложение достигло предела архитектуры сборки Android
Поддержка Multidex до Android 5.0
Версии платформы до Android 5.0 (уровень API 21) используют среду выполнения Dalvik для выполнения кода приложения. По умолчанию Dalvik ограничивает приложения одним файлом байт-кода classes.dex для каждого APK. Чтобы обойти это ограничение, вы можете добавить библиотеку поддержки multidex в ваш проект:
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
Поддержка Multidex для Android 5.0 и выше
Android 5.0 (уровень API 21) и выше использует среду выполнения, называемую ART, которая изначально поддерживает загрузку нескольких файлов DEX из файлов APK. Поэтому, если ваш minSdkVersion 21 или выше, вам не нужна библиотека поддержки multidex.
Избегайте ограничения в 64К
- Удалите неиспользуемый код с помощью ProGuard - включите сжатие кода
Настроить мультидекс в приложении для
Если ваш minSdkVersion установлен на 21 или выше, все, что вам нужно сделать, это установить для multiDexEnabled значение true в файле build.gradle уровня модуля.
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
}
...
}
если ваш minSdkVersion установлен на 20 или ниже, вы должны использовать библиотеку поддержки multidex
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.3'
}
Переопределите класс Application, измените его для расширения MultiDexApplication (если возможно) следующим образом:
public class MyApplication extends MultiDexApplication { ... }
добавить в файл манифеста
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="MyApplication" >
...
</application>
</manifest>
Ответ 8
Для меня Обновление Gradle works.Look для обновления на Android-сайте
затем добавьте его в свой build.gradle(Project), как этот
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0-alpha4'
....
}
затем синхронизировать проект с файлом Gradle, и иногда это может произойти из-за java.exe(в моем случае) просто принудийте kill java.exe из диспетчера задач в Windows, а затем запустите программу
Ответ 9
Можно также попробовать следующее:
android{
.
.
// to avoid DexIndexOverflowException
dexOptions {
jumboMode true
}
}
Надеюсь, это поможет кому-то. Благодаря
Ответ 10
Поддержка Multidex до Android 5.0
Версии платформы до Android 5.0 (API уровня 21) используют рабочую среду Dalvik для выполнения кода приложения. По умолчанию Dalvik ограничивает приложения одним файлом байт-кода classes.dex для APK. Чтобы обойти это ограничение, прочитайте, пожалуйста, настройте свое приложение для multidex
Поддержка Multidex для Android 5.0 и выше
Android 5.0 (API-уровень 21) и выше использует среду выполнения, называемую ART, которая поддерживает загрузку нескольких файлов DEX из файлов APK. ART выполняет предварительную компиляцию на время установки приложения, которое сканирует файлы classesN.dex и компилирует их в один файл.oat для исполнения устройством Android. Поэтому, если ваш minSdkVersion равен 21 или выше, вам не нужна библиотека поддержки multidex. Все, что вам нужно сделать, это установить multiDexEnabled в true на уровне модуля build.gradle
Подробнее здесь - https://developer.android.com/studio/build/multidex
Ответ 11
Просто дополнительный комментарий, прежде чем добавлять поддержку multidex - убедитесь, что вы не добавляете ненужные зависимости.
Например, В официальном руководстве по аналитике в Facebook
В них четко указано, что вы должны добавить следующую зависимость:
implementation 'com.facebook.android:facebook-android-sdk:[4,5)'
который фактически является целым FacebookSDK - поэтому, если вам нужна, например, только аналитика, вам нужно заменить ее на:
implementation 'com.facebook.android:facebook-core:5.+'
Параметры частичного SDK Facebook
Ответ 12
для пользователя-флаттера это можно решить с помощью build.gradle уровня приложения
изменить ниже
android {
compileSdkVersion 23
buildToolsVersion '23.0.0'
defaultConfig {
applicationId "com.dkm.example"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
это сработало для меня.
Ответ 13
вы можете включить "Instant Run" в Android Studio, чтобы получить поддержку multidex.
Ответ 14
Сделайте это, он работает:
defaultConfig {
applicationId "com.example.maps"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
multiDexEnabled true
}