是否可以使用Gradle更改Android应用程序的包名称?
我需要编译同一个应用程序的两个副本,具有唯一的包名(因此我可以向市场发布两次)。
答案 0 :(得分:63)
作为使用产品风格的简单替代方法 as in Ethan's answer,您还可以自定义构建类型。
如何选择方法:
(我想你也可以结合使用这两种方法,这会导致每个构建变体具有不同的包名,但我没有对此进行过测试。)
对于 debug 构建类型以及所有其他非发布类型,请定义applicationIdSuffix
,它将添加到默认包名称中。
(在Android Gradle plugin version 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
// ...
}
}
}
上面,debug
和release
是默认构建类型,其中某些方面已配置,而beta
是完全自定义的构建类型。要构建不同类型,请照常使用assembleDebug
,assembleBeta
等。
同样,您可以使用versionNameSuffix
覆盖AndroidManifest的默认版本名称(我发现它非常有用!)。例如。 “0.8”→“0.8-BETA”,如上所述。
资源:
我自己到目前为止一直在使用productFlavors
这个目的,但似乎构建类型自定义可能更接近我的需求,而且它使构建配置更简单。
更新(2016):我已经在我的所有项目中使用了这种方法,我认为这绝对是可行的方法。我也将它包含在Futurice的Android Best Practices指南中。
答案 1 :(得分:53)
你可以这样吗
android {
...
defaultConfig {
minSdkVersion 8
versionCode 10
}
flavorDimensions "flavor1", "flavor2"
productFlavors {
flavor1 {
applicationId "com.example.flavor1"
versionCode 20
}
flavor2 {
applicationId "com.example.flavor2"
minSdkVersion 14
}
}
}
如果您想进行一次性构建,也可以更改字段android.defaultConfig.applicationId
。
取自:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-Flavor-Configuration
答案 2 :(得分:10)
使用1.0.0+的gradle插件版本,您必须使用migration guide
中所述的 applicationId在ProductFlavors中重命名了属性
packageName =>的applicationID
因此,在build.gradle中,您现在可以使用:
productFlavors {
flavor1 {
applicationId "com.example.flavor1"
}
flavor2 {
applicationId "com.example.flavor2"
}
}
答案 3 :(得分:9)
根据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
}
}
}
答案 4 :(得分:1)
我不想使用Flavors,所以我找到了一种使用buildTypes的方法。我是通过如下更改我的app/build.gradle
文件来完成此操作的:
defaultConfig {
applicationId "com" // See buildTypes.type.applicationIdSuffix
...
}
...
buildTypes {
debug {
applicationIdSuffix ".domain.name.debug"
...
}
releaseStaging {
applicationIdSuffix ".compagny.staging"
...
}
release {
applicationIdSuffix ".domain.name"
...
}
}
这使我可以在自己的设备上将3个应用程序彼此相邻。
我希望这对其他人有帮助。