Come modificare il nome dell'app per tipo di build Gradle


135

Sto cercando di capire un modo per poter cambiare il nome dell'app della mia applicazione per tipo di build in gradle.

Ad esempio, vorrei avere la versione di debug <APP_NAME>-debuge la versione di qa <APP-NAME>-QA.

Ho familiarità con:

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

Tuttavia, non riesco a trovare un comando gradle per applicare la modifica dell'app durante l'avvio.

Risposte:


167

Se per "nome applicazione", si intende android:labelil <application>, la soluzione più semplice è quella di avere quel punto in una risorsa di stringa (ad esempio, android:label="@string/app_name"), poi hanno una versione diversa di quella risorsa stringa in unsrc/debug/ sourceset.

Puoi vederlo in questo progetto di esempio , dove ho un sostituto di app_namein src/debug/res/values/strings.xml, che verrà applicato per le debugbuild. releasebuild utilizzerà la versione di app_namein src/main/.


questa soluzione non implicherebbe che dovremmo aggiungere un extra strings.xml per ogni traduzione? che potrebbe diventare un dolore da mantenere ...
sfera

7
@sfera: Innanzitutto, puoi isolare questa stringa nel suo file di risorse, se lo desideri. Secondo, questo è solo per una stringa. Terzo, questo è solo per i tipi di build in cui si desidera sostituire quella stringa. In quarto luogo, a meno che non si disponga di un team di sviluppo senza un linguaggio comune, non è necessario tradurre non releasestringhe.
Commons War

L'isolamento della corda sembra una buona idea. Grazie per quello! Per quanto riguarda il non- releaseparte, vedo che in modo leggermente diverso, come si potrebbe voler testare anche problemi di localizzazione, consentendo allo stesso tempo che le build "release" e "test" coesistano sullo stesso dispositivo. In tal caso, entrambe le build potrebbero finire con la stessa etichetta di avvio, probabilmente creando confusione. Questo è ciò che stavo cercando di evitare.
sfera

1
@sfera: "Questo è quello che stavo cercando di evitare" - quindi, non tradurre questa stringa. Il test su quella stringa non sarà comunque valido, poiché per definizione non è la stringa che si desidera utilizzare in releasemodalità. E usa solo questa risorsa stringa per app_name, non per nessun altro ruolo.
Commons War

3
@sfera: non spedirai mai un'app con "AppNom-DEBUG". È possibile spedire un'app con "AppNom". Il test di "AppNom-DEBUG", pertanto, non è necessario. Sei certamente il benvenuto a tradurre una versione di debug app_name, anche se non è necessario (ad esempio, hai sviluppatori francesi o tedeschi che non parlano inglese e quindi devono averlo tradotto). Per testare per vedere se la releaseversione non modificata di app_namefunziona, con le sue traduzioni, testare la releasebuild o creare un near-releasetipo di build che aggiunge semplicemente il suffisso ID app e lascia le stringhe da sole.
Commons War il

159

Puoi usare qualcosa del genere

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

Puoi usare @ string / nome_app nei file AndroidManifest.xml.

Assicurati di rimuovere app_name da valori / cartella (nessuna voce con questo nome).


Perfetto quando il nome dell'app deve essere letto da un file esterno
Joe Maher,

Si è verificato un errore durante la creazione in questo modo. Esecuzione non riuscita per l'attività ': app: mergeDebugResources' .. Risorse duplicate: res / valori / strings.xml: stringa / nome_app
user2010496

5
Se si ottiene: si è verificato un errore durante la creazione in questo modo. Esecuzione non riuscita per l'attività ': app: mergeDebugResources'. Risorse duplicate: res / valori / strings.xml: stringa / nome_app che dovresti fare, come la sua scritta: "Assicurati di rimuovere app_name da valori / cartella (nessuna voce con questo nome )."
ivan.panasiuk,

Mi piace perché la soluzione della cartella stringhe (la soluzione accettata, sopra) funziona solo se il nome dell'app è definito per un determinato set di origini / sapore del prodotto. Nel mio caso, sto configurando un processo Jenkins Pipeline per creare automaticamente diverse versioni della nostra app con nomi diversi e non tutti questi nomi hanno ProductFlavours definiti per loro. Quindi Jenkins fornisce semplicemente il nome dell'app tramite l'ambiente e Gradle lo legge:resValue "string", "app_name", System.getenv("APP_NAME") ?: "MyApp"
Aphex,

