在Android Gradle中,每个构建变体是否可以拥有自定义源文件?

时间:2013-06-26 09:26:40

标签: android gradle

我们的应用程序有免费和付费版本。我们还制作品牌版本,这意味着应用程序在两个方面有所不同。

四个版本可能是:

  • The App,耐克编辑。免费
  • APP,耐克编辑。付款
  • 该应用程序,阿迪达斯编辑。付款
  • 该应用程序,阿迪达斯编辑。自由

我现在的解决方案是拥有两种构建类型,付费和免费:

  buildTypes {
        paid {
            packageNameSuffix ".paid"
        }

        free {
            packageNameSuffix ".free"
        }
    }

还有两种口味:

productFlavors{
    nike{
        packageName "com.example.theapp.nike"
    }

    adidas{
        packageName "com.example.theapp.adidas"
    }

}

应用程序的每个免费版本都使我们成为内容提供者,内容提供者,特定于每个风味 - 构建类型组合。问题是我不知道在哪里放置基于构建变体的源文件。放入 / src / nike / src / free 的源文件将根据构建类型或风格获取。但是依赖于构建变体(类型和风格的组合)的源文件怎么样?

4 个答案:

答案 0 :(得分:7)

您可以在src下为您拥有的每个构建或品味创建一个新文件夹。即:'免费','付费','耐克','阿迪达斯'。

在构建时,您放入任何这些文件夹中的文件会根据类型进行拾取并构建两者。

根据Android工具项目网站上的Gradle Plugin User Guide

  

与Build Types类似,Product Flavors也提供代码和   资源通过他们自己的sourceSets。

  

在处理所有使用的源集时,使用以下规则   建立一个单一的APK:

     
      
  • 所有源代码(src / * / java)一起用作生成单个输出的多个文件夹。
  •   
  • 清单全部合并为一个清单。这允许产品口味具有不同的组分和/或   权限,类似于构建类型。
  •   
  • 使用覆盖优先级使用所有资源(Android res和资源),其中Build Type会覆盖Product Flavor,   覆盖主要的sourceSet
  •   
  • 每个Build Variant都会从资源中生成自己的R类(或其他生成的源代码)。什么都没有共享   变体。
  •   

意味着你的buildType“free”的java文件会覆盖你的风格“nike”,如果它们具有相同的名称。

但是如果您要向清单添加内容,根据上面列表中的第二点,最终清单将是所有清单的合并。

如果您需要更多自定义,可以将文件放入构建变体的文件夹“src / freeNike /".

答案 1 :(得分:2)

由于叠加规则,我的构建类型覆盖了各种类型的问题。

我最终将构建类型源集重定向到不同的文件夹,具体取决于构建的风格。

android.applicationVariants.all { variant ->
    switch (variant.name) {
        case "FreeNike":
            variant.mergeResources.doFirst {
                android.sourceSets.free.setRoot("src/freeNike")
            }
            break;
        case "FreeAdidas":
            variant.mergeResources.doFirst {
                android.sourceSets.free.setRoot("src/freeAdidas")
            }
            break;
        case "PaidNike":
            variant.mergeResources.doFirst {
                android.sourceSets.paid.setRoot("src/paidNike")
            }
            break;
        case "PaidAdidas":
            variant.mergeResources.doFirst {
                android.sourceSets.paid.setRoot("src/paidAdidas")
            }
            break;
    }
}

您当然可以自由使用其他文件夹结构。请参阅此处的示例:Folder naming convention for gradle build variants

答案 2 :(得分:1)

查看最新的Gradle插件,它现在允许具有变体特定资源 http://tools.android.com/tech-docs/new-build-system

这里有你的使用范例 https://android.googlesource.com/platform/tools/build/+/master/tests/overlay3/

答案 3 :(得分:0)

您是否尝试将srcDir放入sourceSets? 像这样:

    sourceSets {
            main {
                java {
                    srcDirs 'src/java'
                }
            }
     }

那应该输出一个带有两个源代码的javaResources,nike和adidas。