【问题标题】:Have a product flavor be a child of another让产品风味成为另一个产品的孩子
【发布时间】:2014-07-29 18:15:59
【问题描述】:

我正在我的应用中设置产品风格,但遇到了一个问题。我的两种产品风味非常相似,仅在一些资源上有所不同,我们称它们为 FlavorA 和 FlavorB。我想将其设置为 FlavorA 是 Fl​​avorB 的父级,这样 FlavorB 可以只覆盖 FlavorA 的一些资源,然后 FlavorA 会覆盖 main 中的一堆资源。有没有办法建立这样的风味层次结构?现在我需要在两者之间复制大量资源才能使其正常工作,我想消除这种重复。

编辑:好的。到目前为止,我有几个与我的问题无关的答案(均已删除),所以让我澄清一下。这与 Java OOP 无关,我已经很清楚了。 :)

我遇到的问题是我的应用程序有一个免费/付费版本,然后是几个只包含主题更改的白标。付费版本仅更改免费版本的一些资产(除了代码更改)。这就是我的productFlavors 的样子:

productFlavors {
        whiteLabelA {
            applicationId "com.whiteLabelA.android"
        }

        whiteLabelB {
            applicationId "com.whiteLabelB.android"
        }

        mainFree {
            applicationId "com.mainFree.android"
        }

        mainPaid {
            applicationId "com.mainFree.android.paid"
        }
    }

我希望mainPaid 覆盖mainFree,因为它只会更改一些资源。我想这样做而不是免费/付费构建类型,因为白色标签没有付费版本,并且更容易拥有类似的风味层次结构:

mainPaid extends mainFree {
    applicationId "com.mainFree.android.paid"
}

【问题讨论】:

  • @travor-e 你有没有找到这个问题的答案?
  • @SeanBarbeau 有点像。关于口味是否可以扩展,目前还没有答案。我能够以一种不需要扩展口味的方式解决我的问题,所以我把这个问题留了下来。仅供参考,我通过将 mainFree 风味资源放在我的主资源文件夹中解决了我的问题,因为我意识到它应该是默认构建。
  • 构建类型有一个 initWith 命令允许复制 gradle 配置块(尽管依赖的构建类型仍然需要它自己的源集),但据我所知,没有相当于口味。
  • 这里是一个链接,其中包含一些提示以实现此行为。我需要完全相同但直到现在才找到解决方案:groups.google.com/forum/?hl=fr#!topic/adt-dev/f2I9LQIogOM

标签: android gradle


【解决方案1】:

我找到了两个解决方案:

1.使用风味维度。

android {
  ...
  flavorDimensions 'palette', 'color'

  productFlavors {
    blackAndWhite {
      dimension 'palette'
    }
    redAndWhite {
      dimension 'palette'
    }
    red {
      dimension 'color'
    }
    white {
      dimension 'color'
    }
  }
  variantFilter { variant ->
    def first = variant.getFlavors().get(0).name
    def second = variant.getFlavors().get(1).name
    if(!(first.equals('blackAndWhite') && second.equals('white')) ||
       !(first.equals('redAndWhite') && (second.equals('white') || second.equals('red')))) {
       variant.setIgnore(true);
    }
  }
  ...
}

因为variantFilter,我们有3个组合而不是4个:

blackAndWhite => white

redAndWhite   => white
              => red

您可以将其视为red 扩展redAndWhite 和white 扩展blackAndWhite 或redAndWhite。

This answer 和变体过滤器documentation 很有帮助。

2。编辑源集。

productFlavors{
    flavor1 {
    }
    flavor2 {
    }
}

sourceSets {
    flavor2 {
        java.srcDirs = sourceSets.flavor1.java.srcDirs
        res.srcDirs = sourceSets.flavor1.res.srcDirs
        resources.srcDirs = sourceSets.flavor1.resources.srcDirs
        aidl.srcDirs = sourceSets.flavor1.aidl.srcDirs
        renderscript.srcDirs = sourceSets.flavor1.renderscript.srcDirs
        assets.srcDirs = sourceSets.flavor1.assets.srcDirs
    }
}

代码示例是从this blog post 中无耻复制的。非常感谢它的作者。

【讨论】:

【解决方案2】:

我在 gradle 中寻找类似的东西,发现 Multi-flavor variants。我有一个应该有 A 和 B 版本的应用程序,每个版本都有开发和专业环境,所以我最终在我的 gradle 中使用了这个:

flavorDimensions 'app', 'environment'

productFlavors {
    versionA {
        flavorDimension 'app'
    }
    versionB {
        flavorDimension 'app'
    }
    pre {
        flavorDimension 'environment'
    }
    pro {
        flavorDimension 'environment'
    }
}

在我的构建变体中,我有 versionAPreDebug、versionAPreRelease、versionBPreDebug、versionBPreRelease 等。我认为您需要的是类似的东西。

【讨论】:

  • 在产品风味块内,它只是dimension 而不是flavorDimension
【解决方案3】:

我认为您无法直接在 android 对象中执行此操作,但您可以使用配置函数来设置风味的常用属性。把它放在android 对象之后:

void configureWhiteLabelFlavor(flavor) {
    flavor.useJack = true
}

configureWhiteLabelFlavor(android.productFlavors.whiteLabelA)

如果需要,您可以通过从该函数调用其他函数来实现深度继承。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多