se ho rimosso app_name dalla cartella delle stringhe quindi ho ricevuto il tempo di compilazione dell'errore ottenendo l'errore -Errore: esecuzione non riuscita per l'attività ': app: processDevDebugManifest'. > Fusione manifest non riuscita con più errori, vedere i registri
aj0822ArpitJoshi

55

Puoi farlo con Gradle:

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

Quindi nel tuo 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>

Nota: funziona anche con productFlavors.


errore -Errore: esecuzione non riuscita per l'attività ': app: processDevDebugManifest'. > Fusione manifest non riuscita con più errori, vedere i registri
aj0822ArpitJoshi

NON FUNZIONANTE --- buildTypes {release {minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro'} debug {manifestPlaceholders = [nome app: "GridL Debug"] applicationIdSuffix ".
JSONParser

44

Per supportare le traduzioni, procedi come segue:

1. rimuovi la stringa "nome_app"

2. aggiungi al voto

 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. Impostare il nome dell'app in Manifest come "@ string / app_name"

4. Aggiungi ai valori 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>

Quali sono i diversi tipi di tipi di build? Altro che admin, rilascio e debug?
Dinesh,

@DineshVG puoi impostare la differenza da solo, ad esempio diversa applicazioneId
NickUnuchek

Voglio usare il test UIAutomator in un'altra configurazione di build diversa dal debug con diverse regole pro-guard. È possibile ?
Dinesh,

Questa dovrebbe essere la risposta accettata, ha funzionato alla grande per me
Oleg Dater il

Mi piace molto questo approccio perché permette anche di aggiungere una consuetudine app_namein productFlavors sezione del build.gradlefile. Un approccio estremamente conveniente e flessibile quando ne hai bisogno.
Egel,

15

Il nome dell'app è visibile all'utente ed è per questo che Google ti incoraggia a tenerlo nel tuo file strings.xml. È possibile definire un file di risorse stringa separato che contiene stringhe specifiche per buildTypes. Sembra che potresti avere un tipo di qabuild personalizzato . Se ciò non è vero, ignora la parte qa in basso.

└── src
    ├── debug
       └── res
           └── buildtype_strings.xml
    ├── release
       └── res
           └── buildtype_strings.xml
    └── qa
        └── res
            └── buildtype_strings.xml

1
ha mai funzionato per te? Ho documentato il mio esempio, e non funziona ... stackoverflow.com/questions/26032950/...
volkersfreunde

questi sono sapori che non costruiscono tipi
georgiano Benetatos

13

Abbiamo bisogno di una soluzione per supportare il nome dell'app con la localizzazione (per più lingue). Ho provato con la soluzione @Nick Unuchek, ma la costruzione non è riuscita (non trovata @ string /). una piccola modifica per correggere questo errore: file 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 ]
        }

    }

I valori \ strings.xml:

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

</resources>

I valori-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>

Un gioco come "Need for Speed", ad esempio, non sarà mai chiamato "Bedürfnis nach Geschwindigkeit" in Germania. A meno che non sia una fregatura da uno sviluppatore dubbioso ...
L'incredibile

Funziona. Grazie mille. Tuttavia, nel mio caso, devo aggiungere 1 altro tools:replace="android:label"in applicationinAndroidManifest
Phan Van Linh


2

Puoi usarlo strings.xmlin diverse cartelle, vedi Valori di stringhe separati per Android per build di rilascio e debug .

Quindi, crea questo file:

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

Quindi incollalo in app\src\debug\res\values\e app\src\release\res\values\cartelle. Sostituisci "Nome app" nei file di debug e di rilascio. Rimuovere app_nameelemento da strings.xmlin app\src\main\res\values\cartella.

In AndroidManifestte avrai lo stesso

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

Nessun cambiamento. Anche se hai aggiunto una libreria con il suo AndroidManifestfile e strings.xml.


1

Quando l'autore chiede di farlo in Gradle , possiamo presumere che voglia farlo nello script e non nei file di configurazione. Poiché sia Android Studio che Gradle sono stati pesantemente aggiornati e modificati nell'ultimo anno (~ 2018) tutte le altre risposte sopra, sembrano eccessivamente contorte. Il modo più semplice è aggiungere quanto segue al tuo 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"
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.