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

Ins*_*Bun 86 android gradle

我在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'])
}
Run Code Online (Sandbox Code Playgroud)

Ins*_*Bun 144

弄清楚了.你需要做的是创建一个单独的src文件夹debug,其中包含不同的图标.例如,如果您的项目布局如下,并且您的启动器图标被调用ic_launcher.png:

[Project Root]
  -[Module]
    -src
      -main
        -res
          -drawable-*
            -ic_launcher.png
Run Code Online (Sandbox Code Playgroud)

然后,为调试版本类型添加单独的图标,添加:

[Project Root]
  -[Module]
    -src
      -main
        -res
          -drawable-*
            -ic_launcher.png
      -debug
        -res
          -drawable-*
            -ic_launcher.png
Run Code Online (Sandbox Code Playgroud)

然后,当您在调试版本类型下构建时,它将使用调试文件夹中的ic_launcher.

  • 如何拥有不同的应用名称? (3认同)
  • 就像魅力。只需复制调试文件夹中的所有mipmap目录 (2认同)

qin*_*iao 78

这是一个方便的方法,虽然它有一个重要的缺点...两个发射器将被放入你的apk. - Bartek Lipinski

更好的方法:InsanityOnABun的回答

AndroidManifest.xml中

<manifest 

    ...
        <application
        android:allowBackup="true"
        android:icon="${appIcon}"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

    ...

    </application>

</manifest>
Run Code Online (Sandbox Code Playgroud)

的build.gradle

android {

    ...
        productFlavors{
        Test{
            versionName "$defaultConfig.versionName" + ".test"
            resValue "string", "app_name", "App-Test"
            manifestPlaceholders = [
                    appIcon: "@mipmap/ic_launcher_test"
            ]
        }

        Product{
            resValue "string", "app_name", "App"
            manifestPlaceholders = [
                    appIcon: "@mipmap/ic_launcher"
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一种方便的方法,尽管它有一个重要的缺点......两个启动器都会放入您的 apk 中。 (2认同)
  • 为什么这是重要的缺点?它看起来对我来说并不重要,而且它是好的和干净的gradle解决方案 (2认同)
  • 我是@Luky的第二个问题.为什么这是一个缺点?我认为添加额外的顶级目录(我的项目中有四种不同的构建变体)比使用清单占位符更不干净.特别是当这些目录只包含一个图标时. (2认同)

isy*_*syi 11

您也可以在product flavor的部分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>
Run Code Online (Sandbox Code Playgroud)

这将覆盖您在原始AndroidManifest.xml中指定的图标

  • 检查问题."有没有办法通过构建类型,**而不涉及产品口味**?" (4认同)
  • 虽然没有被问到,但确实对我帮助很大!〜使用口味〜 (3认同)
  • 如果您已经拥有特定于风味的清单文件,那么最佳方法就是这样做. (2认同)

Rob*_*Pal 7

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

首先在 build.gradle (Module: app) 中定义你的构建类型 android -> buildTypes -> debug、internal 等

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

这样,图标将取代您拥有的所有旧图标。


Jos*_*mez 6

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

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

    big {
        dimension "size"
    }
    small {
        dimension "size"
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式实现:

首先,将调试资源放在单独的文件夹中,例如:

src/blackDebug/res
src/whiteDebug/res
Run Code Online (Sandbox Code Playgroud)

其次,放置具有多个风味尺寸的键是源集名称必须包含所有可能的风味组合,即使其中一些尺寸不影响图标.

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'
}
Run Code Online (Sandbox Code Playgroud)

为了说清楚,当使用多个维度时,以下内容将不起作用:

sourceSets {
    // Override the icons in debug mode
    blackDebug.res.srcDir 'src/blackDebug/res'
    whiteDebug.res.srcDir 'src/whiteDebug/res'
}
Run Code Online (Sandbox Code Playgroud)

  • 资源名称在清单中声明,但您可以在我的帖子中描述的不同特定于风味的文件夹中具有相同文件名的不同图标. (3认同)