Comment changer le nom de l'application par type de build Gradle

135

J'essaie de trouver un moyen de pouvoir changer le nom de l'application de mon application par type de construction dans gradle.

Par exemple, j'aimerais avoir la version de débogage <APP_NAME>-debuget la version qa <APP-NAME>-QA.

Je suis familier avec:

debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
}

Cependant, je n'arrive pas à trouver une commande gradle pour appliquer le changement de l'application dans le lanceur.

André Perkins
la source

Réponses:

167

Si par "nom de l'application", vous voulez dire android:labelsur <application>, la solution la plus simple est d'avoir ce point sur une ressource de chaîne (par exemple, android:label="@string/app_name"), puis d'avoir une version différente de cette ressource de chaîne dans unsrc/debug/ sourceset.

Vous pouvez le voir dans cet exemple de projet , où j'ai un remplacement pour app_namein src/debug/res/values/strings.xml, qui sera appliqué pour les debugversions. releasebuilds utilisera la version de app_namein src/main/.

CommonsWare
la source
cette solution n'impliquerait-elle pas que nous devions ajouter un strings.xml supplémentaire pour chaque traduction? qui pourrait devenir une douleur à maintenir ...
sfera
7
@sfera: Tout d'abord, vous pouvez isoler cette chaîne dans son propre fichier de ressources si vous le souhaitez. Deuxièmement, ce n'est que pour une chaîne. Troisièmement, ce n'est que pour les types de build où vous souhaitez remplacer cette chaîne. Quatrièmement, à moins d'avoir une équipe de développement sans langage commun, vous n'auriez pas besoin de traduire des non- releasechaînes.
CommonsWare
Isoler la corde semble être une bonne idée. Merci pour ça! Pour ce qui est de la non- releasepartie, je vois cela un peu différemment car on pourrait également vouloir tester les problèmes de localisation tout en permettant aux builds "release" et "test" de coexister sur le même périphérique. Dans un tel cas, les deux versions peuvent se retrouver avec la même étiquette de lanceur, causant probablement une certaine confusion. C'est ce que j'essayais d'éviter.
sfera
1
@sfera: "C'est ce que j'essayais d'éviter" - donc, ne traduisez pas cette seule chaîne. Le test sur cette chaîne sera de toute façon invalide, car par définition, ce n'est pas la chaîne que vous souhaitez utiliser en releasemode. Et n'utilisez cette ressource de chaîne que pour app_name, pas pour un autre rôle.
CommonsWare
3
@sfera: Vous ne livrerez jamais une application avec "AppNom-DEBUG". Vous pouvez expédier une application avec "AppNom". Tester "AppNom-DEBUG" n'est donc pas nécessaire. Vous êtes certainement le bienvenu pour traduire une version de débogage de app_name, même si ce n'est pas nécessaire (par exemple, vous avez des développeurs français ou allemands qui ne parlent pas anglais et doivent donc la faire traduire). Pour tester pour voir si la releaseversion non modifiée de app_namefonctionne, avec ses traductions, testez la releaseconstruction ou créez un near-releasetype de construction qui ajoute simplement le suffixe d'ID d'application et laisse les chaînes seules.
CommonsWare
159

Vous pouvez utiliser quelque chose comme ça

 buildTypes {
    debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
        resValue "string", "app_name", "AppName debug"
    }
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
        zipAlignEnabled true
        resValue "string", "app_name", "AppName"
    }
}

Vous pouvez utiliser @ string / app_name dans les fichiers AndroidManifest.xml.

Assurez-vous de supprimer app_name de values ​​/ folder (aucune entrée portant ce nom).

