应用程序ID受构建类型和风味维度的限制。

3
我有一个应用程序,它有两个不同的变体维度。第一个维度叫做“品牌”,有两种类型:“草莓”和“青色”。
这两种类型都有不同的applicationIds,但是我们只需要关注其中一个。比如说,“青色”有applicationId“com.cyan.app”。
第二个变体维度叫做“环境”。它有两个值:“prod”和“test”。
我还有两个构建类型:“debug”和“release”。
现在我想知道,我如何配置gradle脚本,以便每当我构建debug版本时,都会有一个包含“debug”字符串和环境名称字符串的applicationIdSuffix。因此,在上面的例子中,它将是com.cyan.app.debug.prod和com.cyan.app.debug.test。
但是,如果我构建一个应用程序的release版本,我希望保留主应用程序Id,即com.cyan.app,而不管环境变量如何。
我是否可以通过gradle和android gradle插件实现这一点呢?

1
“environment” 不是产品风味维度,以我个人看法。要么 prod=releasetest=debug 作为构建类型,要么 prodtest 只是其他自定义构建类型。你为什么认为 environment 应该成为产品风味维度呢? - CommonsWare
首先感谢您的回答和抽出时间。其次,我们能否请您坚持主题?让我们称这些维度为“dimension_1”和“dimension_2”,变量为“variant_1”、“variant_2”等。维度是用来做什么的与主题或问题有何关系呢?在我看来,这与问题无关。答案要么是可以实现,要么不行。如果有人确实知道如何实现我的要求,我将非常感激。 - Lucas
第二点,我们能不能请你坚持话题?我一直在坚持话题,话题是“如何获取我想要的applicationId值”,如果你没有多个flavor dimensions,这种情况会更简单。我为试图提供帮助而道歉,并将采取措施确保我今后不再这样做。 - CommonsWare
1
我不是一个好斗的人,所以我不会因为你的回答而与你争吵。就像我之前说过的,虽然你不能帮助我解决我提出的确切问题,但我很感激你抽出时间来尝试。如果有其他人知道如何在gradle和android gradle插件中实现我所寻求的内容,我将非常感激。只是想澄清一下,我不是在寻找一个简化我的情况的解决方案。那并不吸引我。我想找到一个解决我提出的确切问题的解决方案,即多个构建类型和多个口味维度(具有多个口味)。 - Lucas
1个回答

4

好的,我在周末坐下来并成功实现了这个(以及更多)。在这里分享一下,让其他人也可以从中受益,他们想要像我在问题中发布的那样实现这个。

首先,我们必须像这样将自己附加到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上有许多解决方案,所以我不会在这里重复了。总之,修改包名的解决方案可行。希望它能像帮助我一样帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接