在 Android 应用程序中获取产品风味或构建变体

问题描述 投票:0回答:3

我有一个 Android 应用程序,在我的 build.gradle 文件中配置了许多不同的产品风格,例如

productFlavors {
    someFlavor {}
    anotherFlavor {}
}

在我的应用程序代码中,我希望能够获取当前编译的风味(或构建变体)的名称。一种解决方案是这样的:

productFlavors {
    someFlavor {
        buildConfig "public static final String PRODUCT_FLAVOR = \"someFlavor\";"
    }
    anotherFlavor {
        buildConfig "public static final String PRODUCT_FLAVOR = \"anotherFlavor\";"
    }
}

然后在我的 Android 应用程序中调用

BuildConfig.PRODUCT_FLAVOR

有什么方法可以让 gradle 自动执行此操作吗?或者 Android 中有其他一些 API 我可以用来获取产品风味名称吗?

android gradle
3个回答
75
投票

编辑:现在从插件版本 0.7 开始自动完成此操作。

BuildConfig.java
将包含

public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "f1Fa";
public static final String FLAVOR_group1 = "f1";
public static final String FLAVOR_group2 = "fa";

FLAVOR
是应用了所有风味维度/组的组合风味名称。那么每个维度都可用作
FLAVOR_<group name>

最后

BUILD_TYPE
包含所使用的构建类型的名称。

如果您只有单一风味维度,那么您只有

FLAVOR
常数。

这是目前唯一的方法。

您可以做的一件事就是使其自动化。所以你可以做这样的事情:

android {
   productFlavors.whenObjectAdded { flavor ->
       flavor.buildConfig "public static final String PRODUCT_FLAVOR = \"${flavor.name}\";"
   }

   // your normal config here.
}

这样您就不必为每种口味手动执行。


7
投票

接受的解决方案非常棒。对于某些情况,替代方案可能有用。

您可以添加一个配置文件,例如“Appconfig.java”到您的productFlavor特定源文件夹,即

src/<productflavor>/java/<packagename>/Appconfig.java
;然后您可以在应用程序中使用
Appconfig.PRODUCT_FLAVOR
。编译器会让你保持诚实,并确保你为所有风格添加这个。

就像我说的,在这种特殊情况下,接受的解决方案可能更好,因为您甚至不需要为新的 ProductFlavors 添加任何内容,但这种方法可能对其他情况有用。


0
投票

根据您需要风味名称的用途,您可能需要考虑风味源集。如果只是为了在屏幕上呈现原始风味或应用程序行为的微小变化,那么使用

BuildConfig
是有意义的。但是,如果您打算做的事情开始看起来像到处都是这种 switch 语句:

switch (BuildConfig.FLAVOR) {
    case "banana":
        doTheBanananThing();
        break;
    case "other":
        doTheOtherThing();
        break;
        // and so on..
}

使用风味源集可能更有意义。

在项目主源集中为

interface
创建
Flavor
可能是有意义的,尽管您也可以直接使用特定于风味的类,只要它们是为所有风味定义的即可。

public interface Flavor {
  doFlavorThing();
}

然后在您的 Flavor 特定源集中定义

public class FlavorImpl implements Flavor {
  @Override
  public void doFlavorThing() {
    // Do it..
  }
}

然后在主源集中你可以把它放在某个地方

Flavor flavor = new FlavorImpl();
flavor.doFlavorThing();

这样做的好处是,任何风格特定的代码都不会泄漏到其他风格(尽管 proguard 也可以用来实现这一点),而且总的来说,我发现这种组织代码的方法非常干净,特别是如果您还想自定义清单的话,口味的资源等。最大的警告是编辑器和 IDE 为特定风格的源集提供不同程度的支持。

© www.soinside.com 2019 - 2024. All rights reserved.