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

lor*_*zor 5 android gradle

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

四个版本可能是:

  • 该应用程序,耐克编辑.自由
  • APP,耐克编辑.支付
  • 该应用程序,阿迪达斯编辑.支付
  • 该应用程序,阿迪达斯编辑.自由

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

  buildTypes {
        paid {
            packageNameSuffix ".paid"
        }

        free {
            packageNameSuffix ".free"
        }
    }
Run Code Online (Sandbox Code Playgroud)

还有两种口味:

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

mac*_*lir 8

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

您在任何这些文件夹中放置的文件在构建时会被选中,具体取决于类型和构建两者.

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

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

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

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

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

但是如果你在清单中添加一些内容,根据上面列表中的第二点,最终清单将是所有清单的合并.

如果您需要更多自定义,可以将文件放在build变体的文件夹"src/freeNike /"中.

  • 每种风格都不会覆盖Java文件.如果你在主源集和flavor的源集中有相同的java文件,你会收到一个错误"找到重复的类".正如你自己写的那样,原因是"所有源代码(src/*/java)**一起**用作生成单个输出的多个文件夹." 您必须仅在主源集中指定java文件,或者在**所有**其他flavor的源集中指定. (7认同)