让一个产品风味成为另一个产品风味的子风味

2024-01-21

我正在我的应用程序中设置产品口味,但遇到了一个问题。我的两种产品口味非常相似,只有一些资源不同,我们将它们称为 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"
}

我找到了两个解决方案:

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 and white延伸blackAndWhite or redAndWhite.

这个答案 https://stackoverflow.com/a/28341852/746347和变体过滤器文档 https://developer.android.com/studio/build/build-variants.html#filter-variants很有帮助。

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
    }
}

代码示例无耻地复制自这篇博文 http://liberorignanese.blogspot.ru/2015/10/android-studio-flavor-extends-flavor.html。非常感谢它的作者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让一个产品风味成为另一个产品风味的子风味 的相关文章

随机推荐

  • 找不到模块“sass”

    我写了一个React应用程序并尝试码头化它 我执行此操作后 它无法正确编译 它找不到sass模块 错误是 编译失败 src index scss node modules css loader dist cjs js ref 5 oneOf
  • 在正百分比变化前面添加 + 号

    我正在从 API 获取数据以显示在我的 iOS 应用程序中 其中一些数据是百分比 因此当它为负数时 它会显示为 0 98 没问题 但为了清楚起见 我希望将正数变化显示为 0 98 而不仅仅是 0 98 这是我更新标签时的代码 func up
  • 如何在表格中汇总多个逻辑回归模型?

    我有一个数据集 其中年龄作为连续因素 性别作为因素和 4 个组 structure list Age c 9 12 16 57 Age 1 structure c 2L 3L 3L 7L Label c 8 1 2 3 4 5 6 7 cl
  • 我应该如何重新配置​​箭头“->”以在完成路径设置后不打印?

    我正在尝试创建一条最佳路径来收集尽可能多的 1 但是在执行代码后 我仍然有一个箭头指向任何内容 因为没有更多的地方可以去了 如何删除代码末尾的箭头 import java util Arrays import java util Scann
  • 如何在 C++ 中使用 BOOST_AUTO 模拟“const auto”?

    使用BOOST AUTO我们可以模拟宏autoC 11 之前不可用的关键字 BOOST AUTO var 1 2 int var 3 auto var 1 2 the same in C 11 有没有什么办法可以模仿const auto c
  • 该视图未返回 HttpResponse 对象。它返回 None 相反

    我有以下简单的看法 为什么会导致这个错误呢 The view auth lifecycle views user profile didn t return an HttpResponse object It returned None i
  • 使用来自 Thales nShield HSM 的 PKCS11interop c# 包装器库导出/导入 RSA 密钥对?

    我已使用 PKCS11Interop 生成密钥 API 在 HSM 中生成了 RSA 公私密钥对 我想导出密钥对 我使用 Findobject API 来获取密钥 该 API 返回一个 ObjectHandle 在使用 GetAttribu
  • Discord.js 如何检查用户是否不接受私信

    我想知道 Discord 机器人是否可以检查该机器人尝试 DM 发送的特定用户是否接受直接消息 现在这是我的代码 exports run client message gt try message author send ok hand c
  • Rvalue ref 和完美转发

    我读过一些关于 的论文 我只是好奇是否有 void fnc 1 int p void fnc int r fnc 1 r am I suppose to should I call it like so fnc 1 std forward
  • solr ReplicationHandler - SnapPull 无法下载文件

    在从主服务器到从服务器的复制过程中 我们不断收到此异常 我们的索引大小是 9 7 G 我们正在尝试从头开始复制一个从站 2013 年 10 月 30 日 18 22 16 996 explicit fetchindex cmd 错误 Rep
  • 使用获取的属性进行核心数据跨存储查询

    背景 我有一个由两个存储组成的核心数据数据库 一个用于我的数据的存储库 一个用于用户数据的存储 通过获取的属性在它们之间链接 假设我有两个实体 它们之间的关系是 0 到 1 卡 0 gt 1 卡状态 1 Card 包含参考数据和一些属性 e
  • 使用 Python 请求对 magiccardmarket 进行 OAuth 身份验证

    我想以编程方式获取特定用户的库存http www cardmarket com http www cardmarket com 但似乎无法让 OAuth 身份验证在以下 Python 代码片段中工作 简单地使用 requests oauth
  • React Native 根据条件显示 View

    在我的渲染方法中 我想显示两个之一View组件取决于我的条件props e g render return
  • 将映射转换为结构

    我正在尝试将映射转换为结构 如下所示 我有一张地图 iex 6 gt user basic auth gt Basic Ym1hOmphYnJhMTc firstname gt foo lastname gt boo 该值应应用于结构 ie
  • UILabel 不会使用 AutoLayout 在 UIScrollView 内自动换行

    我有一个UILabel里面一个UIScrollView我正在尝试自动换行 我想使用 AutoLayout 进行布局配置 这UILabel当单词不在 a 内时 它会完美换行UIScrollView 我只需将行数设置为 0 并将换行模式设置为自
  • 如何禁用 C++ 中的转义序列

    我使用C 处理很多文件 我必须在源代码中编写文件名 如下所示 F somepath subpath myfile 我想知道是否有任何方法可以摆脱键入 来在字符串文字上下文中获取字符 即 我希望我可以写 F somepath subpath
  • 如何在构建过程中强制执行代码样式格式化?

    有没有一种方法 使用 ANT 可以自动重新格式化代码以遵循某些约定 我有几个开发人员正在开发一个程序 并且希望确保在提交之前构建时所有类的代码格式保持一致 进行预提交的最佳方法是在源代码控制服务器上使用预提交挂钩 通过这种方式 您可以强制任
  • 如何使列表视图在中心显示特定项目?

    是否有一种通用方法可以将列表视图的特定项目 例如 1000 个中的第 500 个 放置在其中心 现在我正在使用这段代码 lvData Items iIndex MakeVisible False 它很简单 但有一个缺陷 大多数所需的项目出现
  • 在 Shiny 中选择最近更改的反应式表达式

    我有一个反应式表达式 我想从最近更改的其他两个反应式表达式中获取其值 我做了以下例子 ui r shinyUI bootstrapPage column 4 wellPanel actionButton button Button chec
  • 让一个产品风味成为另一个产品风味的子风味

    我正在我的应用程序中设置产品口味 但遇到了一个问题 我的两种产品口味非常相似 只有一些资源不同 我们将它们称为 FlavorA 和 FlavorB 我想将其设置为 FlavorA 是 Fl avorB 的父级 这样 FlavorB 可以覆盖