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

Posted

技术标签:

【中文标题】使用 gradle 为不同的应用程序风格使用不同的资源(图形和字符串)【英文标题】:Use different resources (graphics and strings) for different application flavors using gradle 【发布时间】:2014-06-07 05:58:10 【问题描述】:

已经有几个问题(different icons which didn't work 和different names which did work),但这些问题的答案还不足以让我的应用程序按照我需要的方式运行。我是 Gradle 的新手,昨天才开始转换,但有几件事我无法弄清楚。

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

在我的 src 目录中,我有 4 个目录:flav1flav2flav3main(包含我所有的核心代码和默认资源)。 android Studio 在每个flav 的末尾添加了.res。每个目录都有一个drawable 和values 目录,里面分别有自定义的strings.xml 和icon.png。如果drawable应该有一个特定的名称,我不知道:drawable、drawable-mdpi等。如果只是我决定的,我想要drawable。

我没有收到任何错误,只是在main 中定义的默认字符串和默认图标 Android Studio,除了我在main 中的默认 AndroidManifest.xml 将不再识别我的图标和它们。

这是我的 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

感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

你想把它们像这样:

yourApp/
  src/
    main/
      java/
      res/
    flav1/
      java/
      res/
    flav2/
      java/
      res/
    flav3/
      java/
      res/

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

至于资源的覆盖,应该是自动的:“构建系统合并所有源目录中的所有资源。如果不同的文件夹包含同名的资源用于构建变体,优先顺序是以下:构建类型资源会覆盖产品风味中的资源,后者会覆盖主源目录中的资源。”

【讨论】:

感谢您的快速回复!通过您的回答和其他帮助,我实际上能够意识到,仅在每种风味中使用 drawable 并不足以覆盖它。所以我在 res 中添加了其他文件夹,其中包含图标:drawable-hdpidrawable-ldpi 等。我实际上不知道哪个覆盖了默认值,但这给了我成功。我是否正确假设 java 目录将包含特定类的任何自定义代码或特定风格的东西? 还有一个问题:build type resources 是什么意思? 我今天充满了疑问:是否有一种简单的方法可以扩展此解决方案以包含上述每种风格的 debugrelease 版本,以便我可以为每种风格指定不同的 URL? 构建类型类似于发布或调试。您的示例中已经有一个 buildTypes 可供发布。是的,您可以为构建类型定义不同的属性。为此,除了 main 和 flav1 等之外,您还可以有一个目录 debug/ 和 release/,每个目录都有自己的 res 和 java 子目录。 是的,java 会保存自定义代码。这是不寻常的,但并非未知。

以上是关于使用 gradle 为不同的应用程序风格使用不同的资源(图形和字符串)的主要内容,如果未能解决你的问题,请参考以下文章

Android 在代码中使用 Gradle Build 风格,例如 if 案例

如何为不同的产品风格定义不同的依赖关系

在使用 gradle 缓存时,在多风格的 android 库中使用不同的 res 值会在编译的 APK 中使用错误的值

Gradle:如何构建不同构建类型的不同风格?

如何从 fire-base 为不同的产品风格 Android 生成不同的 json 文件

如何在 Android Studio 中使用具有不同应用名称的风味?