Як надати різні піктограми програм Android для різних типів збірки gradle?


101

У моєму файлі 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'])
}


Відповіді:


158

Зрозумів це. Що вам потрібно зробити, це створити окрему папку 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 я не робив. Здавалося б, оскільки налагодження є вбудованим типом збірки, набір джерел для нього також є вбудованим.
InsanityOnAB

1
@Scott Це працює для мене за допомогою "налагодження", якщо я просто поміщаю свою піктограму в кожну папку, яку можна малювати. Наприклад drawable-mdpi, drawable-hdpi тощо. Мені не потрібні інші ресурси чи код у папці налагодження.
roarster

2
працює як шарм. Просто довелося скопіювати всі каталоги mipmap у папці для налагодження
Аміт Бхандарі,

1
Як отримати іншу назву програми?
DKV

90

Це зручний підхід, хоча у нього є важливий мінус ... обидва пускові установки будуть додані у ваш 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.
Bartek Lipinski

-_- # Це проблема, я оновлюю it.The кращий спосіб: -> stackoverflow.com/a/22876224/703225
qinmiao

2
чому це важливий мінус? для мене це не виглядає надто важливим, і це гарне і чисте рішення
градації

2
Я друге запитання @ luky. Чому це мінус? Я вважаю, що додавання додаткових каталогів верхнього рівня (у мене в проекті чотири різні варіанти збірки) є менш чистим, ніж використання заповнювачів маніфесту. Особливо, коли ці каталоги містять лише одну піктограму.
GregSantulli

Якщо ви хочете скористатися цим способом і припинити додавати обидві піктограми до робочого файлу .apk, ви можете встановити manifestPlaceholdersєдиний на етапі виконання або позаду та ifоператор. Я роблю це, тому що у мене є 1 невиробничий тип збірки, який може мати дві різні піктограми (і я не хочу мати цілий тип збірки з лише 1 різницею з іншим)
Nahuel Barrios

11

Ви також можете вказати піктограму в частковому файлі смаку продукту 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
Перевірте питання. "Чи є якийсь спосіб цього просто за допомогою типу збірки, не потрапляючи в аромати продуктів ?"
InsanityOnAB,

4
Хоча це не так, як просили, але мені дуже допомогло! ~ з використанням ароматів ~
Flummox - не будь злим SE

2
Найкращий спосіб це зробити, якщо у вас вже є файли маніфестів, що відповідають смаку.
Zax

Це єдине рішення, яке я бачив на сьогоднішній день, де ви можете зберегти унікальні імена для піктограм панелі запуску .. порівняно з наявністю 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 (Модуль: додаток) тип збірки в android -> buildTypes -> налагодження, внутрішній тощо

В ієрархії проекту, під Android, клацніть правою кнопкою миші на програмі -> Новий -> Актив зображення -> у Шлях виберіть свою піктограму -> будь-які інші зміни у фоновому шарі та спадщині -> Далі -> у каталозі Res виберіть потрібний тип збірки ( налагодження, внутрішній, основний тощо) -> Готово

Таким чином піктограми замінять кожну вашу стару піктограму.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.