【问题标题】:How to change the Android app package name when assembling with Gradle?使用 Gradle 组装时如何更改 Android 应用程序包名称?
【发布时间】:2013-08-31 17:56:58
【问题描述】:

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

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

【问题讨论】:

    标签: android gradle android-build android-gradle-plugin


    【解决方案1】:

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

    如何选择方法:

    • 如果您需要不同的软件包名称才能在设备上同时安装 debug 和 release apk,请使用 build type方法如下,如Gradle plugin docs agree。在这种情况下,口味是多余的。 (我认为默认情况下所有项目都应该这样做,因为它会让生活更轻松,尤其是在您发布到商店并开发新功能之后。)
    • 产品风格有一些有效用途,典型的例子是具有免费和付费版本的应用。在这种情况下,请检查 Ethan's answer 并阅读文档:Configuring Gradle Builds 和 Gradle Plugin User Guide。

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

    构建类型配置

    对于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 Studio 构建时,请确保您知道 which build variant (type & flavour) is selected。 (也许很明显,但我几天前才知道。:)
    • @Jonik 你是对的,我误读了你的帖子。如果您想同时构建 qa/debug/releases,这是正确的方法(当您正在开发并且希望将发布版本与开发版本并排保存以比较行为时很有用) .
    • @Nilzor 您可以将其添加到您的 AndroidManifest:
    • 对于 AndroidAnnotations 用户,this 也可能有所帮助。
    【解决方案2】:

    你可以这样

    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 构建特定风味的人:默认情况下会构建所有风味,或者您可以通过运行例如指定一个风味。 gradle assembleFlavor1Debug 或 gradle assembleFlavor2Release。 gradle tasks 也很有帮助。
    • 嘿,在使用 productFlavor 更改 packageName 时,我是否需要将 java 文件从 main/java 复制到 flavor/java?
    • 我不这么认为,但我没有数据支持这个猜测。
    • 请注意 packageName 在 Android Gradle plugin version 1.0 中重命名为 applicationId(和 flavorGroups => flavorDimensions)。 (考虑更新答案。)
    • packageName与applicationId不一样,见tools.android.com/tech-docs/new-build-system/…
    【解决方案3】:

    使用 1.0.0+ 的 gradle 插件版本,您必须使用 migration guide

    中所述的 applicationId

    ProductFlavors 中的重命名属性

    packageName => applicationId

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

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

    【讨论】:

    【解决方案4】:

    根据 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
        }
    }
    }
    

    【讨论】:

    • 您好,您的回复已发布!请在有人投反对票之前将其删除。
    • 嗨@Seraphim,对不起,我看不到它在线程中的发布位置。你能指点我吗?我很乐意删除。
    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2015-05-30
      • 2011-07-23
      • 2014-04-14
      • 1970-01-01
      相关资源
      最近更新 更多