Как уже говорилось, у вас слишком много методов (более 65 тыс.) В вашем проекте и библиотеках.
Предотвратите проблему: уменьшите количество методов с помощью Play Services 6.5+ и support-v4 24.2+
Поскольку сервисы Google Play часто являются одними из основных подозреваемых в «потере» методов с помощью методов 20k + . Сервисы Google Play версии 6.5 или выше, вы можете включить сервисы Google Play в свое приложение, используя несколько небольших клиентских библиотек. Например, если вам нужны только GCM и карты, вы можете использовать только эти зависимости:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
Полный список библиотек и их обязанности можно найти в официальном документе Google .
Обновление : начиная с версии Support Library v4 v24.2.0 она была разделена на следующие модули:
support-compat
, support-core-utils
, support-core-ui
, support-media-compat
Иsupport-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
Обратите внимание, однако, что если вы используете support-fragment
, он будет зависеть от всех других модулей (т. Е. Если вы используете, android.support.v4.app.Fragment
нет никакой выгоды)
Смотрите здесь официальные заметки о выпуске для support-v4 lib
Включить MultiDexing
С Lollipop (он же инструменты для сборки 21+) с ним очень легко работать. Подход заключается в том, чтобы обойти проблему 65k методов на файл dex, чтобы создать несколько файлов dex для вашего приложения. Добавьте следующее в ваш файл сборки Gradle ( это взято из официального документа Google по приложениям с более чем 65k методами ):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
Второй шаг - либо подготовить класс приложения, либо, если вы не расширяете приложение, используйте его MultiDexApplication
в своем манифесте Android:
Либо добавьте это в ваш Application.java
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
или используйте предоставленное приложение от Mutlidex lib
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
Предотвратить OutOfMemory с MultiDex
В качестве дальнейшего совета, если вы столкнетесь с OutOfMemory
исключениями на этапе сборки, вы можете увеличить кучу с помощью
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
что бы установить кучу до 4 гигабайт.
Смотрите этот вопрос для более подробной информации о проблеме памяти кучи dex.
Проанализируйте источник проблемы
Для анализа источника методов плагин gradle https://github.com/KeepSafe/dexcount-gradle-plugin может помочь в сочетании с деревом зависимостей, предоставляемым gradle, например:
.\gradlew app:dependencies
Смотрите этот ответ и вопрос для получения дополнительной информации о методе подсчета в Android