ApplicationId由构建类型和风味维度

时间:2015-08-06 14:55:26

标签: android gradle

我有一个具有2种风味尺寸的应用程序。第一个维度,让我们称之为"品牌"有两种类型: "草莓","青色"

两者都有不同的applicationIds,但我们只关注其中一个。让我们说"青色"有applicationId" com.cyan.app"。

第二种风味维度叫做环境"。它有两个值: " prod"," test"。

我还有两种构建类型: "调试","发布"

现在我感兴趣的是,如何配置gradle脚本,这样每当我构建调试版本时,都会有applicationIdSuffix,它将包含" debug"字符串和环境名称字符串。所以在上面的例子中它将是: com.cyan.app.debug.prod和com.cyan.app.debug.test

但是如果我构建一个应用程序的发布版本,我想留下主要的applicationId,所以com.cyan.app,无论环境风味。

有什么办法可以用gradle和android gradle插件实现吗?

1 个答案:

答案 0 :(得分:3)

好的,我在周末坐下来并且能够实现这一目标(以及更多)。在这里分享,以便其他人可以受益于谁想要实现我在问题中发布的相同的事情。

首先,我们必须将自己附加到applicationVariants.all任务,如下所示:

applicationVariants.all { variant ->
  //We tweak the package name and application name depending on the variants (so that we can have multiple applications installed on the phone, depending on the 
  tweakPackageName(variant);
  replaceInManifest(variant, 'android:label=\"@string/app_name\"', 'android:label=\"@string/
}

我已将逻辑分离到其他方法,以便代码不会被阻塞。 tweakPackageName方法看起来非常简单(事实证明):

/**
 * Method that alters the package name in order to have many different variants of application installed simultanously on a device.
 */
ext.tweakPackageName = { variant ->
  def envFlavor = getFlavorOfDimension(variant, flavorDimEnvironmentName);
  variant.mergedFlavor.applicationId = variant.mergedFlavor.applicationId + ".${envFlavor.name.toLowerCase()}";
}

getFlavorOfDimension是一个简单的方法来获取我感兴趣的特定维度的味道(不是一个大问题所以我不会在这里使用此代码发送垃圾邮件)。当我们得到味道时,我们将它添加到mergedFlavor对象的包名称中,我们就完成了。

我还设法不仅更改了包名,而且还动态更改了应用程序启动器名称,但是StackOverflow上有很多解决方案,所以这里我不会多余。总而言之,改变包名称的解决方案是有效的。希望它会帮助像我这样的人帮助我。