【发布时间】:2013-08-31 17:56:58
【问题描述】:
是否可以使用 Gradle 更改 Android 应用程序的包名称?
我需要编译同一个应用程序的两个副本,具有唯一的包名称(这样我可以向市场发布两次)。
【问题讨论】:
标签: android gradle android-build android-gradle-plugin
是否可以使用 Gradle 更改 Android 应用程序的包名称?
我需要编译同一个应用程序的两个副本,具有唯一的包名称(这样我可以向市场发布两次)。
【问题讨论】:
标签: android gradle android-build android-gradle-plugin
作为使用产品风格as in Ethan's answer 的更简单的替代方法,您还可以自定义构建类型。
如何选择方法:
(您也可以将这两种方法结合起来,这会导致每个构建变体都有不同的包名称。)
对于debug 构建类型和所有其他非release 类型,定义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 指南中。
【讨论】:
gradle assembleDebug,它只会产生myapp-debug-unaligned.apk。构建像上面的beta 这样的自定义类型,assembleBeta 将同时生成myapp-beta-unaligned.apk 和myapp-beta.apk (aligned i.e. optimised),除非您为该类型定义zipAlign false。请参阅User Guide 中的“可能的属性及其默认值”。我认为仅将 zipAlign 仅用于实际发布版本通常是可以的。
你可以这样
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
【讨论】:
gradle assembleFlavor1Debug 或 gradle assembleFlavor2Release。 gradle tasks 也很有帮助。
packageName 在 Android Gradle plugin version 1.0 中重命名为 applicationId(和 flavorGroups => flavorDimensions)。 (考虑更新答案。)
packageName与applicationId不一样,见tools.android.com/tech-docs/new-build-system/…
使用 1.0.0+ 的 gradle 插件版本,您必须使用 migration guide
中所述的 applicationIdProductFlavors 中的重命名属性
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
}
}
}
【讨论】:
我不想使用 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 个彼此相邻的应用。
我希望这对其他人有所帮助。
【讨论】: