So ändern Sie den App-Namen pro Gradle-Build-Typ

135

Ich versuche herauszufinden, wie ich den App-Namen meiner Anwendung pro Build-Typ in Gradle ändern kann.

Zum Beispiel möchte ich die Debug-Version <APP_NAME>-debugund die QA-Version haben <APP-NAME>-QA.

Ich bin vertraut mit:

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

Ich kann jedoch scheinbar keinen Gradle-Befehl finden, um die Änderung der App im Launcher anzuwenden.

Andre Perkins
quelle

Antworten:

167

Wenn von „App - Namen“, meinen Sie android:labelauf <application>, die einfachste Lösung ist , dass Punkt in einer String - Ressource haben ( zum Beispiel android:label="@string/app_name"), haben dann eine andere Version dieser Zeichenfolge - Ressource in einem src/debug/sourceSet.

Sie können das in diesem Beispielprojekt sehen, in dem ich einen Ersatz für app_namein habe src/debug/res/values/strings.xml, der für debugBuilds angewendet wird . releaseBuilds verwenden die Version von app_namein src/main/.

CommonsWare
quelle
Würde diese Lösung nicht bedeuten, dass wir für jede Übersetzung eine zusätzliche string.xml hinzufügen müssten? das könnte ein Schmerz werden, um aufrechtzuerhalten ...
sfera
7
@sfera: Zunächst können Sie diese Zeichenfolge in einer eigenen Ressourcendatei isolieren, wenn Sie möchten. Zweitens ist dies nur für eine Zeichenfolge. Drittens gilt dies nur für die Build-Typen, bei denen Sie diese Zeichenfolge ersetzen möchten. Viertens: Wenn Sie kein Entwicklungsteam ohne gemeinsame Sprache haben, müssen Sie keine releaseZeichenfolgen übersetzen .
CommonsWare
Das Isolieren der Saite klingt nach einer guten Idee. Dank dafür! Was den Nicht- releaseTeil betrifft , sehe ich das etwas anders, da man möglicherweise auch auf Lokalisierungsprobleme testen möchte, während die Builds "release" und "test" auf demselben Gerät koexistieren können. In einem solchen Fall erhalten beide Builds möglicherweise dasselbe Launcher-Label, was wahrscheinlich zu Verwirrung führt. Das wollte ich vermeiden.
Sfera
1
@sfera: "Das habe ich versucht zu vermeiden" - also übersetze diesen einen String nicht. Der Test für diese Zeichenfolge ist ohnehin ungültig, da es sich per Definition nicht um die Zeichenfolge handelt, die Sie im releaseModus verwenden möchten . Verwenden Sie diese Zeichenfolgenressource nur für app_name, nicht für eine andere Rolle.
CommonsWare
3
@sfera: Sie werden niemals eine App mit "AppNom-DEBUG" versenden. Sie können eine App mit "AppNom" versenden. Das Testen von "AppNom-DEBUG" ist daher nicht erforderlich. Sie können natürlich gerne eine Debug-Version von übersetzen app_name, auch wenn dies nicht erforderlich ist (z. B. haben Sie französische oder deutsche Entwickler, die kein Englisch sprechen und daher übersetzt werden müssen). Testen Sie zum Testen, ob die unveränderte releaseVersion von app_namefunktioniert, mit ihren Übersetzungen den releaseBuild oder erstellen Sie einen near-releaseBuild-Typ, der nur das App-ID-Suffix hinzufügt und die Zeichenfolgen in Ruhe lässt.
CommonsWare
159

Sie können so etwas verwenden

 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"
    }
}

Sie können @ string / app_name in AndroidManifest.xml-Dateien verwenden.

Stellen Sie sicher, dass Sie app_name aus values ​​/ folder entfernen (kein Eintrag mit diesem Namen).

irscomp
quelle
Perfekt, wenn der Name der App aus einer externen Datei gelesen werden muss
Joe Maher
Beim Erstellen auf diese Weise ist ein Fehler aufgetreten. Ausführung für Aufgabe ': app: mergeDebugResources' fehlgeschlagen. Doppelte Ressourcen: res / values ​​/ strings.xml: string / app_name
user2010496
5
Wenn Sie Folgendes erhalten: Beim Erstellen auf diese Weise ist ein Fehler aufgetreten. Die Ausführung der Aufgabe ': app: mergeDebugResources' ist fehlgeschlagen. Doppelte Ressourcen: res / values ​​/ strings.xml: string / app_name sollten Sie wie folgt ausführen: "Stellen Sie sicher, dass Sie app_name aus values ​​/ folder entfernen (kein Eintrag mit diesem Namen) ). "
ivan.panasiuk
Ich mag dies, weil die String-Ordner-Lösung (die oben akzeptierte Lösung) nur funktioniert, wenn der App-Name für einen bestimmten Quellensatz / eine bestimmte Produktvariante definiert ist. In meinem Fall richte ich einen Jenkins-Pipeline-Job ein, um verschiedene Versionen unserer App automatisch mit unterschiedlichen Namen zu erstellen, und nicht für alle diese Namen sind productFlavors definiert. Also liefert Jenkins den App-Namen einfach über die Umgebung und gradle liest ihn:resValue "string", "app_name", System.getenv("APP_NAME") ?: "MyApp"
Aphex
Wenn ich app_name aus dem String-Ordner entfernt habe, wird beim Kompilieren ein Fehler angezeigt. Fehler: Die Ausführung der Aufgabe ': app: processDevDebugManifest' ist fehlgeschlagen. > Manifest Fusion mit mehreren Fehlern fehlgeschlagen, siehe Protokolle
aj0822ArpitJoshi
55

