Herramienta dx de Android

¿Alguien sabe de cualquier documentación para dx? En particular, estoy interesado en saber lo que hace la opción -core-library. ¿Puede alguien arrojar alguna luz sobre eso?

¡Gracias!

Se trata de una bandera de propósito especial que se utiliza sólo cuando se construyen algunos de los frascos de marco (core.jar, framework.jar, etc.). Normalmente, dx se negará a procesar las clases java. * O javax. *. Así que esta opción se usa para core.jar, donde todas esas clases están realmente definidas.

Esta es una versión relevante de la fuente dx (dalvik / dx / src / com / android / dx / command / dexer / Main.java), que se imprime si intenta incluir una clase java. * O javax. * En una aplicación .

Uso mal aconsejado o equivocado de una clase principal (java. * O javax. *) Cuando no se está construyendo una biblioteca central. Esto se debe a que, inadvertidamente, incluye un archivo de biblioteca central en el proyecto de la aplicación, cuando se utiliza un IDE (como Eclipse). Si está seguro de que no está intencionadamente definiendo una clase básica, esta es la explicación más probable de lo que está pasando.

Sin embargo, es posible que esté intentando definir una clase en un espacio de nombres principal, cuyo origen puede haber tomado, por ejemplo, de un proyecto de máquina virtual que no sea de Android. Esto seguramente no funcionará. Como mínimo, pone en peligro la compatibilidad de su aplicación con futuras versiones de la plataforma. También es a menudo de legalidad cuestionable.

Si realmente tiene la intención de construir una biblioteca central, que sólo es apropiada como parte de la creación de una distribución de máquina virtual completa, en lugar de compilar una aplicación, utilice la opción \ "- core-library \" para suprimir este error mensaje. Si sigue adelante y utiliza \ "- core-library \" pero de hecho está construyendo una aplicación, entonces se le advierte que su aplicación seguirá fallando al construir o ejecutar, en algún momento. Por favor, esté preparado para los clientes enojados que encuentran, por ejemplo, que su aplicación deja de funcionar una vez que actualizan su sistema operativo. Usted será el culpable de este problema.

Si está usando legítimamente algún código que está en un paquete básico, entonces la alternativa segura más fácil que tiene es volver a empaquetar ese código. Es decir, mueva las clases en cuestión a su propio espacio de nombres de paquete. Esto significa que nunca estarán en conflicto con las clases centrales del sistema. JarJar es una herramienta que puede ayudarte en este esfuerzo. Si usted encuentra que usted no puede hacer esto, entonces eso es una indicación de que el camino en el que se encuentra en última instancia, conducir a dolor, sufrimiento, dolor y lamentación.

¿Qué es la herramienta dx?

La herramienta dx convierte archivos de clase Java en un archivo .dex ( archivo ejecutable de Dalvik)

¿Dónde está?

El dx.jar fue original en android-sdk / plataformas / android-X / tools / lib / before (especialmente en android-3 y android-4) y se movió a android-sdk / platform-tools / lib / later.

¿Cómo encaja en Android?

Los archivos de origen Java se convierten en archivos de clase Java por el compilador Java.

La herramienta dx convierte archivos de clase Java en un archivo .dex ( archivo ejecutable de Dalvik) . Todos los archivos de clase de la aplicación se colocan en este archivo .dex. Durante este proceso de conversión, la información redundante de los archivos de clase se optimiza en el archivo .dex.

Por ejemplo, si la misma cadena se encuentra en archivos de clase diferentes, el archivo .dex contiene sólo una referencia de esta cadena.

Por lo tanto, estos archivos .dex son mucho más pequeños en tamaño que los archivos de clase correspondientes.

El archivo .dex y los recursos de un proyecto de Android, por ejemplo, las imágenes y los archivos XML, se incluyen en un archivo .apk (paquete de Android).

Para entender mejor el proceso de construcción de android

Proceso de construcción

FYI:

El programa aapt (Android Asset Packaging Tool) realiza la creación de apk. El archivo .apk resultante contiene todos los datos necesarios para ejecutar la aplicación de Android y puede implementarse en un dispositivo Android a través de la herramienta adb (dispositivo android).

Referencia

La opción -core-library en Dx omitirá la comprobación stupidity que le impide incluir accidentalmente librerías Java en su aplicación Android.

Dx barf si intenta incluir una biblioteca que contiene paquetes en el espacio de nombres java. * O javax. *. El pensamiento es que las clases en ese espacio de nombre es probable que dependan de otras clases de "núcleo" de JDK, que romperán su aplicación ya que no pueden estar presentes en Android.

Ahora, por supuesto, sólo porque un paquete java empieza con java. * O javax. * No significa necesariamente que depende del JDK propiamente dicho. Puede funcionar perfectamente bien en android. La recomendación, si sabes lo que estás haciendo, si sabes que tus clases de java / x. * No dependen de las clases principales de JDK, es usar una herramienta como JarJar para volver a empaquetar el JAR bajo un espacio de nombre diferente.

Dicho esto, para evitar la estupidez, agregue la opción –core-library a dx. Cambiar la última línea de $ANDROID_HOME/platform-tools/dx ,

 exec java $javaOpts -jar "$jarpath" "$@" 

a,

 exec java $javaOpts -jar "$jarpath" --core-library "$@" 

En mi caso, estaba incluyendo una biblioteca que dependía de Jackson, que depende de JAXB. Para mí, la sustitución de la verificación de la estupidez era aceptable porque el uso de la biblioteca de Jackson era sólo para JSON y no para la serialización de XML (sólo incluyo la biblioteca de la API JAXB, no la impl). Por supuesto, me gustaría que hubiera una manera más limpia de ir sobre esto, pero volver a escribir la biblioteca de nivel superior para evitar el uso de Jackson no era una opción.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.