Как предоставить разные значки приложений Android для разных типов сборки gradle?


103

В моем файле gradle установлено два типа сборки: debugи release. Я хотел бы иметь возможность установить другой значок приложения для debugтипа сборки. Есть ли способ сделать это только через тип сборки, не вдаваясь в вкусы продукта? Файл build.gradle находится ниже.

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


Ответы:


160

Догадаться. Что вам нужно сделать, так это создать отдельную папку src, debugкоторая будет содержать различные значки. Например, если макет вашего проекта выглядит следующим образом, и ваш значок запуска называется ic_launcher.png:

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

Затем, чтобы добавить отдельный значок для типа сборки отладки, вы добавляете:

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

Затем, когда вы выполняете сборку с типом сборки отладки, он будет использовать ic_launcher, найденный в папке отладки.


Вам не нужно было указывать дополнительную папку отладки с объявлением sourceSets?
ncoronges

1
@ncoronges Я не делал. Казалось бы, поскольку отладка - это встроенный тип сборки, исходный набор для нее также встроен.
InsanityOnABun

1
@Scott У меня работает «отладка», если я просто помещаю свой значок в каждую доступную папку. Например, drawable-mdpi, drawable-hdpi и т. Д. Мне не нужны никакие другие ресурсы или код в папке отладки.
roarster

3
работает как шарм. Просто нужно было скопировать все каталоги mipmap в папку отладки
Амит Бхандари

1
Как изменить название приложения?
DKV

94

Это удобный подход, хотя у него есть важный недостаток ... обе программы запуска будут помещены в ваш apk. - Бартек Липински

Лучший способ: ответ 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"
            ]
        }
    }
}

URL-адрес Github: создание мультиверсионного приложения с помощью Gradle


1
Это удобный подход, хотя у него есть важный недостаток ... обе программы запуска будут помещены в ваш apk.
Бартек Липински

-_- # Это проблема, я обновляю его. Лучший способ: -> stackoverflow.com/a/22876224/703225
qinmiao 01

2
почему важна обратная сторона? мне это не кажется слишком важным, и это хорошее и чистое решение для
Gradle

2
Второй вопрос @luky. Почему это недостаток? Я бы подумал, что добавление дополнительных каталогов верхнего уровня (у меня есть четыре разных варианта сборки в моем проекте) менее чисто, чем использование заполнителей манифеста. Особенно, когда эти каталоги содержат только один значок.
GregSantulli

Если вы хотите использовать этот способ и прекратить добавление обоих значков в рабочий APK, вы можете установить manifestPlaceholdersтолько на этапе выполнения или за ifоператором и. Я делаю это, потому что у меня есть 1 непроизводственный тип сборки, который может иметь два разных значка (и я не хочу иметь весь тип сборки с одним отличием от другого)
Науэль Барриос,

12

Вы также можете указать значок в частичном файле AndroidManifest.xml продукта:

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

Это перезапишет значок, указанный в исходном файле AndroidManifest.xml.


4
Отметьте вопрос. «Есть ли способ сделать это только с помощью типа сборки, не вдаваясь в вкусы продуктов
InsanityOnABun

4
Хотя не так, как просили, мне очень помогло! ~ используя ароматы ~
Flummox - don't be evil SE

2
Лучший способ сделать это, если у вас уже есть файлы манифеста для конкретных вкусов.
Zax 06

Это единственное решение, которое я видел до сих пор, где вы можете поддерживать уникальные имена для значков пусковой установки ... вместо того, чтобы иметь 10+ версий ic_launcher.png, нужно знать, какая из них какая, только по тому, где она находится, или фактически открывая ее (не так отлично). Я не знал, что такое расширение файла манифеста вообще возможно, я не видел, чтобы об этом упоминалось где-либо еще на SO или иным образом раньше здесь. Безусловно элегантно
Джин Бо

6

Для получения разных значков при использовании разных вкусов с несколькими размерами, например:

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

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

Это может быть достигнуто следующим образом:

Сначала поместите ресурсы отладки в отдельные папки, например:

src/blackDebug/res
src/whiteDebug/res

Во-вторых, ключ с несколькими измерениями вкуса состоит в том, что имя набора источников должно содержать все возможные комбинации вкусов, даже если некоторые из этих измерений не влияют на значок.

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

Чтобы было понятно, следующее не будет работать при использовании нескольких измерений:

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

Не уверен, как это поможет, поскольку значок запуска объявлен в файле манифеста. Можете ли вы решить эту проблему?
Дэвид Ректор

3
Имя ресурса объявлено в манифесте, но у вас могут быть разные значки с одинаковыми именами файлов в разных папках, зависящих от вкуса, как описано в моем сообщении.
Хосе Гомес

0

Пошаговое решение, включая замену mipmap-anydpi-v26 и сохранение файлов для всех измерений:

Сначала определите в build.gradle (Module: app) свой тип сборки в android -> buildTypes -> debug, internal и т. Д.

В иерархии проекта под Android щелкните правой кнопкой мыши приложение -> Создать -> Актив изображения -> в Пути выберите свой значок -> любые другие изменения на Фоновом слое и Наследии -> Далее -> в Каталоге Res выберите желаемый тип сборки ( отладка, внутренняя, основная и т. д.) -> Готово

Таким образом значки заменят все старые значки, которые у вас были.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.