【问题标题】:How to provide different Android app icons for different gradle buildTypes?如何为不同的 gradle buildTypes 提供不同的 Android 应用图标?
【发布时间】:2014-05-17 13:02:23
【问题描述】:

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

【问题讨论】:

标签: android gradle


【解决方案1】:

想通了。您需要做的是创建一个名为 debug 的单独 src 文件夹,其中包含不同的图标。例如,如果您的项目布局如下,并且您的启动器图标名为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

然后,当你在 debug 构建类型下构建时,它将使用在 debug 文件夹中找到的 ic_launcher。

【讨论】:

  • 您不必使用 sourceSets 声明指定额外的调试文件夹吗?
  • @ncoronges 我没有。似乎因为 debug 是一种内置的构建类型,它的源集也是内置的。
  • @Scott 如果我只是将我的图标放在每个可绘制文件夹中,它就可以使用“调试”。例如。 drawable-mdpi、drawable-hdpi 等。我不需要调试文件夹中的任何其他资源或代码。
  • 像魅力一样工作。只需复制调试文件夹中的所有 mipmap 目录
  • 如何拥有不同的应用名称?
【解决方案2】:

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

更好的方法:InsanityOnABun's answer

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 网址:Build multi-version App with Gradle

【讨论】:

  • 这是一种方便的方法,尽管它有一个重要的缺点......两个启动器都将放入您的 apk。
  • -_-# 有问题,我更新一下。更好的办法:-->stackoverflow.com/a/22876224/703225
  • 为什么它是重要的缺点?它对我来说看起来不太重要,而且它是一个很好而且干净的 gradle 解决方案
  • 我第二个@luky 的问题。为什么这是一个缺点?我认为添加额外的顶级目录(我的项目中有四个不同的构建变体)不如使用清单占位符干净。尤其是当这些目录只包含一个图标时。
  • 如果你想使用这种方式并停止将两个图标添加到生产APK中,你可以在执行阶段或后面设置manifestPlaceholdersif语句。我这样做是因为我有 1 个非生产构建类型,它可以有两个不同的图标(而且我不希望整个构建类型与另一个只有 1 个不同)
【解决方案3】:

您也可以在产品风味的部分 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 中指定的图标

【讨论】:

  • 检查问题。 “有没有办法仅通过构建类型,不涉及产品风格?”
  • 虽然没有按照要求,但确实帮助了我很多! ~使用口味~
  • 最好的方法,如果你已经有特定风格的清单文件。
  • 这是迄今为止我见过的唯一解决方案,您可以在其中为启动器图标维护唯一名称.. 与拥有 10 多个版本的 ic_launcher.png 相比,必须知道哪个是唯一的通过它所在的位置或实际打开它(不太好)。我什至不知道这种 扩展清单文件 是可能的,在此之前在 SO 或其他任何地方都没有看到它提到过。优雅的肯定
【解决方案4】:

用于在使用具有多个维度的不同风格的同时获得不同的图标,例如:

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

【讨论】:

  • 不确定这将有什么帮助,因为清单文件中声明了启动图标。你能解决这个问题吗?
  • 资源名称在清单中声明,但您可以在我的帖子中描述的不同风味特定文件夹中使用具有相同文件名的不同图标。
【解决方案5】:

分步解决方案,包括替换mipmap-anydpi-v26和保留所有维度的文件:

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

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

这样图标将替换您拥有的每个旧图标。

【讨论】:

    猜你喜欢
    • 2018-09-26
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2015-06-15
    相关资源
    最近更新 更多