63 votes

Incrément automatique du code de version dans une application Android

Est-ce qu'il y a un moyen d'auto-incrémenter le code de version chaque fois que vous construisez une application Android dans Eclipse?

According to http://developer.android.com/guide/publishing/versioning.html, vous devez augmenter manuellement votre code de version dans AndroidManifest.xml.

Je comprends, vous devez exécuter un script avant chaque construction qui pourrait, par exemple, analyser le fichier AndroidManifest.xml, trouver le numéro de version, l'incrémenter et enregistrer le fichier avant que la construction elle-même ne commence. Cependant, je n'ai pas pu découvrir comment et si Eclipse prend en charge l'exécution de scripts avant/après les constructions.

J'ai trouvé cet article sur la configuration du constructeur ant, mais il ne s'agit pas exactement d'Android et je crains que cela ne perturbe trop les étapes de construction prédéfinies pour Android?

Cela devrait être un problème courant, comment l'avez-vous résolu?

Eh bien, on peut le faire manuellement, mais dès que vous oubliez de faire cette corvée, vous obtenez des versions différentes avec le même numéro et toute la numérotation perd peu de sens.

0 votes

Simplement pensé, on pourrait utiliser des hooks de commit dans le système de contrôle de version pour incrémenter le code de version dans le manifeste ou même simplement remplacer le code de version par le numéro de révision. Cela pourrait également être acceptable

0 votes

Il semble que l'utilisation du numéro de révision SVN/CVS serait la seule solution. En effet, si le script se contente d'incrémenter le numéro dans le manifeste, les builds effectués par différents développeurs auraient des numéros croissants arbitraires et non synchronisés. Le numéro de révision est global.

0 votes

Vous pourriez le faire avec le custom_rules.xml dans ant. voir stackoverflow.com/a/20584169/1523910 sur comment le faire dans git

113voto

ckozl Points 4838

J'ai accompli ça. Et voici comment je l'ai fait pour le prochain (en utilisant Eclipse) :

1) Créer un exécutable console externe qui va écrire un nouveau code de version dans AndroidManifest.xml : (le mien est en C#)

using System.IO;
using System.Text.RegularExpressions;

namespace AndroidAutoIncrementVersionCode
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string FILE = @"AndroidManifest.xml";
                string text = File.ReadAllText(FILE);
                Regex regex = new Regex(@"(?android:versionCode="")(?\d+)(?"")", RegexOptions.IgnoreCase);
                Match match = regex.Match(text);
                int verCode = int.Parse(match.Groups["VER"].Value) + 1;
                string newText = regex.Replace(text, "${A}" + verCode + "${B}", 1);

                File.WriteAllText(FILE, newText);
            }
            catch { }
        }
    }
}

**

remarque : n'importe quel compilateur c-sharp peut construire cette application, vous n'avez pas besoin de Visual Studio ou même de Windows

****2. si vous ne l'avez pas déjà, installez le runtime .NET (Mono fonctionnera, lien) (lien vers le framework .NET 2.0 de Microsoft, 2.0 est le plus petit téléchargement, toute version >= 2.0 fonctionne)

  1. copiez ce code dans un fichier *.cs (j'ai nommé le mien : AndroidAutoIncrementVersionCode.cs)
  2. ouvrez un terminal et naviguez jusqu'à l'emplacement où vous avez créé votre fichier *.cs
  3. construisez le fichier en utilisant cette commande (sur Windows, similaire pour Mono mais changez le chemin du compilateur) : c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc AndroidAutoIncrementVersionCode.cs _(voir : .NET ou Mono pour plus d'informations)_
  4. félicitations, vous venez de construire une application C# sans aucun outil, elle aurait dû générer AndroidAutoIncrementVersionCode.exe dans le même répertoire automatiquement

    **les résultats peuvent varier, les chemins peuvent être différents, aucun achat nécessaire, null là où c'est interdit, j'ai ajouté cela parce que C# est génial, et les gens pensent à tort qu'il est verrouillé par MS, vous pourriez tout aussi facilement traduire cela dans une autre langue (mais je ne vais pas le faire pour vous ;). au fait, n'importe quelle version de n'importe quel compilateur .NET fonctionnera, j'ai adapté le code pour le moins commun...*

fin de la remarque

2) Exécuter l'exécutable pendant le processus de construction : a) Aller aux propriétés du projet

aller aux propriétés du projet

b) Dans les propriétés, aller à "Builders" -> "Nouveau..."

