7

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

四个版本可能是:

  • 应用程序,耐克版。自由的
  • 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

4 回答 4

9

您可以在 src 下为您拥有的每个构建或风格创建一个新文件夹。即:“免费”、“付费”、“耐克”、“阿迪达斯”。

您放入任何这些文件夹中的文件在构建时会根据类型被拾取并同时构建。

根据Android 工具项目网站上的Gradle 插件用户指南:

与 Build Types 类似,Product Flavors 也通过自己的 sourceSets 贡献代码和资源。

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

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

这意味着如果它们具有相同的名称,您的 buildType “free” 的 java 文件将覆盖您的口味 “nike” 的那些。

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

如果您需要更多自定义,您可以将文件放在构建变体的文件夹“src/freeNike/”中。

于 2013-07-03T08:10:54.300 回答
3

由于覆盖规则,我在构建类型覆盖口味方面遇到了类似的问题。

我最终根据构建的风格将构建类型源集重定向到不同的文件夹中。

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

您当然可以自由使用不同的文件夹结构。请参阅此处的示例:gradle 构建变体的文件夹命名约定

于 2013-11-03T08:26:41.313 回答
1

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

在这里您有使用示例 https://android.googlesource.com/platform/tools/build/+/master/tests/overlay3/

于 2013-12-19T12:37:51.330 回答
0

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

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

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

于 2013-06-28T15:53:57.523 回答