Come fornire diverse icone di app Android per diversi tipi di build gradle?


101

Ho due tipi di build impostati nel mio file gradle: debuge release. Mi piacerebbe poter impostare un'icona dell'app diversa per il debugtipo di build. C'è un modo per farlo solo attraverso il tipo di build, senza entrare nei gusti del prodotto? Il file build.gradle è di seguito.

apply plugin: 'android'

//...

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 30
        versionName "2.0"
    }
    buildTypes {
        debug {
            packageNameSuffix '.debug'
            versionNameSuffix '-SNAPSHOT'
        }
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}


Risposte:


157

Capito. Quello che devi fare è creare una cartella src separata chiamata debugche contiene le diverse icone. Ad esempio, se il layout del progetto è il seguente e l'icona del programma di avvio è chiamata ic_launcher.png:

[Project Root]
  -[Module]
    -src
      -main
        -res
          -drawable-*
            -ic_launcher.png

Quindi, per aggiungere un'icona separata per il tipo di build di debug, aggiungi:

[Project Root]
  -[Module]
    -src
      -main
        -res
          -drawable-*
            -ic_launcher.png
      -debug
        -res
          -drawable-*
            -ic_launcher.png

Quindi, quando si crea con il tipo di build di debug, utilizzerà ic_launcher che si trova nella cartella di debug.


Non è stato necessario specificare la cartella di debug aggiuntiva con una dichiarazione sourceSets?
ncoronges

1
@ncoronges non l'ho fatto. Sembrerebbe che dal momento che il debug è un tipo di build integrato, anche il set di sorgenti per esso è integrato.
InsanityOnABun

1
@Scott Funziona per me usando "debug" se metto la mia icona in ogni cartella disegnabile. Ad esempio drawable-mdpi, drawable-hdpi, ecc. Non ho bisogno di nessuna delle altre risorse o codice nella cartella di debug.
Roarster

2
funziona come un fascino. Dovevo solo copiare tutte le directory mipmap nella cartella di debug
Amit Bhandari

1
Come avere un nome diverso per l'app?
DKV

90

Questo è un approccio pratico anche se ha un aspetto negativo importante ... entrambi i lanciatori verranno inseriti nel tuo apk. - Bartek Lipinski

Il modo migliore: la risposta di InsanityOnABun

AndroidManifest.xml

<manifest 

    ...
        <application
        android:allowBackup="true"
        android:icon="${appIcon}"
        android:roundIcon="${appIconRound}"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

    ...

    </application>

</manifest>

build.gradle

android {

    ...
        productFlavors{
        Test{
            versionName "$defaultConfig.versionName" + ".test"
            resValue "string", "app_name", "App-Test"
            manifestPlaceholders = [
                    appIcon: "@mipmap/ic_launcher_test",
                    appIconRound: "@mipmap/ic_launcher_test_round"
            ]
        }

        Product{
            resValue "string", "app_name", "App"
            manifestPlaceholders = [
                    appIcon: "@mipmap/ic_launcher",
                    appIconRound: "@mipmap/ic_launcher_round"
            ]
        }
    }
}

l'URL di Github: crea un'app multi-versione con Gradle


1
Questo è un approccio pratico anche se ha un aspetto negativo importante ... entrambi i lanciatori verranno inseriti nel tuo apk.
Bartek Lipinski,

-_- # E 'un problema, aggiorno it.the modo migliore: -> stackoverflow.com/a/22876224/703225
qinmiao

2
perché è importante svantaggio? non sembra troppo importante per me, ed è un bene e la soluzione Gradle pulita
Luky

2
Secondo la domanda di @ luky. Perché questo è uno svantaggio? Penserei che l'aggiunta di directory di primo livello aggiuntive (ho quattro diverse varianti di build nel mio progetto) sia meno pulita rispetto all'utilizzo di segnaposto manifest. Soprattutto quando quelle directory contengono solo una singola icona.
GregSantulli

