Android Studio:具有两个以上风味尺寸(风味组)的产品风味组合

Van*_*rth 15 android android-studio android-gradle-plugin android-productflavors android-flavordimension

我正在使用Android Studio(v 2.1,gradle plugin v 2.1.0)开发Android应用程序.我的应用程序有各种版本,它们共享许多通用代码,所以我决定使用flavor大小和产品风格来定制代码和资源的时间和地点.只要我只有两个风味尺寸,这就行了罚款.举个例子,我app.gradle

…
flavorDimensions "fruit", "color"

productFlavors {

    apple {
        dimension "fruit"
    }
    pear {
        dimension "fruit"
    }

    red {
        dimension "color"
    }
    yellow {
        dimension "color"
    }
}
…
Run Code Online (Sandbox Code Playgroud)

我的src文件夹是

src/
    appleRed/
    appleYellow/
    pearRed/
    pearYellow/
Run Code Online (Sandbox Code Playgroud)

每个都有我的代码的自定义版本.再次,作为一个例子

src/
    appleRed/java/com/example/ExampleFragment.java
    appleYellow/java/com/example/ExampleFragment.java
    pearRed/java/com/example/ExampleFragment.java
    pearYellow/java/com/example/ExampleFragment.java
Run Code Online (Sandbox Code Playgroud)

当然,没有实例ExampleFragmentsrc/main.

在开发期间的某个时刻,我必须包含应用程序的免费付费版本.我认为这可以通过添加一个新的名为味尺寸可以轻松实现version,并命名为两类产品的口味freepaid:

 …
flavorDimensions "fruit", "color”, “version”

productFlavors {

    apple {
        dimension "fruit"
    }
    pear {
        dimension "fruit"
    }

    red {
        dimension "color"
    }
    yellow {
        dimension "color"
    }

    free {
        dimension "version"
    }
    paid {
        dimension “version”
    }
}
…
Run Code Online (Sandbox Code Playgroud)

但忽然的自定义代码的组合产生的fruit,并color通过Android Studio中再未检测到.因此,没有appleRed,appleYellow,pearRedpearYellow可以用来定制代码,我能重新找回自己的配置的唯一途径是使用所有这三个维度风味的所有组合:

  src/
      appleRedFree/java/com/example/ExampleFragment.java
      appleRedPaid/java/com/example/ExampleFragment.java
      appleYellowFree/java/com/example/ExampleFragment.java
      appleYellowPaid/java/com/example/ExampleFragment.java
      pearRedFree/java/com/example/ExampleFragment.java
      pearRedPaid/java/com/example/ExampleFragment.java
      pearYellowFree/java/com/example/ExampleFragment.java
      pearYellowPaid/java/com/example/ExampleFragment.java
Run Code Online (Sandbox Code Playgroud)

这是不好的,因为ExampleFragment是在同样的重复fruitColor*组合(appleRedFree,appleRedPaid具有相同ExampleFragment).资源(res文件夹中的资源)也会出现同样的问题.

我的问题是:

1)这是Android Studio中gradle的预期行为(,当具有两个以上的风味维度时,无法根据其维度优先考虑产品风味的子集)吗?

2)鉴于这是预期的行为,是有另一种方式,我可以实现我的定制,而重复的代码或不具有单个文件与if语句内(例如,if (BuildConfig.FLAVOR_version == "free") ...)?

请注意,我所说的自定义代码可能很复杂,所以我不要求像构建配置变量,变体过滤或类似的东西那样进行基本的自定义.

Dev*_*rim 13

你想为某些风格使用相同的额外源目录;

appleRedFree + appleRedPaid - > src/appleRed
pearRedFree + pearRedPaid - > src/pearRed
appleYellowFree + appleYellowPaid - > src/appleYellow
pearYellowFree + pearYellowPaid - > src/pearYellow

您可以为您的风格设置sourceSet:

android {

    // Other stuff here

    flavorDimensions "fruit", "color”, “version”

    productFlavors {

        apple {
            dimension "fruit"
        }
        pear {
            dimension "fruit"
        }

        red {
            dimension "color"
        }
        yellow {
            dimension "color"
        }

        free {
            dimension "version"
        }
        paid {
            dimension “version”
        }
    }

    sourceSets {
        appleRedFree {
            java.srcDirs = ['src/main/java', 'src/appleRed/java']
        }

        appleRedPaid {
            java.srcDirs = ['src/main/java', 'src/appleRed/java']
        }

        appleYellowFree {
            java.srcDirs = ['src/main/java', 'src/appleYellow/java']
        }

        appleYellowPaid {
            java.srcDirs = ['src/main/java', 'src/appleYellow/java']
        }

        pearRedFree {
            java.srcDirs = ['src/main/java', 'src/pearRed/java']
        }

        pearRedPaid {
            java.srcDirs = ['src/main/java', 'src/pearRed/java']
        }

        pearYellowFree {
            java.srcDirs = ['src/main/java', 'src/pearYellow/java']
        }

        pearYellowPaid {
            java.srcDirs = ['src/main/java', 'src/pearYellow/java']
        }
    }

   // Other stuff here
}
Run Code Online (Sandbox Code Playgroud)

  • @Vangaorth 我已经更新了我的答案。 (2认同)