Product Variants: Multiple Activities

Dominik Schreiber picture Dominik Schreiber · Aug 12, 2014 · Viewed 8.5k times · Source

I'm using Product Variants in gradle/android studio to achieve the following project setup:

  1. Two apps, that are 80% similar in one android studio project.
  2. Each app should have its own manifest package path (they should basically behave like two independent apps - with it's own google api and push keys)

I've followed multiple tutorials in my attempt to achieve this (placeholders, multiple manifests) but nothing works.

Following this tutorial I did the following: http://www.kevinrschultz.com/blog/2014/03/23/using-android-content-providers-with-multiple-package-names/

My build.gradle:

android {
compileSdkVersion 19
buildToolsVersion '20'

defaultConfig {
    minSdkVersion 10
    targetSdkVersion 19
    versionCode 1
    versionName "1.0"
}

buildTypes {
    release {
        runProguard false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}

productFlavors {
    app1 {
        packageName "com.test.app1"
        //applicationId "com.test.app1"
    }

    app2 {
        packageName "com.test.app2"
        //applicationId "com.test.app2"
    }
}}

And here my manifest files.

src/main/manifest:

<?xml version="1.0" encoding="utf-8"?>

<application>
</application>

src/app1/manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:name="com.test.app1”
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name="com.test.app1.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" >
        </activity>
    </application>
</manifest>

src/app2/manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:name="com.test.app2”
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name="com.test.app2.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" >
        </activity>
    </application>
</manifest>

This gives me the following error message:

Manifest merger failed : Main AndroidManifest.xml at AndroidManifest.xml manifest:package attribute is not declared

Unfortunately I can't set a package to each individual manifest tag as my app requires different package paths. If I do it anyway, the merger is not able to merge the manifest files because of different package values. Besides packageName I also tried setting "applicationId" but this doesn't work, either. Using a placeholder like this package="${applicationId}" doesn't work because it doesn't resolve the variable value.

Any ideas how to solve this problem? I'm using Android Studio 0.8.2 with gradle 0.12.2

Answer

pdegand59 picture pdegand59 · Aug 12, 2014

You can safely add

<manifest xmlns:android="..."
  package="com.test.app">
</manifest>

in your main manifest.

But you have to use applicationId and not packageName in your build.gradle. The applicationId of the build.gradle will overwrite this value during your different builds.

A better way of doing this would be to use applicationIdSuffix instead of applicationId for your different product flavors.

The field have to be present in your main manifest.