una programa para organizar ordenar hoy funciona fallas desde crear como cero cayo apps app aplicaciones aplicacion alfabeticamente android ant dex

programa - Se lanza ExceptionWithContext cuando se intenta construir una aplicación de Android con Ant



se cayo twitter hoy 2018 (3)

He intentado buscar tanto en Google como en stackoverflow para obtener una respuesta a esto, pero no he podido encontrar a nadie con el problema exacto que tengo. Estoy intentando configurar un servidor de integración continua (Bamboo, específicamente) para actualizar, compilar y exportar un APK cada vez que alguien realiza un cambio en el control de origen. Me encuentro con el mismo error en mi máquina local cuando hago todos los pasos a mano y en el servidor cuando uso el trabajo que he configurado. El error ocurre cuando llego al paso dex de la compilación. He obtenido el mismo resultado hasta ahora con la ant debug ant release , la ant release ant clean debug , la ant clean debug ant clean release . La salida de todo el paso de dex, completa con el error, es la siguiente:

-dex: [dex] input: C:/Users/.../Android/bin/classes [dex] input: C:/Users/.../google-play-services_lib/bin/classes.jar [dex] input: C:/Program Files (x86)/Android/android-sdk/tools/support/annotations.jar [dex] input: C:/Users/.../Android/libs/FlurryAgent.jar [dex] input: C:/Users/.../Android/libs/gcm.jar [dex] input: C:/Users/.../Android/libs/android-support-v4.jar [dex] input: C:/Users/.../google-play-services_lib/libs/google-play-services.jar [dex] Pre-Dexing C:/Users/.../google-play-services_lib/bin/classes.jar -> classes-64c0adfe92ddc950c7ab8c5002ceabf2.jar [dex] Pre-Dexing C:/Program Files (x86)/Android/android-sdk/tools/support/annotations.jar -> annotations-62bab95d6948a2db17bbc7976160b014.jar [dex] Pre-Dexing C:/Users/.../Android/libs/FlurryAgent.jar -> FlurryAgent-499d43756a3ce626a64773e6dfd5eaec.jar [dex] Pre-Dexing C:/Users/.../Android/libs/gcm.jar -> gcm-ae2640f44640eb4fd7b13964b65d2d70.jar [dex] Pre-Dexing C:/Users/.../Android/libs/android-support-v4.jar -> android-support-v4-fa30b373a3e3ba9f2cf94900a9eb42fe.jar [dex] Pre-Dexing C:/Users/.../google-play-services_lib/libs/google-play-services.jar -> google-play-services-9efad6e9178399c185fae6c0b6bdc4c6.jar [dex] Converting compiled files and external libraries into C:/Users/.../Android/bin/classes.dex... [dx] [dx] UNEXPECTED TOP-LEVEL EXCEPTION: [dx] com.android.dx.util.ExceptionWithContext [dx] at com.android.dx.util.ExceptionWithContext.withContext(ExceptionWithContext.java:46) [dx] at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:344) [dx] at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:134) [dx] at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:87) [dx] at com.android.dx.command.dexer.Main.processClass(Main.java:487) [dx] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459) [dx] at com.android.dx.command.dexer.Main.access$400(Main.java:67) [dx] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398) [dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:135) [dx] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191) [dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123) [dx] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191) [dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123) [dx] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191) [dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123) [dx] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191) [dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123) [dx] at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:191) [dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:123) [dx] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109) [dx] at com.android.dx.command.dexer.Main.processOne(Main.java:422) [dx] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333) [dx] at com.android.dx.command.dexer.Main.run(Main.java:209) [dx] at com.android.dx.command.dexer.Main.main(Main.java:174) [dx] at com.android.dx.command.Main.main(Main.java:91) [dx] Caused by: java.lang.NullPointerException [dx] at com.android.dx.cf.code.ConcreteMethod.<init>(ConcreteMethod.java:87) [dx] at com.android.dx.cf.code.ConcreteMethod.<init>(ConcreteMethod.java:75) [dx] at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:247) [dx] ... 23 more [dx] ...while processing <init> (Lcom/.../android/LocationService;)V [dx] ...while processing com/.../android/LocationService$1.class [dx] [dx] 1 error; aborting