irscomp
la source
Parfait lorsque le nom de l'application doit être lu à partir d'un fichier externe
Joe Maher
Vous avez une erreur lors de la construction de cette façon. Échec de l'exécution pour la tâche «: app: mergeDebugResources» .. Ressources en double: res / values ​​/ strings.xml: string / app_name
user2010496
5
Si vous obtenez: Vous avez une erreur lors de la construction de cette façon. L'exécution a échoué pour la tâche ': app: mergeDebugResources' .. Duplicate resources: res / values ​​/ strings.xml: string / app_name you should do, comme son écrit: "Assurez-vous de supprimer app_name de values ​​/ folder (aucune entrée de ce nom ). "
ivan.panasiuk
J'aime cela parce que la solution de dossier de chaînes (la solution acceptée, ci-dessus) ne fonctionne que si le nom de l'application est défini pour un ensemble de sources / une saveur de produit particulier. Dans mon cas, je mets en place un travail Jenkins Pipeline pour créer automatiquement différentes versions de notre application avec des noms différents, et tous ces noms n'ont pas de productFlavors définis pour eux. Ainsi, Jenkins fournit simplement le nom de l'application via l'environnement, et gradle le lit:resValue "string", "app_name", System.getenv("APP_NAME") ?: "MyApp"
Aphex
si j'ai supprimé app_name du dossier string, puis obtenir une erreur lors de la compilation de l'erreur -Error: l'exécution a échoué pour la tâche ': app: processDevDebugManifest'. > La fusion du manifeste a échoué avec plusieurs erreurs, voir les journaux
aj0822ArpitJoshi
55

Vous pouvez le faire avec gradle:

android {
    buildTypes {
        release {
            manifestPlaceholders = [appName: "My Standard App Name"]
        }
        debug {
            manifestPlaceholders = [appName: "Debug"]
        }
    }
}

Puis dans votre AndroidManifest.xmlput:

<application
    android:label="${appName}"/>
    <activity
        android:label="${appName}">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Remarque: cela fonctionne également avec productFlavors.

Albert Vila Calvo
la source
erreur d'obtention -Erreur: l'exécution a échoué pour la tâche ': app: processDevDebugManifest'. > La fusion du manifeste a échoué avec plusieurs erreurs, voir les journaux
aj0822ArpitJoshi
NE FONCTIONNE PAS --- buildTypes {release {minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro'} debug {manifestPlaceholders = [appName: "GridL Debug"] applicationIdSuffix ".dev1"}}
JSONParser
44

Pour prendre en charge les traductions, procédez comme suit:

1. supprimez la chaîne "app_name"

2. ajouter au classement

 buildTypes {
    admin {
       resValue "string", "app_name", "@string/app_name_admin"
    }
    release {
        resValue "string", "app_name", "@string/app_name_release"
    }
    debug {
        resValue "string", "app_name", "@string/app_name_debug"
    }
}

3. Définissez le nom de l'application dans le manifeste comme "@ string / app_name"

4. Ajouter aux valeurs strings.xml

<string name="app_name_admin">App Admin</string>
<string name="app_name_release">App  release</string>
<string name="app_name_debug">App debug</string>
NickUnuchek
la source
Quels sont les différents types de types de build? Autre que, administration, publication et débogage?
Dinesh le
@DineshVG vous pouvez définir la différence par vous-même, par exemple différent applicationId
NickUnuchek
Je veux utiliser le test UIAutomator dans une autre configuration de construction autre que le débogage avec différentes règles pro-guard. Est-ce possible ?
Dinesh le
Cela devrait être la réponse acceptée, a très bien fonctionné pour moi
Oleg Dater
J'aime beaucoup cette approche car elle vous permet même d'ajouter une section personnalisée app_namedans productFlavors debuild.gradle fichier. Une approche extrêmement pratique et flexible lorsque vous en avez besoin.
Egel
15

Le nom de l'application est visible par l'utilisateur et c'est pourquoi Google vous encourage à le conserver dans votre fichier strings.xml. Vous pouvez définir un fichier de ressources de chaîne distinct contenant des chaînes spécifiques à vos buildTypes. Il semble que vous ayez un qabuildType personnalisé . Si ce n'est pas vrai, ignorez la partie qa ci-dessous.

└── src
    ├── debug
       └── res
           └── buildtype_strings.xml
    ├── release
       └── res
           └── buildtype_strings.xml
    └── qa
        └── res
            └── buildtype_strings.xml
Krylez
la source
1
cela a-t-il déjà fonctionné pour vous? J'ai documenté mon exemple, et cela ne fonctionne pas ... stackoverflow.com/questions/26032950/…
volkersfreunde
ce sont des saveurs pas des types de construction
Georgian Benetatos
13

Nous avons besoin d'une solution pour prendre en charge le nom de l'application avec la localisation (pour plusieurs langues). J'ai testé avec la solution @Nick Unuchek, mais la construction a échoué (introuvable @ string /). un petit changement pour corriger ce bogue: fichier build.gradle:

android {
    ext{
        APP_NAME = "@string/app_name_default"
        APP_NAME_DEV = "@string/app_name_dev"
    }

    productFlavors{

        prod{
            manifestPlaceholders = [ applicationLabel: APP_NAME]
        }

        dev{
            manifestPlaceholders = [ applicationLabel: APP_NAME_DEV ]
        }

    }

valeurs \ strings.xml:

<resources>
    <string name="app_name_default">AAA prod</string>
    <string name="app_name_dev">AAA dev</string>

</resources>

values-en \ strings.xml:

<resources>
    <string name="app_name_default">AAA prod en</string>
    <string name="app_name_dev">AAA dev en</string>

</resources>

Manifest.xml:

<application
    android:label="${applicationLabel}" >
</application>
HungNM2
la source
Un jeu comme "Need for Speed" par exemple ne s'appellera jamais "Bedürfnis nach Geschwindigkeit" en Allemagne. À moins qu'il ne s'agisse d'une arnaque d'un développeur douteux ...
L'incroyable
Ça marche. Merci beaucoup. Cependant, dans mon cas, je dois ajouter 1 plus tools:replace="android:label"en applicationenAndroidManifest
Phan Van Linh
5

Pour une solution plus dynamique basée sur le gradle (par exemple, définissez un nom d'application de base dans main's strings.xmlune fois, et évitez de vous répéter dans chaque combinaison saveur / type de construction strings.xml), voir ma réponse ici: https://stackoverflow.com/a/32220436/1128600

Steffen Funke
la source
2

Vous pouvez utiliser strings.xmldans différents dossiers, voir les valeurs de chaîne séparées Android pour les versions de version et de débogage .

Alors, créez ce fichier:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Your app name</string>
</resources>

Puis collez-le dans les dossiers app\src\debug\res\values\et app\src\release\res\values\. Remplacez "le nom de votre application" dans les fichiers de débogage et de version. Supprimer l' app_nameélément de strings.xmldansapp\src\main\res\values\ le dossier.

En AndroidManifestvous aurez le même

<application
    android:label="@string/app_name"
    ...

Aucun changement du tout. Même si vous avez ajouté une bibliothèque avec son AndroidManifestfichier et strings.xml.

CoolMind
la source
1

Comme l'auteur demande à faire cela dans Gradle , nous pouvons supposer qu'il veut le faire dans le script et non dans les fichiers de configuration. Étant donné qu'Android Studio et Gradle ont été fortement mis à jour et modifiés au cours de la dernière année (~ 2018), toutes les autres réponses ci-dessus semblent trop déformées. La solution la plus simple consiste à ajouter les éléments suivants à votre app/build.gradle:

android {
    ...
    buildTypes {
        ...
        // Rename/Set default APK name prefix (app*.apk --> AwesomeApp*.apk)
        android.applicationVariants.all { variant ->
            variant.outputs.all { output ->
                def appName = "AwesomeApp"
                outputFileName = appName+"-${output.baseName}-${variant.versionName}.apk"
        }
    }
}
not2qubit
la source