écran des propriétés Eclipse

c) Choisir "Programme"

choisir un programme

d) Dans l'onglet "Principal", sélectionner l'emplacement du programme (j'ai également défini le répertoire de travail pour être sûr) et donnez-lui un nom si vous le souhaitez.

modifier configuration - principal

e) Dans l'onglet "Actualiser", sélectionner l'option "Actualiser les ressources à la fin" et "La ressource sélectionnée" - cela actualisera le manifeste après que nous l'ayons écrit.

modifier configuration - actualiser

f) Dans l'onglet "Options de construction", vous pouvez désactiver "Allouer une console" car vous n'avez pas d'entrée ni de sortie, puis sélectionner uniquement "Pendant les constructions manuelles" et "Pendant les constructions automatiques", désélectionner "Après un nettoyage" s'il est coché. Ensuite, sélectionnez "Spécifier un ensemble de ressources pertinentes" et cliquez sur le bouton "Spécifiez les ressources...". Dans la boîte de dialogue "Modifier l'ensemble de travail", localisez votre fichier "AndroidManifest.xml" dans la boîte de dialogue et cochez-le, puis cliquez sur "Terminer"

modifier configuration - options de constructionmodifier ensemble de travail

f) Maintenant appuyez sur "OK" à l'intérieur de la "Boîte de dialogue de modification de la configuration" et dans les propriétés de votre application, sélectionnez le constructeur nouvellement créé, et continuez à cliquer sur "Haut" jusqu'à ce qu'il soit en haut de la liste, de cette façon l'auto-incrément se lance en premier, et ne déclenche pas d'états désynchronisés ou de reconstructions accidentelles. Une fois que le nouveau constructeur que vous avez créé est en haut de la liste, cliquez sur "OK" et vous avez terminé.

modifier configuration - cliquez sur okentrez la description de l'image ici**

4 votes

Excellente réponse ! Fonctionne parfaitement pour moi. Je l'ai amélioré pour augmenter également la "android:versionName" et j'ai également téléchargé l' exécutable lui-même pour ceux moins versés en C#.

3 votes

Notez que le nom de la version doit être sous la forme de X.Y.Z, et Z est augmenté à chaque fois. Mettez l'exe dans le même emplacement que le manifeste.

0 votes

Merci, j'ai pu faire fonctionner cela sur ma boîte Linux en utilisant mono

9voto

Clyde Points 1521

Ce script shell, adapté aux systèmes *nix, définit le versionCode et la dernière composante de versionName à la révision actuelle de Subversion. J'utilise Netbeans avec NBAndroid et j'appelle ce script depuis la cible -pre-compile de custom_rules.xml.

Enregistrez ce script dans un fichier appelé incVersion dans le même répertoire qu'AndroidManifest.xml, rendez-le exécutable : chmod +x incVersion

manf=AndroidManifest.xml
newverfull=`svnversion`
newvers=`echo $newverfull | sed 's/[^0-9].*$//'`
vers=`sed -n '/versionCode=/s/.*"\([0-9][0-9]*\)".*/\1/p' $manf`
vername=`sed -n '/versionName=/s/.*"\([^"]*\)".*/\1/p' $manf`
verbase=`echo $vername | sed 's/\(.*\.\)\([0-9][0-9]*\).*$/\1/'`
newvername=$verbase$newverfull
sed /versionCode=/s/'"'$vers'"'/'"'$newvers'"'/ $manf | sed /versionName=/s/'"'$vername'"'/'"'$newvername'"'/  >new$manf && cp new$manf $manf && rm -f new$manf
echo versionCode=$newvers versionName=$newvername

Créez ou modifiez custom_rules.xml et ajoutez ceci :

Ainsi, si ma révision SVN actuelle est 82, j'obtiens ceci dans AndroidManifest.xml :

