如何为不同的gradle buildTypes提供不同的Android应用程序图标?


99

我的gradle文件中设置了两种构建类型:debugrelease。我希望能够为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'])
}


Answers:


156

弄清楚了。您需要做的是创建一个单独的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 2014年

1
@ncoronges我没有。由于debug是内置的构建类型,因此它的源集也是内置的。
InsanityOnABun 2014年

1
@Scott如果我仅将图标放在每个可绘制文件夹中,它将对我有效,使用“调试”功能。例如drawable-mdpi,drawable-hdpi等。我在debug文件夹中不需要任何其他资源或代码。
roarster

2
就像魅力。只需复制调试文件夹中的所有mipmap目录
Amit Bhandari'Oct

1
如何使用其他应用名称?
DKV

89

这是一个方便的方法,尽管它有一个重要的缺点...两个启动器都将放入您的apk中。Bartek Lipinski

更好的方法: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"
            ]
        }
    }
}

Github网址:使用Gradle构建多版本应用


1
这是一个方便的方法,尽管它有一个重要的缺点...两个启动器都将放入您的apk中。
Bartek Lipinski

-_-#这是个问题,我更新了。更好的方法:-> stackoverflow.com/a/22876224/703225
qinmiao

2
为什么重要的缺点?它不看太重要了,对我来说,它是很好的清洁解决方案的gradle
luky

2
我第二个@luky的问题。为什么这有缺点?我认为添加其他顶级目录(我的项目中有四个不同的构建变体)不如使用清单占位符那么干净。特别是当这些目录仅包含一个图标时。
GregSantulli

如果要使用这种方式并停止将两个图标都添加到生产APK中,则可以manifestPlaceholders在执行阶段或在and 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
检查问题。“有没有办法通过构建类型来做到这一点,而又不涉及产品风格?”
InsanityOnABun 2015年

4
虽然没有问到,但对我有很大帮助!用〜味道〜
惊讶-不作恶SE

2
最好的方法,如果您已经具有风味特定的清单文件。
Zax

这是我到目前为止所见过的唯一解决方案,在该解决方案中,您可以为启动器图标维护唯一的名称..与拥有10多个版本的相比ic_launcher.png,必须仅通过定位或实际打开来知道哪个是哪个(不是这样)很好)。我什至不知道这种扩展清单文件的方法,甚至在SO或其他地方都没有提到它。一定要优雅
Gene Bo

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

由于清单文件中已声明启动图标,因此不确定如何使用。您能解决这个问题吗?
David Rector

3
资源名称在清单中声明,但是您可以在我的文章中描述的不同风味的不同文件夹中使用具有相同文件名的不同图标。
JoseGómez'17

0

分步解决方案,包括替换mipmap-anydpi-v26并保留所有尺寸的文件:

首先在build.gradle(模块:app)中定义您的构建类型,在android-> buildTypes->调试,内部等

在项目层次结构中,在Android下,右键单击应用程序->新建->图像资产->在路径中选择您的图标->在“背景层和旧版”上进行任何其他更改->下一步->在Res目录中,选择所需的构建类型(调试,内部,主要等)->完成

这样,图标将替换您拥有的所有旧图标。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.