Se vuoi usare in questo modo e smettere di aggiungere entrambe le icone all'APK di produzione, puoi impostare l' manifestPlaceholdersunico in fase di esecuzione o dietro e ifdichiarazione. Lo sto facendo perché ho 1 tipo di build non di produzione che può avere due icone diverse (e non voglio avere un intero tipo di build con solo 1 differenza con l'altro)
Nahuel Barrios

11

Puoi anche specificare l'icona nel file AndroidManifest.xml parziale dell'aroma del prodotto:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">
    <application
        tools:replace="android:icon"
        android:icon="@drawable/alternative_icon" />
</manifest>

Ciò sovrascriverà l'icona specificata nel file AndroidManifest.xml originale


4
Controlla la domanda. "C'è un modo per farlo solo attraverso il tipo di build, senza entrare nei gusti del prodotto ?"
InsanityOnABun

4
Anche se non come richiesto, mi ha aiutato molto! ~ usando i sapori ~
Flummox - non essere cattivo SE

2
Il modo migliore per farlo, se hai già file manifest specifici per il gusto.
Zax

Questa è l'unica soluzione che ho visto finora in cui è possibile mantenere nomi univoci per le icone di avvio .. rispetto a 10+ versioni di ic_launcher.png, dover sapere quale è quale solo da dove si trova o effettivamente aprendolo (non così simpatico). Non sapevo che questo tipo di estensione per il file manifest fosse possibile, non l'ho visto menzionato da nessun'altra parte su SO o in altro modo prima qui. Elegante di sicuro
Gene Bo

6

Per ottenere icone diverse durante l'utilizzo di gusti diversi con più dimensioni, come:

flavorDimensions "color", "size"
productFlavors {
    black {
        dimension "color"
    }
    white {
        dimension "color"
    }

    big {
        dimension "size"
    }
    small {
        dimension "size"
    }
}

Ciò può essere ottenuto come:

Innanzitutto, metti le risorse di debug in cartelle separate, come ad esempio:

src/blackDebug/res
src/whiteDebug/res

In secondo luogo, mettere la chiave con più dimensioni di sapore è che il nome del set di fonti deve contenere tutte le possibili combinazioni di sapori, anche se alcune di queste dimensioni non influenzano l'icona.

sourceSets {
    // Override the icons in debug mode
    blackBigDebug.res.srcDir 'src/blackDebug/res'
    blackSmallDebug.res.srcDir 'src/blackDebug/res'
    whiteBigDebug.res.srcDir 'src/whiteDebug/res'
    whiteSamllDebug.res.srcDir 'src/whiteDebug/res'
}

Giusto per chiarire, quanto segue non funzionerà quando sono in uso più dimensioni:

sourceSets {
    // Override the icons in debug mode
    blackDebug.res.srcDir 'src/blackDebug/res'
    whiteDebug.res.srcDir 'src/whiteDebug/res'
}

Non sono sicuro di come questo potrebbe aiutare poiché l'icona di avvio è dichiarata nel file manifest. Puoi affrontare questo problema?
David Rector

3
Il nome della risorsa è dichiarato nel manifest, ma puoi avere icone diverse con gli stessi nomi di file in cartelle specifiche del gusto diverse come descritto nel mio post.
Jose Gómez

0

Soluzione passo passo, inclusa la sostituzione di mipmap-anydpi-v26 e la conservazione dei file per tutte le dimensioni:

Definisci prima in build.gradle (Modulo: app) il tuo tipo di build in Android -> buildTypes -> debug, interno, ecc

Nella gerarchia del progetto, sotto Android, fai clic con il pulsante destro del mouse su app -> Nuovo -> Asset immagine -> in Path scegli la tua icona -> qualsiasi altra modifica su Background Layer e Legacy -> Avanti -> in Res Directory scegli il tipo di build desiderato ( debug, interno, principale, ecc.) -> Fine

In questo modo le icone sostituiranno ogni vecchia icona che avevi.

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.