Как уже говорилось, у вас слишком много методов (более 65 КБ) в вашем проекте и библиотеках.
Предотвратите проблему: сократите количество методов с помощью Play Services 6.5+ и support-v4 24.2+
Поскольку часто сервисы Google Play являются одними из главных подозреваемых в "трате зря" с его 20 тыс. + методы. Сервисы 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 для приложений с дополнительными чем 65к методов):
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.
<?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
person
Patrick Favre
schedule
19.02.2015
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
, что вы не вызываете эту функцию, если она недоступна? - person rekire   schedule 04.03.2013