Numeración automática de su aplicación Android con Git y Eclipse

Creo que las computadoras son las mejores cosas para hacer tareas repetitivas. Ciertamente no lo soy, o me olvido, o (principalmente) no hago las cosas de manera consistente, que no es lo que quiero.

Una de las cosas que probablemente haga es olvidar actualizar la información de la versión en el manifiesto cuando publique una nueva versión de una aplicación de Android. En el pasado, he trabajado con sistemas de compilation configurados que tienen una function de numeración automática de versiones y me acostumbré (o tal vez me volví perezoso).

Encontré esta publicación de Stackoverflow muy útil para encontrar una solución, pero me tomó un time ajustarla para que funcione de la manera que quiero. Los bashs anteriores en algún momento causarían la construcción continua, lo cual fue un dolor. Así que pensé que publicaría mi solución aquí con la esperanza de que alguien más la encuentre útil.

Esta solución fue desarrollada en Linux. Estoy seguro de que los desarrolladores expertos de Windows & Mac pueden adaptarlo a sus plataforms, pero yo no soy un desarrollador. Linux es donde vive mi set de habilidades.

Git tiene una buena característica en el command git describe --dirty . Escanea el logging de confirmación y encuentra la label y luego crea una cadena de versión desde allí. Si se trata de una "compilation de producción" donde se ha labeldo el último compromiso y se han registrado todos los files, esa es su cadena de versión. Si se trata de una compilation de desarrollo, la última label se agrega con el número de confirmaciones adicionales y un código hash abreviado. La bandera – --dirty es solo la guinda de la guinda del pastel: agrega la palabra dirty si todavía hay algún file modificado no confirmado. Esto es perfecto para su android:versionName atributo android:versionName en el file de manifiesto.

Para el android:versionCode se requiere un número. Esto necesita reloj para lanzamientos pero no para compilation de desarrollo, y como cada lanzamiento tendrá una label con una cadena de versión, simplemente los contemplo. Siempre etiqueto mis versiones en la forma v<major>.<minor>[.<patch>] donde <major> , <minor> y <patch> son solo numbers. Entonces, contar las tags que comienzan con una minúscula 'v' seguida de un dígito es todo lo que realmente se necesita aquí.

Después de rastrear con un file de manifiesto de plantilla, descubrí que la mejor manera era simplemente usar el file AndroidManifest.xml en la base del proyecto, editado usando el editor stream stream sed y depositar el resultado en bin / AndroidManifest.xml.

Así que desarrollé el script a continuación, lo coloqué en una carpeta de scripts al mismo nivel que mis proyectos (para que todos puedan compartir el mismo script) y luego configuré un generador personalizado en Eclipse.

Existe el script que llamé version.sh :

 #/bin/bash echo "Auto Version: `pwd`" CODE=`git tag | grep -c ^v[0-9]` NAME=`git describe --dirty | sed -e 's/^v//'` COMMITS=`echo ${NAME} | sed -e 's/[0-9\.]*//'` if [ "x${COMMITS}x" = "xx" ] ; then VERSION="${NAME}" else BRANCH=" (`git branch | grep "^\*" | sed -e 's/^..//'`)" VERSION="${NAME}${BRANCH}" fi echo " Code: ${CODE}" echo " Ver: ${VERSION}" cat AndroidManifest.xml | \ sed -e "s/android:versionCode=\"[0-9][0-9]*\"/android:versionCode=\"${CODE}\"/" \ -e "s/android:versionName=\".*\"/android:versionName=\"${VERSION}\"/" \ > bin/AndroidManifest.xml exit 0 

Para configurar el generador aquí están los pasos:

1). Haga clic derecho en la base del proyecto y select "Propiedades" y luego "Constructores".

2). Presione el button "Nuevo" y select la opción "Progtwig".

3). Denomine a su versión algo así como "<project> Auto Version". Esta cadena debe ser única en todos los proyectos.

4). Configure la pestaña "Principal" de la siguiente manera:

4a). En la sección "Ubicación", utilice "Buscar sistema de files" y navegue y select el file de script.

4b). En la sección "Directorio de trabajo", utilice "Explorar el espacio de trabajo" para seleccionar el proyecto.

5). Deje sin marcar la casilla "Actualizar resources al finalizar" en la pestaña "Actualizar".

6). No configure ninguna variable en la pestaña "Entorno".

7). En la pestaña "Opciones de compilation":

7a). Asegúrese de que "Durante comstackciones manuales" esté marcado, y

7b). Que "Durante construcciones automáticas" también está marcado.

7c). Ahora tengo todo lo demás sin seleccionar. Ni siquiera le asigno una console. El águila que se fijó pudo haber visto que el guión generaba alguna información, pero ahora que lo tengo funcionando, solo quiero que la cosa se ejecute en silencio sin molestarme.

8). Acepta la configuration de compilation y luego coloca tu comstackdor entre "Android Pre-Compile" y "Java Builder".

Vuelve a desarrollar tus aplicaciones de forma segura sabiendo que están siendo adecuadamente versionadas, y revisa la información de tu aplicación. No es ese número de versión genial. 🙂

Steve

Idea (usando el ejecutable ant y git)

