52

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

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

4

5 回答 5

71

作为在 Ethan 的回答中使用产品风味 的更简单替代方法,您还可以自定义构建类型

如何在方法之间进行选择:

  • 如果您需要不同的包名称才能在设备上同时安装调试发布apk,请使用下面的构建类型方法,正如Gradle 插件文档所同意的那样。在这种情况下,口味是多余的。(我认为默认情况下所有项目都应该这样做,因为它会使生活更轻松,尤其是您发布到商店并正在开发新功能之后。)
  • 产品风味有很多用途,典型的例子是免费和付费版本的应用程序。在这种情况下,请查看Ethan 的回答并阅读文档:配置 Gradle 构建Gradle 插件用户指南

(您也可以将这两种方法结合起来,这会导致每个构建变体都具有不同的包名称。)

构建类型配置

对于调试构建类型和所有其他非发布类型,定义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是配置了某些方面的默认构建类型,而beta是完全自定义的构建类型。要构建不同的类型,请像往常一样使用assembleDebug,assembleBeta等。

同样,您可以使用versionNameSuffix覆盖 AndroidManifest 中的默认版本名称(我觉得这非常有用!)。例如“0.8”→“0.8-BETA”,如上配置。

资源:

我自己productFlavors到目前为止一直用于这个确切的目的,但似乎构建类型自定义可能更接近我的需求,而且它使构建配置更简单。

更新(2016 年):我在所有项目中都使用了这种方法,我认为这绝对是要走的路。我还将它包含在Futurice的Android 最佳实践指南中。

于 2014-01-08T21:08:39.810 回答
58

你可以这样

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

于 2013-08-28T21:30:05.423 回答
10

使用 1.0.0+ 的 gradle 插件版本,您必须使用迁移指南中所述的applicationId

ProductFlavors 中的重命名属性

包名 => 应用程序 ID

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

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

   flavor2 {
      applicationId "com.example.flavor2"
   } 
}
于 2014-12-23T14:10:28.760 回答
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
    }
}
}
于 2015-03-06T03:01:05.940 回答
2

我不想使用 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 个彼此相邻的应用程序。

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

于 2020-02-19T18:25:41.130 回答