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

时间:2013-08-28 15:06:03

标签: android gradle android-build android-gradle

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

我需要编译同一个应用程序的两个副本,具有唯一的包名(因此我可以向市场发布两次)。

5 个答案:

答案 0 :(得分:63)

作为使用产品风格的简单替代方法 as in Ethan's answer,您还可以自定义构建类型

如何选择方法:

  • 如果您需要不同的软件包名称,以便能够在设备上安装 debug release apks,那么请使用构建类型以下方法,Gradle plugin docs agree。在这种情况下,口味是一种矫枉过正。 (我认为默认情况下所有项目都应该这样做,因为它会让你的生活更轻松,尤其是 你已经发布到商店并正在开发新功能。)
  • 产品风味的有效用途,典型示例是具有免费和付费版本的应用。在这种情况下,请检查Ethan's answer并阅读文档:Configuring Gradle BuildsGradle Plugin User Guide

(我想你也可以结合使用这两种方法,这会导致每个构建变体具有不同的包名,但我没有对此进行过测试。)

构建类型配置

对于 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
            // ...
        }

    }
}

上面,debugrelease是默认构建类型,其中某些方面已配置,而beta是完全自定义的构建类型。要构建不同类型,请照常使用assembleDebugassembleBeta等。

同样,您可以使用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个应用程序彼此相邻。

我希望这对其他人有帮助。