Wie kann ich verschiedene Android-App-Symbole für verschiedene Gradle-Build-Typen bereitstellen?


99

In meiner Gradle-Datei sind zwei Build-Typen festgelegt: debugund release. Ich möchte in der Lage sein, ein anderes App-Symbol für den debugBuild-Typ festzulegen. Gibt es eine Möglichkeit, dies nur durch den Build-Typ zu erreichen, ohne auf Produktaromen einzugehen? Die Datei build.gradle befindet sich unten.

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


Antworten:


156

Herausgefunden. Sie müssen lediglich einen separaten src-Ordner mit debugden verschiedenen Symbolen erstellen . Wenn Ihr Projektlayout beispielsweise wie folgt lautet und Ihr Startsymbol aufgerufen wird ic_launcher.png:

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

Um ein separates Symbol für den Debug-Build-Typ hinzuzufügen, fügen Sie Folgendes hinzu:

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

Wenn Sie dann unter dem Debug-Build-Typ erstellen, wird der im Debug-Ordner gefundene ic_launcher verwendet.


Mussten Sie den zusätzlichen Debug-Ordner nicht mit einer sourceSets-Deklaration angeben?
Ncoronges

1
@ncoronges habe ich nicht. Da es sich bei Debug um einen integrierten Build-Typ handelt, ist auch der dafür festgelegte Quellensatz integriert.
InsanityOnABun

1
@Scott Es funktioniert für mich mit 'Debug', wenn ich nur mein Symbol in jeden zeichnbaren Ordner lege. ZB drawable-mdpi, drawable-hdpi usw. Ich benötige keine anderen Ressourcen oder Codes im Debug-Ordner.
Roarster

2
wirkt wie Charme. Musste nur alle Mipmap-Verzeichnisse in Debug-Ordner kopieren
Amit Bhandari

1
Wie habe ich einen anderen App-Namen?
DKV

89

Dies ist ein praktischer Ansatz, obwohl er einen wichtigen Nachteil hat ... beide Trägerraketen werden in Ihre apk aufgenommen. - Bartek Lipinski

Der bessere Weg: InsanityOnABuns Antwort

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

Die Github-URL: Erstellen Sie eine App mit mehreren Versionen mit Gradle


1
Dies ist ein praktischer Ansatz, obwohl er einen wichtigen Nachteil hat ... beide Trägerraketen werden in Ihre apk aufgenommen.
Bartek Lipinski

-_- # Es ist ein Problem, ich aktualisiere es. Der bessere Weg: -> stackoverflow.com/a/22876224/703225
qinmiao

2
Warum ist es ein wichtiger Nachteil? es sieht für mich nicht allzu wichtig aus und es ist eine gute und saubere Gradle-Lösung
luky

2
Ich stimme @ lukys Frage zu. Warum ist das ein Nachteil? Ich würde denken, dass das Hinzufügen zusätzlicher Verzeichnisse der obersten Ebene (ich habe vier verschiedene Build-Varianten in meinem Projekt) weniger sauber ist als das Verwenden von Manifest-Platzhaltern. Insbesondere, wenn diese Verzeichnisse nur ein einziges Symbol enthalten.
GregSantulli

Wenn Sie diese Methode verwenden und das Hinzufügen beider Symbole zur Produktions-APK beenden möchten, können Sie die manifestPlaceholderseinzige in der Ausführungsphase oder hinter und ifAnweisung festlegen . Ich mache das, weil ich einen nicht produktiven Build-Typ habe, der zwei verschiedene Symbole haben kann (und ich möchte keinen vollständigen Build-Typ mit nur einem Unterschied zum anderen haben)
Nahuel Barrios

11

Sie können das Symbol auch in der partiellen AndroidManifest.xml-Datei der Produktversion angeben:

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

Dadurch wird das Symbol überschrieben, das Sie in der ursprünglichen AndroidManifest.xml angegeben haben


4
Überprüfen Sie die Frage. "Gibt es eine Möglichkeit, dies nur durch den Build-Typ zu erreichen, ohne auf Produktaromen einzugehen ?"
InsanityOnABun

4
Obwohl nicht wie gefragt, hat mir sehr geholfen! ~ mit Aromen ~
Flummox - sei nicht böse SE

2
Der beste Weg, dies zu tun, wenn Sie bereits über geschmacksspezifische Manifestdateien verfügen.
Zax

Dies ist die einzige Lösung, die ich bisher gesehen habe, bei der Sie eindeutige Namen für die Startsymbole beibehalten können. Im Vergleich zu mehr als 10 Versionen ic_launcher.pngmüssen Sie wissen, welche welche ist, nur wo sie sich befindet oder sie tatsächlich öffnen (nicht so) nett). Ich wusste nicht, dass diese Art der Erweiterung für die Manifestdatei überhaupt möglich ist, habe sie noch nie zuvor auf SO oder anderswo erwähnt. Sicher elegant
Gene Bo

6

Zum Abrufen verschiedener Symbole bei Verwendung verschiedener Geschmacksrichtungen mit mehreren Dimensionen, z.

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

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

Dies kann erreicht werden als:

Legen Sie zunächst die Debug-Ressourcen in separaten Ordnern ab, z.

src/blackDebug/res
src/whiteDebug/res

Zweitens bedeutet der Schlüssel mit mehreren Geschmacksdimensionen, dass der Name des Quellensatzes alle möglichen Geschmackskombinationen enthalten muss, auch wenn einige dieser Dimensionen das Symbol nicht beeinflussen.

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

Um dies zu verdeutlichen, funktioniert Folgendes nicht, wenn mehrere Dimensionen verwendet werden:

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

Ich bin mir nicht sicher, wie dies helfen würde, da das Startsymbol in der Manifestdatei deklariert ist. Können Sie dieses Problem beheben?
David Rector

3
Der Ressourcenname wird im Manifest deklariert, aber Sie können verschiedene Symbole mit denselben Dateinamen in verschiedenen geschmacksspezifischen Ordnern verwenden, wie in meinem Beitrag beschrieben.
Jose Gómez

0

Schritt für Schritt Lösung, einschließlich Ersetzen von mipmap-anydpi-v26 und Speichern von Dateien für alle Dimensionen:

Definieren Sie zuerst in build.gradle (Modul: App) Ihren Build-Typ in Android -> buildTypes -> Debug, intern usw.

Klicken Sie in der Projekthierarchie unter Android mit der rechten Maustaste auf App -> Neu -> Image Asset -> Wählen Sie unter Pfad Ihr Symbol aus -> Alle anderen Änderungen an Hintergrundebene und Legacy -> Weiter -> Wählen Sie im Res-Verzeichnis den gewünschten Build-Typ aus ( Debug, intern, main usw.) -> Fertig stellen

Auf diese Weise ersetzen die Symbole jedes alte Symbol, das Sie hatten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.