Gradle混合构建风味

Mik*_*ter 6 android gradle

有没有办法在 gradle 中“混合”多种口味?

例如,假设我有两种口味:RedBlue。现在假设我有两种口味,我希望它们具有(子口味,如果你喜欢):ComplexSimple.

到目前为止我所知道的是,这需要我创建四种口味:Red-Complex, Red-Simple, Blue-Complex, Blue-Simple

我不清楚这应该如何在项目中构建。如何定义RedRed-Complex和之间共享Red-SimpleComplex代码,但也有在Red-Complex和之间共享的代码Blue-Complex?我不想在口味之间复制/粘贴代码。

在gradle中实现这一目标的最佳方法是什么?

小智 0

以下是风味的工作原理:https://proandroiddev.com/advanced-android-flavors-part-1-building-white-label-apps-on-android-ade16af23bcf

-> 在您的 src 文件夹中,您想要创建 2 种口味,称为“红色”、“蓝色”。

-> 在 src 中创建 2 个名为“red”、“blue”的文件夹(与 main 同一级别)。

-> 文件夹具有与 main 相同的结构。

-> 在这里您可以选择覆盖任何 XML/资源/java 文件/值等。

->(当您构建 Flavor 时,与 main 具有相同名称的资源将被覆盖)。

-> 使用 build.gradle 中的示例代码为项目添加风味。

productFlavors {
      blue{
          minSdkVersion 21
          applicationId 'something'
          targetSdkVersion 28
          versionCode 1
          versionName "1.0.0"
      }
      red
      {
          minSdkVersion 21
          applicationId 'something'
          targetSdkVersion 28
          versionCode 1
          versionName '1.0.0'
      }
  }

  buildTypes {
      Debug {   }
      Release { }
  }
Run Code Online (Sandbox Code Playgroud)

将给出构建变体:

blueDebug
blueRelease
redDebug
redRelease
Run Code Online (Sandbox Code Playgroud)

//================ 添加子口味 ================

这里: https: //proandroiddev.com/advanced-android-flavors-part-2-enter-flavor-dimensions-4ad7f486f6

-> 具有简单、复杂等子风格(换句话说“buildTypes”)。

-> 对于子风味或构建类型,我们使用维度。

->flavorDimensions "Flavour", "SubFlavour" (在你的 build.gradle 中) // 可以是任何关键字,在内部使用 // 将此关键字视为将风味集合定义为一个组的组 id。

-> 在你的口味中使用它 -> 我们可以认为关键词“维度”更像是定义一组口味和子口味

flavorDimensions "Flavour", "SubFlavour" 
  productFlavors
  { 
      // group one
      Simple {
          dimension "SubFlavour"
      }
      Complex {
          dimension "SubFlavour"
      }

      //group two
      // Take a note: do not use upper case in your flavours (one which match the folder names in src)
      // Sub-Flavours can have Upper case
      blue
      {
          dimension "Flavour"
          minSdkVersion 21
          applicationId 'something'
          targetSdkVersion 28
          versionCode 1
          versionName "1.0.0"
      }
      red
      {
          dimension "Flavour"
          minSdkVersion 21
          applicationId 'something'
          targetSdkVersion 28
          versionCode 1
          versionName '1.0.0'
      }
  }
Run Code Online (Sandbox Code Playgroud)

--> 通过正确配置,您将看到下面的 buildVariants。

 blueSimpleDebug
  blueSimpleRelease
  blueComplexDebug
  blueComplexRelease

  redSimpleDebug
  redSimpleRelease
  redComplexDebug
  redComplexRelease
Run Code Online (Sandbox Code Playgroud)

//================= build.gradle =============== // 这里你的 build.gradle 可能看起来像这样。

android {

    buildTypes {
        debug {   }
        release { }
        // Any other you want to add here
        // Ex, development {}
    }


    flavorDimensions "Flavour", "SubFlavour"
    productFlavors {
        Simple {
            dimension "SubFlavour"
        }
        Complex {
            dimension "SubFlavour"
        }

        Blue
        {
            dimension "Flavour"
            minSdkVersion 21
            applicationId 'something'
            targetSdkVersion 28
            versionCode 1
            versionName "1.0.0"
        }
        Red
        {
            dimension "Flavour"
            minSdkVersion 21
            applicationId 'something'
            targetSdkVersion 28
            versionCode 1
            versionName '1.0.0'
        }

    }
    sourceSets {
        main {
            aidl.srcDirs = ['src/main/aidl', 'src/main/res/animation', 'src/main/res/animations']
            res.srcDirs = [

                    'src/main/res/anim',
                    'src/main/res/layouts/xyz',
                    'src/main/res/layouts/abc',
                    'src/main/res/layouts',
                    'src/main/res/layout',
                    'src/main/res'
            ]
            resources.srcDirs = ['src/main/resources', 'src/main/resources/xml']
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
        }
        red {
            java.srcDirs = ['src/red/java']
            res.srcDirs = [
                    'src/red/res/layouts/xyz',
                    'src/red/res/layouts/abc',
                    'src/red/res/layouts',
                    'src/red/res'
            ]
            assets.srcDirs = ['src/red/assets']
            manifest.srcFile 'src/red/AndroidManifest.xml'
        }
        blue {
            java.srcDirs = ['src/blue/java']
            res.srcDirs = [
                    'src/blue/res/layouts/xyz',
                    'src/blue/res/layouts/abc',
                    'src/blue/res/layouts',
                    'src/blue/res'
            ]
            assets.srcDirs = ['src/blue/assets']
            manifest.srcFile 'src/blue/AndroidManifest.xml'
        }

    }

} //andorid

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