Cómo modificar el nombre de versión en Manifiesto durante la generación?

Hasta ahora me he centrado en la programación de mi aplicación y he prestado poca atención a hacer que el proceso de construcción sea más inteligente. Así que he estado haciendo las cosas bastante manualmente (la "manera muda"), incluyendo la actualización a mano de android:versionCode y android:versionName en AndroidManifest.xml.

Me gustaría ahora para automáticamente (es decir, al construir o en la exportación):

  1. Obtener de git la última etiqueta / rama que contiene los códigos de compilación y versión.
  2. Analizarlos para que pueda asignarlos a los respectivos campos en AndroidManifest.xml.
  3. Modifique AndroidManifest.xml en consecuencia.
  4. Proceda con el proceso normal de construcción (Eclipse + ADT, no Ant), como si lo hiciera 1-2-3 a mano …

He encontrado algunas pistas sobre un "paso de pre-construcción ", builders y build.xml , pero no tengo ni idea de dónde encontrarlos y por dónde empezar.

¿Alguna sugerencia o puntaje sobre dónde podría encontrar más información sobre el tema? (Un tutorial paso a paso sería ideal)

Actualización 1: encontré este hilo para sugerir que:

  1. Haga clic con el botón derecho en el proyecto, Properties > Builders
  2. Agregue un constructor que apunte al archivo de construcción Ant del proyecto.
  3. Solicitar que el constructor se invoque antes del constructor de Java

Bien, pero ¿ dónde está el archivo de construcción Ant del proyecto? ¿Dónde lo encuentro?

Actualización 2: Aparentemente, es posible exportar todo el proyecto en un archivo Ant . Pero no estoy seguro de que eso sea lo que quiero. ¿Debe un paso de pre-compilación incluir siempre un archivo de construcción de Ant ?

Actualización 3: ¿Está construyendo un archivo Ant, sólo para el paso de pre-construcción , el enfoque correcto?

Esto es lo que utilizo para asignar dinámicamente un versionCode y versionName a AndroidManifest.xml. Funciona sólo cuando se construye con hormigas, por lo que tendrá que instalarlo primero. Luego vaya al directorio del proyecto en la línea de comandos y ejecute "android update project -p.", Que creará los archivos necesarios para construir con ant, como local.properties y build.xml.

A continuación, abra build.xml y colóquelo en su interior:

  <target name="-pre-build" depends="-custom-git-version,-custom-manifest-version"> </target> <!-- Packages the application. --> <target name="-post-build"> <antcall target="-custom-restore-manifest"/> <property name="suffix" value="${git.commits}-${git.version}.apk" /> <exec executable="sed" inputstring="${out.final.file}" outputproperty="out.final.renamedfile"> <arg value="s/\.apk/-${suffix}/" /> </exec> <copy file="${out.final.file}" tofile="${out.final.renamedfile}" /> <echo>Final file copied to: ${out.final.renamedfile}</echo> </target> <!-- Custom targets --> <target name="-custom-git-version"> <exec executable="sh" outputproperty="git.commits"> <arg value="-c" /> <arg value="git log --pretty=format:'' | wc -l" /> </exec> <echo>git.commits: ${git.commits}</echo> <exec executable="git" outputproperty="git.version"> <arg value="describe" /> <arg value="--tags" /> <arg value="--long" /> </exec> <echo>git.version: ${git.version}</echo> </target> <target name="-custom-manifest-version"> <echo>Creating backup of AndroidManifest.xml</echo> <copy file="AndroidManifest.xml" tofile="AndroidManifest.xml.antbak" preservelastmodified="true" /> <replaceregexp file="AndroidManifest.xml" match='android:versionCode="(\d+)"' replace='android:versionCode="${git.commits}"' /> <replaceregexp file="AndroidManifest.xml" match='android:versionName="(\d+\.\d+)\.\d+"' replace='android:versionName="\1.${git.commits}"' /> </target> <target name="-custom-restore-manifest"> <echo>Restoring backup of AndroidManifest.xml</echo> <move file="AndroidManifest.xml.antbak" tofile="AndroidManifest.xml" preservelastmodified="true" overwrite="true" /> </target> 

