Як уже було сказано, у вас є занадто багато методів (більше 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 .
Оновлення : Оскільки Бібліотека підтримки 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
своєму Manifest Android:
Або додайте це до свого Application.java
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
або скористайтеся наданою програмою від lili 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