Como ya se dijo, tiene demasiados métodos (más de 65k) en su proyecto y libs.
Prevenga el problema: reduzca la cantidad de métodos con Play Services 6.5+ y support-v4 24.2+
Dado que a menudo los servicios de Google Play son uno de los principales sospechosos en los métodos de "desperdicio" con sus más de 20k métodos . Servicios de Google Play versión 6.5 o posterior, es posible que incluya servicios de Google Play en su aplicación utilizando varias bibliotecas de clientes más pequeñas. Por ejemplo, si solo necesita GCM y mapas, puede elegir usar solo estas dependencias:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
La lista completa de sub bibliotecas y sus responsabilidades se puede encontrar en el documento oficial de Google .
Actualización : desde Support Library v4 v24.2.0 se dividió en los siguientes módulos:
support-compat
, support-core-utils
, support-core-ui
, support-media-compat
Ysupport-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
Sin embargo, tenga en cuenta que si lo usa support-fragment
, tendrá dependencias de todos los demás módulos (es decir, si lo usa, android.support.v4.app.Fragment
no hay beneficio)
Consulte aquí las notas de la versión oficial de support-v4 lib
Habilitar MultiDexing
Desde Lollipop (también conocido como herramientas de construcción 21+) es muy fácil de manejar. El enfoque es solucionar los métodos de 65k por problema de archivo dex para crear múltiples archivos dex para su aplicación. Agregue lo siguiente a su archivo de compilación de gradle ( esto está tomado del documento oficial de google en aplicaciones con más de 65k métodos ):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
El segundo paso es preparar su clase de Aplicación o, si no extiende la Aplicación, use el MultiDexApplication
en su Manifiesto de Android:
Agregue esto a su Application.java
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
o use la aplicación provista desde la biblioteca 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>
Prevenir OutOfMemory con MultiDex
Como consejo adicional, si se encuentra con OutOfMemory
excepciones durante la fase de construcción, puede ampliar el montón con
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
que establecería el montón a 4 gigabytes.
Consulte esta pregunta para obtener más detalles sobre el problema de la memoria de almacenamiento dinámico de dex.
Analiza la fuente del problema
Para analizar la fuente de los métodos, el complemento de Gradle https://github.com/KeepSafe/dexcount-gradle-plugin puede ayudar en combinación con el árbol de dependencias proporcionado por Gradle con, p. Ej.
.\gradlew app:dependencies
Consulte esta respuesta y pregunta para obtener más información sobre el recuento de métodos en Android