Jak zapewnić różne ikony aplikacji na Androida dla różnych typów kompilacji Gradle?

103

Mam dwa typy kompilacji ustawione w moim pliku gradle: debugi release. Chciałbym móc ustawić inną ikonę aplikacji dla debugtypu kompilacji. Czy istnieje sposób na to tylko poprzez typ kompilacji, bez wchodzenia w smaki produktu? build.gradle znajduje się poniżej.

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'])
}
InsanityOnABun
źródło

Odpowiedzi:

160

Domyśliłam się. To, co musisz zrobić, to utworzyć oddzielny folder src o nazwie, debugktóry zawiera różne ikony. Na przykład, jeśli układ projektu wygląda następująco, a ikona programu uruchamiającego nazywa się ic_launcher.png:

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

Następnie, aby dodać oddzielną ikonę dla typu kompilacji do debugowania, dodaj:

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

Następnie, gdy budujesz w typie kompilacji debugowania, użyje on ic_launcher znalezionego w folderze debugowania.

InsanityOnABun
źródło
Czy nie trzeba było określać dodatkowego folderu debugowania z deklaracją sourceSets?
ncoronges
1
@ncoronges Nie zrobiłem. Wydawałoby się, ponieważ debugowanie jest wbudowanym typem kompilacji, ustawione dla niego źródła również są wbudowane.
InsanityOnABun
1
@Scott U mnie działa przy użyciu opcji „debug”, jeśli po prostu umieszczę swoją ikonę w każdym folderze do rysowania. Np. Drawable-mdpi, drawable-hdpi itp. Nie potrzebuję żadnych innych zasobów ani kodu w folderze debugowania.
ryk
3
działa jak urok. Wystarczyło skopiować wszystkie katalogi mipmap w folderze debugowania
Amit Bhandari
1
Jak mieć inną nazwę aplikacji?
DKV
94

Jest to przydatne podejście, chociaż ma ważną wadę ... oba wyrzutnie zostaną umieszczone w twoim apk. - Bartek Lipiński

Lepszy sposób: odpowiedź 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"
            ]
        }
    }
}

adres URL Github: Stwórz aplikację w wielu wersjach za pomocą Gradle

qinmiao
źródło
1
Jest to przydatne podejście, chociaż ma ważną wadę ... oba wyrzutnie zostaną umieszczone w twoim apk.
Bartek Lipiński
-_- # To problem, aktualizuję go. Lepszy sposób: -> stackoverflow.com/a/22876224/703225
qinmiao
2
dlaczego jest to ważny minus? nie wygląda to dla mnie zbyt ważne i jest to dobre i czyste rozwiązanie
gradle
2
Drugie pytanie @ luky. Dlaczego to wada? Wydaje mi się, że dodawanie dodatkowych katalogów najwyższego poziomu (mam w projekcie cztery różne warianty kompilacji) jest mniej przejrzyste niż używanie symboli zastępczych manifestu. Zwłaszcza, gdy te katalogi zawierają tylko jedną ikonę.
GregSantulli
Jeśli chcesz skorzystać z tego sposobu i przestać dodawać obie ikony do produkcyjnego APK, możesz ustawić manifestPlaceholderstylko w fazie wykonywania lub za i ifoświadczenie. Robię to, ponieważ mam 1 nieprodukcyjny typ kompilacji, który może mieć dwie różne ikony (i nie chcę mieć całego typu konstrukcji z tylko jedną różnicą w stosunku do drugiego)
Nahuel Barrios
12

Możesz również określić ikonę w częściowym pliku AndroidManifest.xml smaku produktu:

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

Spowoduje to zastąpienie ikony określonej w oryginalnym pliku AndroidManifest.xml

isyi
źródło
4
Sprawdź pytanie. „Czy istnieje sposób na to tylko poprzez typ kompilacji, bez wchodzenia w smaki produktu ?”
InsanityOnABun
4
Chociaż nie o to proszono, bardzo mi pomogło! ~ używając smaków ~
Flummox - Don't be evil SE
2
Najlepiej to zrobić, jeśli masz już pliki manifestu specyficzne dla smaku.
Zax,
Jest to jedyne rozwiązanie, jakie do tej pory widziałem, w którym można zachować unikalne nazwy ikon programu uruchamiającego .. w porównaniu z posiadaniem ponad 10 wersji programu ic_launcher.png, koniecznością poznania, która z nich jest która tylko według tego, gdzie się znajduje lub faktycznie ją otwiera (nie tak miły). Nie wiedziałem, że tego rodzaju rozszerzenie pliku manifestu jest nawet możliwe, nie widziałem, aby wspomniano o tym nigdzie indziej w SO ani w innym miejscu wcześniej. Na pewno eleganckie
Gene Bo
6

Aby uzyskać różne ikony, używając różnych smaków z wieloma wymiarami, takich jak:

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

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

Można to osiągnąć jako:

Najpierw umieść zasoby debugowania w oddzielnych folderach, takich jak:

src/blackDebug/res
src/whiteDebug/res

Po drugie, wstaw klucz z wieloma wymiarami smaku, że nazwa zestawu źródeł musi zawierać wszystkie możliwe kombinacje smaków, nawet jeśli niektóre z tych wymiarów nie wpływają na ikonę.

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

Aby było jasne, poniższe elementy nie będą działać, gdy używanych jest wiele wymiarów:

sourceSets {
    // Override the icons in debug mode
    blackDebug.res.srcDir 'src/blackDebug/res'
    whiteDebug.res.srcDir 'src/whiteDebug/res'
}
Jose Gómez
źródło
Nie jestem pewien, jak to pomogłoby, ponieważ ikona uruchamiania jest zadeklarowana w pliku manifestu. Czy możesz rozwiązać ten problem?
David Rector
3
Nazwa zasobu jest zadeklarowana w manifeście, ale możesz mieć różne ikony z tymi samymi nazwami plików w różnych folderach specyficznych dla smaku, jak opisano w moim poście.
Jose Gómez
0

Rozwiązanie krok po kroku, w tym wymiana mipmap-anydpi-v26 i przechowywanie plików dla wszystkich wymiarów:

Najpierw zdefiniuj w build.gradle (Module: app) swój typ kompilacji w systemie Android -> buildTypes -> debug, internal, etc

W hierarchii projektu, poniżej Androida, kliknij prawym przyciskiem myszy aplikację -> Nowy -> Zasób obrazu -> w ścieżce wybierz swoją ikonę -> wszelkie inne zmiany w warstwie tła i starszej wersji -> Dalej -> w katalogu Res wybierz żądany typ kompilacji ( debugowanie, wewnętrzne, główne itp.) -> Zakończ

W ten sposób ikony zastąpią wszystkie stare ikony.

Robert Pal
źródło