android - 让产品 flavor 成为另一个的 child

标签 android gradle

我正在我的应用程序中设置产品口味,但遇到了一个问题。我的两种产品口味彼此非常相似,只有少数资源不同,我们称它们为 FlavorA 和 FlavorB。我想设置它,使 FlavorA 成为 FlavorB 的父级,这样 FlavorB 就可以覆盖 FlavorA 的一些资源,然后 FlavorA 覆盖 main 中的一堆资源。有没有办法建立这样的 flavor 层次结构?现在我需要在两者之间复制大量资源以使其正常工作,我想消除这种重复。

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

我遇到的问题是我有一个免费/付费版本的应用程序,然后是几个仅包含主题更改的白色标签。付费版本仅更改了免费版本的一些 Assets (代码更改除外)。这是我的 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 因为它只改变了一些资源。我想这样做而不是免费/付费构建类型,因为白标没有付费版本,并且拥有像这样的 flavor 层次结构会更容易:

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

最佳答案

我找到了两个解决方案:

<强>1。使用 flavor 维度。

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 扩展 redAndWhitewhite 扩展 blackAndWhiteredAndWhite.

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 .非常感谢它的作者。

关于android - 让产品 flavor 成为另一个的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25022249/

相关文章:

java - 在解决依赖项之前运行测试

android - gradle-play-publisher:任务 'bootstrap' 或 'publishApk' 不工作

android - 没有可用于离线模式的 androidx.databinding :databinding-compiler:3. 4.2 的缓存版本

java - 如何获取Firebase用户数据

Android KeytoolException : Failed to read key AndroidDebugKey lengthTag=109, 太大

gradle - 在gradle项目中使用本地依赖项(通过mvn install安装)

android - Crashlytics NDK 符号和 Gradle 任务

android N 无法在应用计费 AIDL 中编译

android - 有没有办法停止所有 MediaPlayer?

android - Flurry Ads IncompatibleClassChangeError