station samsung precio compatibilidad application app android dex

android - samsung - No se puede ejecutar dex: el ID del método no se encuentra en[0, 0xffff]: 65536



samsung dex review (12)

Como ya se dijo, tiene demasiados métodos (más de 65k) en su proyecto y librerías.

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 "desgaste" con sus métodos de 20k + . Servicios de Google Play versión 6.5 o posterior, es posible que incluya los servicios de Google Play en su aplicación utilizando una cantidad de bibliotecas cliente 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 bibliotecas secundarias y sus responsabilidades se pueden encontrar en el documento oficial de google .

Actualización : desde la biblioteca de soporte v4 v24.2.0 se dividió en los siguientes módulos:

support-compat , support-core-utils , support-core-ui , support-media-compat y support-fragment

dependencies { compile ''com.android.support:support-fragment:24.2.+'' }

Sin embargo, tenga en cuenta que si usa support-fragment , tendrá dependencias de todos los demás módulos (es decir, si usa android.support.v4.app.Fragment no hay ningún beneficio)

Vea aquí las notas de la versión oficial para support-v4 lib

Habilitar MultiDexing

Desde Lollipop (también conocido como build tools 21+) es muy fácil de manejar. El enfoque consiste en solucionar el problema de los métodos de 65k por archivo dex para crear múltiples archivos dex para su aplicación. Agregue lo siguiente a su archivo de compilación de gradle ( http://developer.android.com/tools/building/multidex.html ):

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 la aplicación MultiDexApplication en su manifiesto de Android:

O agrega esto a tu Application.java

@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }

o use la aplicación provista desde la librería 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 otra sugerencia, si se encuentra con excepciones de OutOfMemory durante la fase de compilación, podría 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 del montón de dex.

Analizar 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 dependencia proporcionado por gradle con, por ejemplo,

./gradlew app:dependencies

Consulta esta respuesta y pregunta para obtener más información sobre el método de conteo en Android.

He visto varias versiones de los dex erros antes, pero esta es nueva. limpiar / reiniciar, etc no ayudará. Los proyectos de la biblioteca parecen intactos y la dependencia parece estar vinculada correctamente.

Unable to execute dex: method ID not in [0, 0xffff]: 65536 Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

o

Cannot merge new index 65950 into a non-jumbo instruction

o

java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

tl; dr : ¡La solución oficial de Google finalmente está aquí!

http://developer.android.com/tools/building/multidex.html

Solo un pequeño consejo, es probable que tenga que hacer esto para evitar la falta de memoria al realizar el dexing.

dexOptions { javaMaxHeapSize "4g" }

También hay un modo jumbo que puede solucionar esto de una manera menos confiable:

dexOptions { jumboMode true }

Actualización: si su aplicación es gorda y tiene demasiados métodos dentro de su aplicación principal, es posible que deba reorganizar su aplicación según

http://blog.osom.info/2014/12/too-many-methods-in-main-dex.html


El siguiente código ayuda, si usas Gradle. Le permite eliminar fácilmente los servicios innecesarios de Google (suponiendo que los esté utilizando) para volver a estar por debajo del umbral de 65k. Todo el crédito a esta publicación: https://gist.github.com/dmarcato/d7c91b94214acd936e42

Edición 2014-10-22 : Ha habido mucha discusión interesante sobre la esencia mencionada anteriormente. TLDR? mira este: https://gist.github.com/Takhion/10a37046b9e6d259bb31

Pegue este código en la parte inferior de su archivo build.gradle y ajuste la lista de servicios de google que no necesita:

