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

时间:2014-04-05 02:42:07

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

5 个答案:

答案 0 :(得分:134)

想出来。您需要做的是创建一个名为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

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

答案 1 :(得分:63)

  

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

更好的方法:InsanityOnABun's answer

的AndroidManifest.xml

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;

vector<int> Vector;
string line;

void drawchart(int max);


int main() {

    cout<<"Chart drawing program ( Histogram) \n";
    cout<<"Enter a series of numbers. \n";
    cout<<"Seperate with a space, press <ENTER> TWICE to end input \n";
    cout<<" (e.g  2 3 4 5 6)  >  ";

    if(!getline(cin, line)) return 1;
    istringstream iss(line);

    copy( istream_iterator<int>(iss), istream_iterator<int>(),  back_inserter(Vector));

    copy(Vector.begin(), Vector.end(), ostream_iterator<int>(cout, ", "));

    cout<<"\nDrawing chart.. \n\n";

    drawchart( Vector.size() );


    cout<<"Press ANY key to close.\n\n";    
    cin.ignore();cin.get();

return 0;
}

// draws a chart or hjistogram
void drawchart(int max){
    for( int i = 0; i < max ; i++){
        for(int j = 0; j < Vector[i]; j++)  cout << "*";
        cout << endl;
    }
}

的build.gradle

<manifest 

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

    ...

    </application>

</manifest>

Github网址:Build multi-version App with Gradle

答案 2 :(得分:10)

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:0)

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

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

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

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