How to change the Android app package name when assembling with Gradle?
Solution 1
You could so something like this
android {
...
defaultConfig {
minSdkVersion 8
versionCode 10
}
flavorDimensions "flavor1", "flavor2"
productFlavors {
flavor1 {
applicationId "com.example.flavor1"
versionCode 20
}
flavor2 {
applicationId "com.example.flavor2"
minSdkVersion 14
}
}
}
You can also change the field android.defaultConfig.applicationId
if you want to do one-off builds.
Taken from: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-Flavor-Configuration
Solution 2
As a simpler alternative to using product flavours as in Ethan's answer, you can also customise build types.
How to choose between the approaches:
- If you need different package names to be able to have both debug and release apks installed on a device, then use the build type approach below, as Gradle plugin docs agree. In this case flavours are an overkill. (I think all projects should by default do this, as it will make life easier especially after you've published to the store and are developing new features.)
- There are valid uses for product flavours, the typical example being an app with free and paid versions. In such case, check Ethan's answer and read the documentation too: Configuring Gradle Builds and Gradle Plugin User Guide.
(You can also combine the two approaches, which results in every build variant having distinct package name.)
Build type configuration
For debug build type, and all other non-release types, define applicationIdSuffix
which will be added to the default package name.
(Prior to Android Gradle plugin version 0.11 this setting was known as 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
// ...
}
}
}
Above, debug
and release
are default build types whose some aspects are configured, while beta
is a completely custom build type. To build the different types, use assembleDebug
, assembleBeta
, etc, as usual.
Similarly, you can use versionNameSuffix
to override the default version name from AndroidManifest (which I find very useful!). E.g. "0.8" → "0.8-BETA", as configured above.
Resources:
- This example is straight from Xavier Ducrohet's "Google I/O 2013: The New Android SDK Build System" presentation.
- Build Types in the User Guide.
Myself I've been using productFlavors
so far for this exact purpose, but it seems build type customisation may be closer to my needs, plus it keeps the build config simpler.
Update (2016): I've since used this approach in all my projects, and I think it definitely is the way to go. I also got it included in Android Best Practices guide by Futurice.
Solution 3
With the gradle plugin version of 1.0.0+ you have to use applicationId as stated in the migration guide
Renamed Properties in ProductFlavors
packageName => applicationId
Thus in your build.gradle you would now use:
productFlavors {
flavor1 {
applicationId "com.example.flavor1"
}
flavor2 {
applicationId "com.example.flavor2"
}
}
Solution 4
From Ethan's answer, both flavorGroups and packageName both are not available anymore. Below works as of March 2015.
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
}
}
}
Solution 5
I did not want to use Flavors, so I found a way to do so with buildTypes. I did this by changing my app/build.gradle
file as follows:
defaultConfig {
applicationId "com" // See buildTypes.type.applicationIdSuffix
...
}
...
buildTypes {
debug {
applicationIdSuffix ".domain.name.debug"
...
}
releaseStaging {
applicationIdSuffix ".compagny.staging"
...
}
release {
applicationIdSuffix ".domain.name"
...
}
}
This allows me to have 3 apps next to each other on my devices.
I hope this helps others.
Comments
-
Seraphim's almost 2 years
Is it possible to change the package name of an Android application using Gradle?
I need to compile two copies of the same app, having a unique package name (so I can publish to the market twice).
-
Jonik over 10 yearsFor those wondering how to tell Gradle to build a particular flavour: By default all flavours are built, or you can specify one by running e.g.
gradle assembleFlavor1Debug
orgradle assembleFlavor2Release
.gradle tasks
is also helpful. -
Seraphim's over 10 yearsWow! thanks. Can I avoid the -debug-unaligned- and -release-unaligned- builds apks that are generated automatically by Gradle?
-
Jonik over 10 yearsWell, yeah. If you do
gradle assembleDebug
, it will only producemyapp-debug-unaligned.apk
. Building a custom type likebeta
above,assembleBeta
will produce bothmyapp-beta-unaligned.apk
andmyapp-beta.apk
(aligned i.e. optimised), unless you definezipAlign false
for that type. See "The possible properties and their default values" in User Guide. I assume it's usually fine to only use zipAlign only for actual release builds. -
Seraphim's over 10 yearsSorry I can't upvote your answer twice! ;) thanks I'll try your solution
-
Jonik over 10 yearsAnother tip: when building with Android Studio, make sure you are aware which build variant (type & flavour) is selected. (Perhaps obvious, but I just learned about it a few days ago. :)
-
Seraphim's over 10 yearsI've a bad karma for AndroidStudio. I'll wait for a decent release. I'm using Eclipse and Gradle with batch. Anyway, thanks for the tip.
-
Ashwin N Bhanushali about 10 yearsHey should I need to copy java files from main/java to the flavor/java when changing the packageName using productFlavor?
-
Ethan about 10 yearsI don't think so, but I have no data to support that guess.
-
Seraphim's over 9 yearsyes, see my other question stackoverflow.com/questions/27374933/…
-
Nilzor over 9 yearsWhat do you do when you need GCM or other permission which depends on the application ID? e.g `<uses-permission android:name="com.myapp.debug.permission.C2D_MESSAGE" />. Any way to provide variables in androidManifest.xml?
-
Jonik over 9 years@Nilzor: Sorry, I have no experience with that. Consider asking a new question.
-
Martin Marconcini about 9 yearsThe drawback of this approach (which is fine and should be used in conjunction with the above is that Android won't let you have both (say BETA and DEBUG) installed at the same time, because the package is the same and the OS couldn't care less about the file name ;)
-
Jonik about 9 years@MartínMarconcini: you might have misunderstood something. With
applicationIdSuffix
you specifically change the application ID (package name), which means you certainly can have beta and debug installed at the same time. In addition, my answer shows how to customise version name (which you might for example show inside the app) usingversionNameSuffix
. -
Martin Marconcini about 9 years@Jonik you're correct, I misread your post. This is the correct way to do it if you want to have qa/debug/releases build at the same time (useful when you're developing and you want to keep a release version side by side with your development version, to compare behaviors).
-
Seraphim's about 9 yearsHey, your response has already been posted! Please delete it before someone vote it down.
-
sivag1 about 9 yearsHi @Seraphim's, sorry I don't see where it is posted in the thread. Can you please point me? I would be glad to delete.
-
Jonik about 9 yearsNote that
packageName
was renamedapplicationId
(andflavorGroups
=>flavorDimensions
) in Android Gradle plugin version 1.0. (Consider updating the answer.) -
3dmg almost 9 years@Nilzor you can add this to your AndroidManifest: <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
-
Philipp E. over 8 years
-
Louis CAD almost 8 yearsFor AndroidAnnotations users, this may also help.
-
Adam Johns almost 6 yearsSo multiple apps with the same package string in the manifest, but different applicationIds can be uploaded to the Play Store?