ok, aquí hay una nueva forma de hacerlo:

  • para calcular version.code :

    git rev-list master --first-parent --count

    esto sigue la pauta de control de versiones . Como efectivamente encuentra el número de confirmaciones desde la confirmación inicial (inclusive) que siempre se incrementa desde la versión anterior.

  • para calcular la version.name :

    git describe --tags --dirty --abbrev=7

Implementación:

build.xml suele importar un script ant personalizado llamado custom_rules.xml

por lo que el contenido del script es:

 <?xml version="1.0" encoding="UTF-8"?> <project name="application-custom"> <macrodef name="git" taskname="@{taskname}"> <attribute name="command" /> <attribute name="dir" default="" /> <attribute name="property" default="" /> <attribute name="taskname" default="" /> <attribute name="failonerror" default="on" /> <element name="args" optional="true" /> <sequential> <exec executable="git" dir="@{dir}" outputproperty="@{property}" failifexecutionfails="@{failonerror}" failonerror="@{failonerror}"> <arg value="@{command}" /> <args/> </exec> </sequential> </macrodef> <target name="-pre-build"> <git command="rev-list" property="versioning.code" taskname="versioning"> <args> <arg value="master" /> <arg value="--first-parent" /> <arg value="--count" /> </args> </git> <git command="describe" property="versioning.name" taskname="versioning"> <args> <arg value="--tags" /> <arg value="--dirty" /> <arg value="--abbrev=7" /> </args> </git> <echo level="info" taskname="versioning">${versioning.code}, ${versioning.name}</echo> <replaceregexp file="AndroidManifest.xml" match='android:versionCode=".*"' replace='android:versionCode="${versioning.code}"' /> <replaceregexp file="AndroidManifest.xml" match='android:versionName=".*"' replace='android:versionName="${versioning.name}"' /> </target> <target name="-post-build" > <replaceregexp file="AndroidManifest.xml" match='android:versionCode=".*"' replace='android:versionCode="0"' /> <replaceregexp file="AndroidManifest.xml" match='android:versionName=".*"' replace='android:versionName="0"' /> </target> 

simplemente lo haría.

En pocas palabras, simplemente reemplaza el android.versionCode y android.versionName con el código y nombre de la versión actual, almacenado en git.

Advertencias

  • El código y el nombre de la versión inicial se establece en 0 una vez completada la compilation. Si lo necesita, reemplace el cero en el objective -post-build , o (aunque dudo mucho que lo requiera) puede hacerlo configurable y colocarlo en alguna propiedad (file o embedded, su elección)
  • si la compilation falla o se cancela, la versión permanecerá tal como está. (Aunque dudo mucho de que sea de alguna preocupación, ¡solo revierte el file!)

Disfrutar.

Refs

  • La mejor forma de integrar Git con Ant?
  • macrodef para git improvisado de Ant Tasks para Git | Blog de tlrobinson.net

Edición importante

  1. evitar el uso de HEAD para calcular el número de compilation; causa problemas de versión de la versión al hacer una compilation durante el desarrollo, y más adelante al instalar la versión estable (o al hacer una transición de versión beta a versión principal). utilizando el master (o la twig que se usa para construcciones de producción) ref en su lugar.

PD: relevante para los usuarios de AS: versión de Android del proyecto Android de git describe con Android Studio / Gradle

Usando Android Studio (Gradle): mira esta publicación del blog: http://blog.android-develop.com/2014/09/automatic-versioning-and-increment.html

Aquí está la implementación del blog:

  android { defaultConfig { ... // Fetch the version according to git latest tag and "how far are we from last tag" def longVersionName = "git -C ${rootDir} describe --tags --long".execute().text.trim() def (fullVersionTag, versionBuild, gitSha) = longVersionName.tokenize('-') def(versionMajor, versionMinor, versionPatch) = fullVersionTag.tokenize('.') // Set the version name versionName "$versionMajor.$versionMinor.$versionPatch($versionBuild)" // Turn the version name into a version code versionCode versionMajor.toInteger() * 100000 + versionMinor.toInteger() * 10000 + versionPatch.toInteger() * 1000 + versionBuild.toInteger() // Friendly print the version output to the Gradle console printf("\n--------" + "VERSION DATA--------" + "\n" + "- CODE: " + versionCode + "\n" + "- NAME: " + versionName + "\n----------------------------\n") ... } } 
 ' for windows ' preBuildMy.cmd include repVer.vbs ' repVer.vbs : Dim objFileSystem, objOutputFile Dim objInputFile Dim sText,gitFile FileName = "./bin/AndroidManifest.xml" ' gitFile = ".\..\.git\refs\heads\master" gitFile = ".\..\.git\refs\remotes\origin\master" Set objFileSystem = CreateObject("Scripting.fileSystemObject") set objInputFile= objFileSystem.OpenTextFile(FileName) sText= objInputFile.ReadAll set objOutputFile = objFileSystem.CreateTextFile(FileName , TRUE) set objInputFile= objFileSystem.OpenTextFile(gitFile) refText= objInputFile.ReadAll sText = Replace(sText,"v1.0","v 1.0 " & Now & " ref=" & mid(refText,1,7)) objOutputFile.WriteLine(sText) objOutputFile.Close Set objFileSystem = Nothing WScript.Quit(0)