tag studio example android dx

studio - android tag example



Herramienta de Android dx (3)

¿Qué es la herramienta dx?

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

¿Dónde está?

El dx.jar era original ubicado en android-sdk / platform / android-X / tools / lib / before (especialmente en android-3 y android-4), y se trasladó a android-sdk / platform-tools / lib / later.

¿Cómo encaja en Android?

El compilador de Java convierte los archivos de origen de Java a archivos de clase de Java.

La herramienta dx convierte los archivos de clase Java en un archivo .dex (Dalvik Executable) . 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 en los archivos de clase se optimiza en el archivo .dex.

Por ejemplo, si se encuentra la misma cadena en diferentes archivos de clase, el archivo .dex contiene solo 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 empaquetan en un archivo .apk (paquete de Android).

Para entender mejor mirar el proceso de construcción de Android

Para tu información:

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 Android y se puede implementar en un dispositivo Android a través de la herramienta adb (puente de dispositivo Android).

Reference

¿Alguien sabe de alguna documentación para dx?

En particular, estoy interesado en saber qué hace la opción --core-library .

¿Alguien puede arrojar alguna luz sobre eso?


Este es un indicador de propósito especial que solo se usa al compilar algunos de los archivos jar de framework (core.jar, framework.jar, etc.). Normalmente, dx rechazará procesar cualquier clase java. * O javax. *. Entonces, esta opción se usa para core.jar, donde todas esas clases están realmente definidas.

Aquí hay una nota 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 desaconsejado o erróneo de una clase principal (java. * O javax. *) Cuando no se crea una biblioteca principal. Esto se debe a menudo a la inclusión involuntaria de un archivo de la biblioteca central en el proyecto de su aplicación, cuando se usa un IDE (como Eclipse). Si está seguro de que no está definiendo intencionalmente una clase principal, entonces esta es la explicación más probable de lo que está sucediendo.

Sin embargo, es posible que esté intentando definir una clase en un espacio de nombres central, cuya fuente puede haber tomado, por ejemplo, de un proyecto de máquina virtual que no sea 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 crear una biblioteca central, lo cual solo es apropiado como parte de la creación de una distribución completa de máquinas virtuales, en lugar de compilar una aplicación, entonces use la opción / "- biblioteca-base /" para suprimir este error mensaje. Si sigue adelante y usa / "- core-library /" pero en realidad está construyendo una aplicación, entonces se le advierte que su aplicación aún no podrá compilarse o ejecutarse, en algún momento. Prepárese para los clientes enojados que, por ejemplo, descubren que su aplicación deja de funcionar una vez que actualizan su sistema operativo. Usted será el culpable de este problema.

Si está utilizando legítimamente algún código que está en un paquete central, 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 nombre de paquete. Esto significa que nunca estarán en conflicto con las clases del sistema central. JarJar es una herramienta que puede ayudarte en este esfuerzo. Si descubres que no puedes hacer esto, entonces eso es una indicación de que el camino en el que te encuentras en última instancia te llevará al dolor, el sufrimiento, el dolor y la lamentación.


La opción --core-library en Dx omitirá la comprobación de estupidez que evita que incluyas accidentalmente las bibliotecas de Java en tu aplicación de Android.

Dx barf si intentas incluir una biblioteca que contiene paquetes en el espacio de nombres java. * O javax. *. la idea es que las clases en ese espacio de nombre probablemente dependan de otras clases "básicas" de JDK, lo que interrumpirá su aplicación ya que (es posible que) no estén presentes en Android.

ahora, por supuesto, solo porque un paquete java comience con java. * o javax. * no significa necesariamente que depende del JDK apropiado. Puede funcionar perfectamente bien en Android. La recomendación, si sabe lo que está haciendo, si sabe que sus clases java / x. * no dependen de las clases centrales de JDK, es usar una herramienta como JarJar para volver a empaquetar el JAR con un espacio de nombre diferente.

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

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í, anular el control de la estupidez era aceptable porque el uso de Jackson por parte de la biblioteca era solo para JSON y no para la serialización XML (solo incluyo la biblioteca API de JAXB, no la implícita). por supuesto, me gustaría que hubiera una forma más limpia de hacerlo, pero volver a escribir la biblioteca de nivel superior para evitar el uso de Jackson no era una opción.