La salida de esto no es exactamente lo que quieres, pero es un comienzo – no dude en modificarlo 🙂 El resultado es algo así como "yourapp -. Apk

Usando esto, construirás tu aplicación con la ejecución de " ant clean debug " o " ant clean release ", dependiendo de lo que quieras. También puede crear el archivo " ant.properties " con este contenido:

 key.store=keystore_file key.store.password=some_password key.alias=some_alias key.alias.password=some_other_password 

Para habilitar la firma automática de su aplicación.

También debe leer esto: http://developer.android.com/tools/building/building-cmdline.html

Usted está en el camino correcto con la configuración de un paso de pre-construcción, pero el archivo de construcción de hormigas es algo que va a crear usted mismo desde cero. Eclipse tiene algunos scripts de hormigas que utiliza externamente para manejar la compilación automatizada, el empaquetado y otras cosas, pero desea crear una separada que solo haga estos pasos adicionales que desea.

Por lo tanto, usted va a tener que aprender un poco acerca de scripts de hormigas para hacer esto. Algunos de los enlaces que encontró le dan la idea básica de cómo crear un archivo de hormigas simple. Para agregar a eso, algunas de las tareas de la hormiga que usted necesitará probablemente utilizar son:

Exec – Necesitará esto para ejecutar su comando git que obtiene su información de versión. Tiene un argumento llamado resultProperty que puede usar para almacenar la salida del comando en una propiedad a la que ant pueda acceder. (O sólo puede tener el comando de salida a un archivo y hormiga puede acceder a eso.)

ReplaceRegExp – Necesitará esto para reemplazar tokens (tal vez @ VERSIONCODE @ y @ VERSIONNAME @) que coloque en su AndroidManifest.xml donde los valores deberían ir eventualmente, con los valores devueltos por el exec.

Probablemente también desee ejecutar una tarea de exec al principio para restaurar su archivo AndroidManifest.xml a su estado original (con los tokens en su lugar) por lo que es repetible sin limpieza manual. Proporcionaría más información sobre los comandos git que necesita para ejecutar dentro de estas tareas exec, pero me temo que toda mi experiencia es con Subversion, por lo que tendrá que rellenar las lagunas allí.

Usted debe considerar la construcción con maven-android . Una vez que su proyecto de construcción de forma limpia, utilice el complemento de actualización de versión para incrementar automáticamente su número de versión.

Escribir un script de compilación con maven-android no se puede describir como fácil – pero la recompensa vale la pena el esfuerzo y usted debe considerar esta avenida.

Además, este tutorial puede ser muy útil (utilizo una variante de la técnica descrita aquí para mis propias compilaciones)

EDIT (2014):

Considere migrar a Android Studio y utilizar Gradle. Ver: Cómo autoincrement versionCode en Android Gradle

La forma en que logré lograr esto: build> ejecutar shell (necesitábamos algún código php para recibir información de un db) y el cambio de cadena sucede en php:

 #!/usr/bin/php <?php $filename = $WORKSPACE."/src/com/me/myapp/MyActivity.java"; $file = @file_get_contents($filename); if($file) { $repl = preg_replace("OriginalString", "NewString", $file); file_put_contents($filename, $repl); echo "\n\nReplaced some stuff in $filename"; } ?> 
  • JavaDoc en un proyecto Eclipse Android
  • Import slidingmenu library en Eclipse Indigo Service Release 2
  • ¿Cuál es la manera más fácil de extraer una cadena de un archivo de diseño xml de Android a un archivo strings.xml?
  • Android Emulator y AVD no se ejecutarán en Surface Pro
  • Cuando arrasto un campo de "texto sin formato" a mi editor WYSIWYG en Eclipse para Android 4.1 Tengo un fallo de Java - ¿Cómo arreglar esto?
  • Pregunta de programación de Android
  • ¿Cómo puedo abrir el archivo .db. El archivo .db se genera desde eclipse (android) forma DDMS -> File explorer -> data ---> data -> packagename -> base de datos ...?
  • R.Java no generado
  • Depurar una aplicación ya en ejecución sin reiniciarla
  • Magic detrás del archivo R.java
  • El nombre de la aplicación de Android no se ha cambiado en la barra de estado cuando se inicia en eclipse
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.