Jak już wspomniano, masz zbyt wiele metod (ponad 65 000) w swoim projekcie i bibliotekach.
Zapobiegaj problemowi: zmniejsz liczbę metod dzięki Play Services 6.5+ i support-v4 24.2+
Ponieważ często usługi Google Play są jednym z głównych podejrzanych w „marnowaniu” metod za pomocą metod 20k + . Usługi Google Play w wersji 6.5 lub nowszej, możesz włączyć usługi Google Play do swojej aplikacji przy użyciu kilku mniejszych bibliotek klienckich. Na przykład, jeśli potrzebujesz tylko GCM i map, możesz użyć tylko tych zależności:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
Pełna lista podbibliotek i ich obowiązków znajduje się w oficjalnym dokumencie Google .
Aktualizacja : Od czasu Support Library v4 v24.2.0 został podzielony na następujące moduły:
support-compat
, support-core-utils
, support-core-ui
, support-media-compat
Isupport-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
Pamiętaj jednak, że jeśli użyjesz support-fragment
, będzie to zależało od wszystkich innych modułów (tj. Jeśli użyjeszandroid.support.v4.app.Fragment
nie ma korzyści)
Zobacz tutaj oficjalne informacje o wydaniu lib support-v4
Włącz MultiDexing
Ponieważ Lollipop (inaczej narzędzia do kompilacji 21+) jest bardzo łatwy w obsłudze. Podejście polega na obejściu 65 000 metod na problem z plikiem dex, aby utworzyć wiele plików dex dla aplikacji. Dodaj następujące elementy do pliku kompilacji stopni ( jest to wzięte z oficjalnego dokumentu Google w aplikacjach z ponad 65k metodami ):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
Drugim krokiem jest przygotowanie klasy aplikacji lub jeśli nie rozszerzysz aplikacji, skorzystaj z MultiDexApplication
manifestu Android:
Dodaj to do pliku Application.java
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
lub użyj dostarczonej aplikacji z biblioteki 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>
Zapobiegaj OutOfMemory dzięki MultiDex
Dalszą wskazówką jest to, że jeśli napotkasz OutOfMemory
wyjątki podczas fazy kompilacji, możesz powiększyć stos
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
co ustawiłoby stos na 4 gigabajty.
Zobacz to pytanie, aby uzyskać więcej informacji na temat problemu z pamięcią sterty dex.
Przeanalizuj źródło problemu
Aby przeanalizować źródło metod, wtyczka gradle https://github.com/KeepSafe/dexcount-gradle-plugin może pomóc w połączeniu z drzewem zależności udostępnionym przez gradle np.
.\gradlew app:dependencies
Zobacz tę odpowiedź i pytanie, aby uzyskać więcej informacji na temat liczby metod w Androidzie