与Gradle组装时如何更改Android应用程序包名称?

是否有可能使用Gradle更改Android应用程序的包名称?

我需要编译两个相同的应用程序,有一个独特的包名(所以我可以发布到市场两次)。

你可以这样

android { ... defaultConfig { minSdkVersion 8 versionCode 10 } flavorDimensions "flavor1", "flavor2" productFlavors { flavor1 { applicationId "com.example.flavor1" versionCode 20 } flavor2 { applicationId "com.example.flavor2" minSdkVersion 14 } } } 

如果你想做一次性构build,你也可以改变字段android.defaultConfig.applicationId

取自: http : //tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-Flavor-Configuration

作为在Ethan的答案中使用产品风味的一个更简单的替代方法,您也可以自定义构buildtypes

如何在两种方法之间进行select:

  • 如果你需要不同的软件包名称,可以同时在设备上安装debugrelease apks,那么使用下面的build type方法,就像Gradle插件文档一样 。 在这种情况下味道是一个矫枉过正。 (我认为所有的项目都应该默认这样做,因为这会让你的生活更轻松,尤其是你发布到商店并开发新function之后)。
  • 产品口味是有效的用途,典型的例子是免费和付费版本的应用程序。 在这种情况下,检查Ethan的答案,并阅读文档: configurationGradle构build和Gradle插件用户指南 。

(我想你也可以结合这两种方法,这将导致每个构build变体具有不同的包名称,但是我没有testing过这个)。

构buildtypesconfiguration

对于debugging版本types以及所有其他非版本types,请定义applicationIdSuffix ,它将被添加到默认的软件包名称中。 (在Android Gradle插件版本0.11之前,这个设置被称为packageNameSuffix 。)

 android { buildTypes { debug { applicationIdSuffix '.debug' versionNameSuffix '-DEBUG' } beta { applicationIdSuffix '.beta' versionNameSuffix '-BETA' // NB: If you want to use the default debug key for a (non-debug) // build type, you need to specify it: signingConfig signingConfigs.debug } release { // signingConfig signingConfigs.release // runProguard true // ... } } } 

在上面, debugrelease是默认的构buildtypes,其中一些方面被configuration,而beta是一个完全自定义的构buildtypes。 要像往常一样构build不同的types,请使用assembleDebugassembleBeta等。

同样,你可以使用versionNameSuffix来覆盖AndroidManifest的默认版本名称(我发现它非常有用!)。 例如上面configuration的“0.8”→“0.8-BETA”。

资源:

  • 这个例子直接来自Xavier Ducrohet的“ Google I / O 2013:新的Android SDK构build系统 ”演示文稿。
  • 在用户指南中创buildtypes 。

我自己我一直在使用productFlavors到目前为止的确切目的,但似乎构buildtypes自定义可能更接近我的需要,再加上它使构buildconfiguration更简单。

更新(2016年) :我已经在我的所有项目中使用了这种方法,我认为这肯定是要走的路。 我也将它包含在Futurice的Android Best Practices指南中。

使用1.0.0+的gradle插件版本,您必须按照迁移指南中的说明使用applicationId

在ProductFlavors中重命名了属性

packageName => applicationId

因此,在你的build.gradle你现在可以使用:

 productFlavors { flavor1 { applicationId "com.example.flavor1" } flavor2 { applicationId "com.example.flavor2" } } 

从Ethan的回答来看,flavorGroups和packageName都不可用了。 以下工作截至2015年3月。

 android { ... defaultConfig { minSdkVersion 8 versionCode 10 } flavorDimensions "flavor" productFlavors { flavor1 { flavorDimension "flavor" applicationId "com.example.flavor1" versionCode 20 } flavor2 { flavorDimension "flavor" applicationId "com.example.flavor2" minSdkVersion 14 } } }