android:versionCode="82"
android:versionName="2.1.82">

Quand je veux publier une nouvelle version, j'actualiserai généralement les premières parties de versionName, mais même si j'oublie, la dernière partie de versionName (qui est affichée dans mon activité À propos) me dira toujours à partir de quelle révision SVN elle a été construite. De plus, si je n'ai pas vérifié des modifications, le numéro de révision sera 82M et versionName sera quelque chose comme 2.1.82M.

L'avantage par rapport à simplement incrémenter le numéro de version à chaque fois qu'une compilation est effectuée est que le numéro reste sous contrôle et peut être directement lié à une révision SVN spécifique. Très utile lors de l'investigation de bugs autres que dans la dernière version publiée.

7voto

Charles Points 51

Pour ce que ça vaut, j'ai pu mettre à jour la valeur de la version de build en six lignes de python :

#!/bin/env python
import os
from xml.dom.minidom import parse
dom1 = parse("AndroidManifest.xml")
dom1.documentElement.setAttribute("android:versionName","%build.number%")
f = os.open("AndroidManifest.xml", os.O_RDWR)
os.write( f, dom1.toxml() )

0 votes

Merci! Et pour moi, c'est plus explicite et plus agréable à lire que douze captures d'écran.

9 votes

... mais ne dit rien sur comment le faire fonctionner dans Eclipse, ce qui était la question.

0 votes

Je veux aussi savoir comment cela fonctionne.

6voto

Rocky Points 187

En s'appuyant sur la réponse de Charles, les lignes suivantes incrémentent la version de construction existante :

#!/usr/bin/python
from xml.dom.minidom import parse

dom1 = parse("AndroidManifest.xml")
oldVersion = dom1.documentElement.getAttribute("android:versionName")
versionNumbers = oldVersion.split('.')

versionNumbers[-1] = unicode(int(versionNumbers[-1]) + 1)
dom1.documentElement.setAttribute("android:versionName", u'.'.join(versionNumbers))

with open("AndroidManifest.xml", 'wb') as f:
    for line in dom1.toxml("utf-8"):
        f.write(line)

2 votes

C'est génial, merci beaucoup! Si vous l'exécutez en tant que script shell, n'oubliez pas d'ajouter #!/usr/bin/python comme première ligne et de le rendre exécutable: chmod +x buildincrease.py.

4voto

aeracode Points 496

Alors, je le vois comme ça:

En fonction de l'article que vous présentez, utilisez ant pour ces tâches (cibles?).

  1. analyser le manifeste (analyser XML)
  2. obtenir l'ancienne version du manifeste et l'augmenter/obtenir la version du référentiel
  3. stocker la nouvelle version dans le manifeste
  4. construire l'application Android.

Mais dans mon cas, je remplis généralement ce champ par une valeur basée sur la révision de la tag lorsque je déploie ou distribue l'application.

0 votes

Oui, ce sont les étapes que le script devrait suivre. Malheureusement, je ne parviens pas à trouver où l'appel au script devrait se faire. La construction d'une application Android depuis Eclipse n'utilise pas le fichier build.xml. Ainsi, ma question se résume à : où (dans quel fichier ? dans quel paramétrage de projet Eclipse ?) placer l'appel au script

0 votes

En réalité, si on utilise CVS, un tel script ne rendra pas le versioning automatique. CVS ne supporte pas les numéros de révision pour l'ensemble du projet, c'est pourquoi vous avez utilisé l'italique sur Tag. Mais ensuite, vous devez créer manuellement une balise CVS. Cela signifie que si vous oubliez de créer une balise CVS, vous vous retrouverez avec un numéro de build incorrect. C'est essentiellement la même chose que de mettre à jour manuellement versionCode dans AndroidManifest.xml, avec comme seul avantage que le numéro de build est également synchronisé avec la balise visible par les autres développeurs (enfin, c'est dans le code de toute façon). Il semble que l'automatisation réelle ne soit pas réalisable si CVS est utilisé.

1 votes

Désolé, je n'utilise pas directement ant pour construire des applications Android. Mais ce que j'ai vu avait beaucoup de code. Regardez ce lien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X