Para el contexto, estoy usando Ant v1.9.2 y Android build-tools v18.0.1 en una máquina con Windows y no he editado los scripts de construcción de ninguna manera. android update project --path . una para la aplicación y otra para la biblioteca usando el android update project --path . en sus dos directorios. Tampoco he intentado configurarlo para utilizar automáticamente el almacén de claves adecuado para la firma, aunque a mi entender (limitado) eso no debería ser necesario, al menos no para una compilación de depuración con Ant.

¿Alguien ha visto este problema en particular antes? ¿Es un problema con el archivo .class generado? Los archivos de compilación? Esta es mi primera incursión real en construir con Ant (generalmente solo dejo que Eclipse haga todo el trabajo duro por mí), así que tengo muy poco para seguir. Cualquier ayuda sería muy apreciada.

Actualización: en caso de que alguien haya prestado atención a esta pregunta, mi problema parece haberse resuelto por sí solo. Cómo y por qué, no sé. Intenté actualizar la fuente esta mañana (tuvimos algunos cambios en), volver a ejecutar el android update project -p . , probé una ant clean debug , y he aquí que funcionó. Igual que hizo el ant release , que incluso lo firmó correctamente con la llave que le di. Mi mejor conjetura es que había algo extraño en ese archivo de clase de LocationService, aunque lo que era estaba fuera de mi alcance.

Actualización 2: Todo lo que dije en mi primera actualización ahora no es válido. He aislado el problema, pero no estoy más cerca de entenderlo. Este bloque de código es el culpable:

if (Settings.DEBUG) { Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { storeDebugNotification(AndroidUncaughtExceptionHandler.getStackTraceString(ex)); } }); }

Aquí es donde las cosas se ponen raras. Cuando el indicador Settings.DEBUG es true , esto se compila con ant. Cuando es false , falla, dándome el error que se muestra arriba. Cuando comento todo, funciona bien con cualquiera de los ajustes de DEBUG . Lo mismo ocurre con la línea if (Settings.DEBUG) y sus llaves, pero el cuerpo queda intacto, así como el cuerpo y la parte if solo. Así que ... estoy perdido aquí. Algo sobre la interacción entre la instrucción if y el cuerpo, en este archivo en particular, cuando DEBUG es falso está causando problemas. Y la otra parte rara es que tenemos exactamente el mismo bloque de otro archivo en la aplicación (una actividad, mientras que esta es un servicio).


Después de meses de luchar contra este problema exacto, finalmente encontré una solución que me funciona. Puede que no sea tu caso. Asegúrese de que ninguna de las clases a las que se refiere (¿quizás Configuración? ¿Tal vez AndroidUncaughtExceptionHandler?) Sea privada. El Gradle no puede manejarlo y no puede encontrar el método dentro de la clase. Simplemente cámbielo a público (o simplemente elimine el indicador para mantenerlo como predeterminado, si la clase está anidada), y debería estar listo.


Otra solución a la propuesta por @ Albert-Jan sería "envolver" esa constante en un método. Algo como

public boolean isInDeveloperMode(){ return BuildConfig.DEBUG; }

en cuyo caso no será "resuelto" como constante por gradle y no habrá ningún problema durante el tiempo de construcción.

Probablemente el "exploit" más famoso de este enfoque sea el método isUserAGoat() de la clase UserManager en Android SDK. Hay una discusión muy popular aquí sobre los posibles usos de este método. Disfrute;)

Esperemos que esto sea útil para alguien con problemas similares.


Tuve la misma excepción al compilar un proyecto para su lanzamiento. Mi código era:

if (BuildConfig.DEBUG) { myView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Do something } }); }

Debido a que BuildConfig.DEBUG es una constante con valor falso , el código en el bloque se reconoce como código muerto y se elimina cuando se optimiza.

El CfTranslator (Classfile Translator) desea crear un archivo separado para la clase anónima dentro del bloque ( SomeClass $ 1.class ), pero como está optimizado se producirá un error. Tomé la clase anónima fuera de las llaves el problema se resolvió:

View.OnClickListener lClickListener = new View.OnClickListener() { @Override public void onClick(View v) { // Do something } }; if (BuildConfig.DEBUG) { myView.setOnClickListener(lClickListener); }

Actualización: Otra forma de resolver esto (descrita por @Ewoks en su respuesta a continuación) es:

public boolean isInDeveloperMode() { return BuildConfig.DEBUG; } ... if (isInDeveloperMode()) { myView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Do something } }); }