def toCamelCase(String string) { String result = "" string.findAll("[^//W]+") { String word -> result += word.capitalize() } return result } afterEvaluate { project -> Configuration runtimeConfiguration = project.configurations.getByName(''compile'') ResolutionResult resolution = runtimeConfiguration.incoming.resolutionResult // Forces resolve of configuration ModuleVersionIdentifier module = resolution.getAllComponents().find { it.moduleVersion.name.equals("play-services") }.moduleVersion String prepareTaskName = "prepare${toCamelCase("${module.group} ${module.name} ${module.version}")}Library" File playServiceRootFolder = project.tasks.find { it.name.equals(prepareTaskName) }.explodedDir Task stripPlayServices = project.tasks.create(name: ''stripPlayServices'', group: "Strip") { inputs.files new File(playServiceRootFolder, "classes.jar") outputs.dir playServiceRootFolder description ''Strip useless packages from Google Play Services library to avoid reaching dex limit'' doLast { copy { from(file(new File(playServiceRootFolder, "classes.jar"))) into(file(playServiceRootFolder)) rename { fileName -> fileName = "classes_orig.jar" } } tasks.create(name: "stripPlayServices" + module.version, type: Jar) { destinationDir = playServiceRootFolder archiveName = "classes.jar" from(zipTree(new File(playServiceRootFolder, "classes_orig.jar"))) { exclude "com/google/ads/**" exclude "com/google/android/gms/analytics/**" exclude "com/google/android/gms/games/**" exclude "com/google/android/gms/plus/**" exclude "com/google/android/gms/drive/**" exclude "com/google/android/gms/ads/**" } }.execute() delete file(new File(playServiceRootFolder, "classes_orig.jar")) } } project.tasks.findAll { it.name.startsWith(''prepare'') && it.name.endsWith(''Dependencies'') }.each { Task task -> task.dependsOn stripPlayServices } }


Elimine un archivo jar de la carpeta Libs y cópielo en otra carpeta, y vaya a _Project Properties> Select Java Build Path, Select Libraries, Select Add External Jar, seleccione el jar eliminado de su proyecto, haga clic en guardar, esto se agregará en Referenciado Biblioteca en lugar de carpeta libs. Ahora limpia y ejecuta tu proyecto. No es necesario agregar ningún código para MultDex. Simplemente funcionó para mí.


Enfrenté el mismo problema y lo resolví editando mi archivo build.gradle en la sección de dependencias, eliminando:

compile ''com.google.android.gms:play-services:7.8.0''

Y reemplazándolo con:

compile ''com.google.android.gms:play-services-location:7.8.0'' compile ''com.google.android.gms:play-services-analytics:7.8.0''


He compartido un proyecto de ejemplo que resuelve este problema usando custom_rules.xml script de compilación y unas pocas líneas de código.

Lo usé en mi propio proyecto y se ejecuta sin problemas en dispositivos de 1M + (desde android-8 hasta el último android-19). Espero eso ayude.

https://github.com/mmin18/Dex65536


Intenta agregar el siguiente código en build.gradle, funcionó para mí:

compileSdkVersion 23 buildToolsVersion ''23.0.1'' defaultConfig { multiDexEnabled true }


La solución perfecta para esto sería trabajar con Proguard. Como mencionó aleb en el comentario. Disminuirá el tamaño del archivo dex a la mitad.


Me enfrenté al mismo problema hoy, por lo que funcionó está abajo.

Para ANDROID STUDIO ... Habilitar ejecución instantánea

En Archivo-> Preferencias-> Compilación, Ejecución, Despliegue-> Ejecución instantánea-> Marque Habilitar ejecución instantánea para intercambio en caliente ...

Espero eso ayude


Puedes analizar problemas (referencias a archivos dex) usando Android Studio:

Construir -> Analizar APK ..

En el panel de resultados, haga clic en el archivo classes.dex

Y verás:



solución gradle + proguard:

afterEvaluate { tasks.each { if (it.name.startsWith(''proguard'')) { it.getInJarFilters().each { filter -> if (filter && filter[''filter'']) { filter[''filter''] = filter[''filter''] + '',!.readme'' + '',!META-INF/LICENSE'' + '',!META-INF/LICENSE.txt'' + '',!META-INF/NOTICE'' + '',!META-INF/NOTICE.txt'' + '',!com/google/android/gms/ads/**'' + '',!com/google/android/gms/cast/**'' + '',!com/google/android/gms/games/**'' + '',!com/google/android/gms/drive/**'' + '',!com/google/android/gms/wallet/**'' + '',!com/google/android/gms/wearable/**'' + '',!com/google/android/gms/plus/**'' + '',!com/google/android/gms/topmanager/**'' } } } } }


Actualización 3 (3/11/2014)
Google finalmente lanzó http://developer.android.com/tools/building/multidex.html .

Actualización 2 (31/10/2014)
El plugin Gradle v0.14.0 para Android agrega soporte para multi-dex. Para habilitarlo, solo tienes que declararlo en build.gradle :

android { defaultConfig { ... multiDexEnabled true } }

Si su aplicación es compatible con Android antes de 5.0 (es decir, si su minSdkVersion es 20 o inferior), también tiene que parchear dinámicamente la aplicación ClassLoader , para que pueda cargar clases desde dexes secundarios. Afortunadamente, hay una library que hace eso por ti. Agrégalo a las dependencias de tu aplicación:

dependencies { ... compile ''com.android.support:multidex:1.0.0'' }

Debe llamar al código de parche de ClassLoader lo antes posible. La documentation la clase MultiDexApplication sugiere tres formas de hacerlo (elija una de ellas , la que le MultiDexApplication más conveniente):

1 - Declare la clase MultiDexApplication como la aplicación en su AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.multidex.myapplication"> <application ... android:name="android.support.multidex.MultiDexApplication"> ... </application> </manifest>

2 - Haga que su clase de Application extienda la clase documentation :

public class MyApplication extends MultiDexApplication { .. }

3 - Llame a MultiDex#install desde su método Application#attachBaseContext :

public class MyApplication { protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); .... } .... }

Actualización 1 (17/10/2014):
Como se anticipó, el soporte multidex se incluye en la revisión 21 de la biblioteca de soporte de Android. Puede encontrar android-support-multidex.jar en la carpeta / sdk / extras / android / support / multidex / library / libs.

El soporte multi-dex resuelve este problema. dx 1.8 ya permite generar varios archivos dex.
Android L admitirá la tecnología multi-dex de forma nativa, y la próxima revisión de la biblioteca de soporte cubrirá las versiones anteriores de API 4.

Fue declarado en this episodio de Android Developers Backstage podcast por Anwar Ghuloum. He publicado una transcripción (y una explicación general multi-dex) de la parte relevante.