产品风格中的Android Gradle库资源

4

已更新至gradle 1.12,android studio的gradle插件版本为0.10。

我的项目结构如下:

  • 3rdparty

    • Graphics
      • Iconsets
        • IconsetBase (android库)
        • Iconset1 (android库)
        • Iconset2 (android库)
  • MainProject

    • src
      • main (主要项目)
      • flavor1
      • flavor2
      • ...

如何将IconsetBase和Iconset1的res文件夹内容合并到flavor1中,将IconsetBase和Iconset2的res文件夹内容合并到flavor2中?

在升级到新的gradle之前,这个操作是可行的,因为库(IconsetBase、Iconset1和Iconset2)与main具有相同的包名。

以下是主要项目build.gradle的内容:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        repositories {
            mavenCentral()
        }
        classpath 'com.android.tools.build:gradle:0.10.0'
    }
}

apply plugin: 'android'

repositories {
    mavenCentral()
}

android {
    useOldManifestMerger false
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    lintOptions {
       ...
    } 

sourceSets {
    main.java.srcDirs = ['src/main/java']
    main.resources.srcDirs = ['src/main/res']
}

signingConfigs {
    ...
}

buildTypes {
    ...
}

// Common dependencies
dependencies {
   compile project(':3rdparty:Graphics:Iconsets:IconsetBase')
}

defaultConfig {
    ...
}

productFlavors {
    flavor1         { packageName "..."}
    flavor2         { packageName "..."}
}

android.sourceSets.flavor1 {
    dependencies { compile project(':3rdparty:Graphics:Iconsets:Iconset1') }
    res { srcDir 'flavor1' }
    resources { srcDir 'flavor1' }
}
android.sourceSets.flavor2 {
    dependencies { compile project(':3rdparty:Graphics:Iconsets:Iconset2') }
    res { srcDir 'flavor2' }
    resources { srcDir 'flavor2' }
}
}

dependencies {
    compile 'com.android.support:support-v4:19.1.0'
    compile 'com.android.support:appcompat-v7:19.1.0'
    compile 'com.google.android.gms:play-services:4.3.23'
}

=EDIT=

进一步解释:

我希望可以动态地从另一个位置合并资源。

背景:flavor1有基本图标集,其中包含图像icon1和icon2,flavor2也有基本图标集和icon1和icon2,但每个图标集的图标都不同。否则,每个flavor上必须多次拥有icon1、icon2等,并且在更新/更改这些图标时,必须为每个现有的flavor进行操作(我有超过20个flavor)。

是否可以通过某些自定义任务来实现此目标而不使用库?

1个回答

8
您可以通过口味定义特定的依赖关系:
productFlavors {
    flavor1 {
       ...
       dependencies {
         flavor1Compile project(':iconSet1')
       }
    }
    flavor2 {
       ...
       dependencies {
         flavor2Compile project(':iconSet2')
       }
    }
 }

在你的构建中,依赖项在SourceSets中,这是错误的。


编辑

好的,我希望现在我更好地理解了你的目标。你可以为每个品味定义多个资源目录:

android {
    sourceSets {
        flavor1 {
            res.srcDirs = ['flavor1','../3rdparty/Graphics/Iconsets/Iconset1/res']
        }
        flavor2 {
            res.srcDirs = ['flavor2','../3rdparty/Graphics/Iconsets/Iconset2/res']
        }
    }

}

这会将iconSet1文件夹中的文件(drawable-hdpi/some_image.png)复制到flavor文件夹的drawable-hdpi(merge)中吗? - ramden
不完全是。来自lib项目iconSet1的文件将在您的flavor1中可用,但这些文件不会覆盖flavor1中具有相同名称的任何现有文件。 - ben75

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接