Sie können dies mit gradle tun:

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

Dann in Ihrem 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>

Hinweis: Es funktioniert auch mit productFlavors.

Albert Vila Calvo
quelle
Fehler erhalten -Error: Ausführung für Task ': app: processDevDebugManifest' fehlgeschlagen. > Manifest Fusion mit mehreren Fehlern fehlgeschlagen, siehe Protokolle
aj0822ArpitJoshi
NICHT ARBEITEN --- buildTypes {release {minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro'} debug {manifestPlaceholders = [appName: "GridL Debug"] applicationIdSuffix ".dev1"}}
JSONParser
44

Um Übersetzungen zu unterstützen, gehen Sie wie folgt vor:

1. Entfernen Sie die Zeichenfolge "app_name".

2. Zum Gradle hinzufügen

 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. Legen Sie den App-Namen im Manifest als "@ string / app_name" fest.

4. Fügen Sie Werte zu strings.xml hinzu

<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
quelle
Was sind die verschiedenen Arten von Build-Typen? Anders als Admin, Release und Debug?
Dinesh
@ DineshVG können Sie Differenz selbst einstellen, zum Beispiel andere applicationId
NickUnuchek
Ich möchte den UIAutomator-Test in einer anderen Build-Konfiguration als dem Debuggen mit anderen Pro-Guard-Regeln verwenden. Ist das möglich ?
Dinesh
Dies sollte die akzeptierte Antwort sein, die für mich großartig funktioniert hat
Oleg Dater
Dieser Ansatz gefällt mir sehr gut, da Sie damit sogar eine benutzerdefinierte Datei app_nameim Abschnitt productFlavors hinzufügen können build.gradle. Ein äußerst bequemer und flexibler Ansatz, wenn Sie ihn brauchen.
Egel
15

Der App-Name ist für den Benutzer sichtbar. Aus diesem Grund empfiehlt Google, ihn in Ihrer Datei strings.xml zu behalten. Sie können eine separate Zeichenfolgendatei definieren, die Zeichenfolgen enthält, die für Ihre buildTypes spezifisch sind. Es hört sich so an, als hätten Sie einen benutzerdefinierten qabuildType. Wenn dies nicht der Fall ist, ignorieren Sie den folgenden Qa-Teil.

└── src
    ├── debug
       └── res
           └── buildtype_strings.xml
    ├── release
       └── res
           └── buildtype_strings.xml
    └── qa
        └── res
            └── buildtype_strings.xml
Krylez
quelle
1
Hat das jemals für dich funktioniert? Ich habe mein Beispiel dokumentiert und es funktioniert nicht ... stackoverflow.com/questions/26032950/…
volkersfreunde
Dies sind Aromen, die keine Typen bauen
Georgian Benetatos
13

Wir benötigen eine Lösung zur Unterstützung des App-Namens bei der Lokalisierung (für mehrere Sprachen). Ich habe mit der @ Nick Unuchek-Lösung getestet, aber die Erstellung ist fehlgeschlagen (@ string / nicht gefunden). eine kleine Änderung, um diesen Fehler zu beheben: build.gradle-Datei:

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 ]
        }

    }

values ​​\ strings.xml:

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

</resources>

values-de \ 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
quelle
Ein Spiel wie "Need for Speed" zum Beispiel wird in Deutschland niemals "fäh nach nach" genannt. Es sei denn, es ist eine Abzocke von einem zweifelhaften Entwickler ...
Der unglaubliche
Es funktioniert. Ich danke dir sehr. In meinem Fall muss ich jedoch noch 1 tools:replace="android:label"in applicationinAndroidManifest
Phan Van Linh
5

Eine dynamischere gradle-basierte Lösung (z. B. einmal einen Basisanwendungsnamen in main festlegen strings.xmlund vermeiden, sich in jeder Kombination aus Geschmack und Build-Typ zu wiederholen) finden Sie in strings.xmlmeiner Antwort hier: https://stackoverflow.com/a/32220436/1128600

Steffen Funke
quelle
2

Sie können strings.xmlin verschiedenen Ordnern verwenden, siehe Android separate Zeichenfolgenwerte für Release- und Debug-Builds .

Erstellen Sie also diese Datei:

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

Fügen Sie es dann in app\src\debug\res\values\und app\src\release\res\values\Ordner ein. Ersetzen Sie "Ihr App-Name" in Debug- und Release-Dateien. Entfernen app_nameArtikel aus strings.xmlin app\src\main\res\values\Ordnern.

In AndroidManifestdir wirst du das gleiche haben

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

Überhaupt keine Änderungen. Auch wenn Sie eine Bibliothek mit der AndroidManifestDatei und hinzugefügt haben strings.xml.

CoolMind
quelle
1

Wenn der Autor dies in Gradle verlangt , können wir davon ausgehen, dass er dies im Skript und nicht in den Konfigurationsdateien tun möchte. Da sowohl Android Studio als auch Gradle im letzten Jahr (~ 2018) stark aktualisiert und modifiziert wurden, scheinen alle anderen oben genannten Antworten übermäßig verzerrt zu sein. Der einfachste Weg ist, Folgendes zu Ihrem hinzuzufügen 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
quelle