使用gradle为不同的应用程序风格使用不同的资源(图形和字符串)

cra*_*ned 5 java android android-gradle-plugin

关于这个已经存在几个问题(不同的图标不起作用,不同的名称确实起作用),但这些问题的答案还不足以使我的应用程序以我需要的方式工作.我对Gradle来说是全新的,昨天刚开始转换它,而且还有一些我无法弄清楚的东西.

我有3个以上的应用程序使用相同的代码库,每个应用程序使用不同的应用程序启动器图标和名称,URL,但是现在我无法为每个应用程序获取不同的图标和应用程序名称.在我添加sourceSets之前,我的appName和其他自定义字符串工作,但图标没有,现在没有任何作用.

在我的src目录下,我有4个目录:flav1,flav2,flav3,和main(包含所有我的核心代码和默认资源).Android Studio已经添加.resflav每个目录的每一端.每个目录都有一个drawable和values目录,分别包含自定义strings.xml和icon.png.我不知道如果drawable应该有一个特定的名字:drawable,drawable-mdpi等等.如果它只是我决定的,我想要绘制.

我没有收到任何错误,只是默认的字符串main和默认图标Android Studio,除了我内部的默认AndroidManifest.xml main将无法识别我的图标和它们.

这是我的build.gradle:

apply plugin: 'android'

android {
   compileSdkVersion 19
   buildToolsVersion '19.0.2'

   defaultConfig {
      minSdkVersion 8
      targetSdkVersion 19
   }

   buildTypes {
      release {
         runProguard false
         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
      }
   }

   productFlavors {
      flav1 {
         packageName "com.example.flav1"
         versionCode 32
         versionName "1.0.5"
      }

      flav2 {
         packageName "com.example.flav2"
         versionCode 33
         versionName "1.0.6"
      }

      flav3 {
         packageName "com.example.flav3"
         versionCode 27
         versionName "1.0.0"
      }
   }

   sourceSets {
      main {
          // I don't understand how these are supposed to work
          java.srcDirs = ['java']
          resources.srcDirs = ['src']
          aidl.srcDirs = ['src']
          renderscript.srcDirs = ['src']
          // res.srcDirs = ['res']
          assets.srcDirs = ['assets']
      }

      flav1 {
          // I can't figure out the path to these
          res.srcDirs = ['res', '/flav1']
      }

      flav2 {
          res.srcDirs = ['res', '/flav2']
      }

      flav3 { 
          res.srcDirs = ['res', '/flav3']
      }
   }

   // I read that these are necessary, but I don't know how to use them
   sourceSets.flav1 {
      res {
          srcDir 'flav1'
      }
      resources {
          srcDir 'flav1'
      }
   }
   sourceSets.flav2 {
      res {
          srcDir 'flav2'
      }
      resources {
          srcDir 'flav2'
      }
   }
   sourceSets.flav3 {
      res {
          srcDir 'flav3'
      }
      resources {
          srcDir 'flav3'
      }
   }
}

dependencies {
   // code
}
Run Code Online (Sandbox Code Playgroud)

我感谢任何帮助!

Sof*_*LLC 8

如果您可以重新排列文件,这是解决此问题的最简单方法.

你想把它们放在这样:

yourApp/
  src/
    main/
      java/
      res/
    flav1/
      java/
      res/
    flav2/
      java/
      res/
    flav3/
      java/
      res/
Run Code Online (Sandbox Code Playgroud)

然后在build.gradle中,你可以完全摆脱sourceSets.保留productFlavors.

至于覆盖资源,它应该是自动的:"构建系统合并来自所有源目录的所有资源.如果不同的文件夹包含构建变体的同名资源,则优先级顺序如下:build类型资源会覆盖产品flavor中的那些,它会覆盖主源目录中的资源."