Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Customize AndroidManifest in different build types

I want to customize AndroidManifest in different build types. For example in debug mode I just want an Activity to be exported.

Assume main manifest:

/main/AndroidManifest.xml

<application>
    <activity
        android:name="com.example.MainActivity" />
</application>

Debug manifest:

/debug/AndroidManifest.xml

<application>
    <activity
        android:name="com.example.MainActivity"
        android:exported="true" />
</application>

Example manifest (same as debug):

/example/AndroidManifest.xml

<application>
    <activity
        android:name="com.example.MainActivity"
        android:exported="true" />
</application>

In the debug manifest I get Duplicate registration for activity com.example.MainActivity

That's why I created the example build type.

/build.gradle

android {
    buildTypes {
        example.initWith(buildTypes.debug)
    }
}

But it also doesn't work.

[AndroidManifest.xml:17, AndroidManifest.xml:4] Trying to merge incompatible /manifest/application/activity[@name=com.example.MainActivity] element:
  <activity
--    @android:name="com.example.MainActivity">
--</activity>
--(end reached)
  <activity
++    @android:exported="true"
++    @android:name="com.example.MainActivity">
++</activity>

I'm wondering whether this is a bug, missing feature (will be implemented in the future) or I'm doing something wrong?

I know I can provide different manifest in release and debug (without the one in /main), but I don't think this is a good solution.

EDIT: The solution so far is to define bool in resources and use it inside main manifest. In debug resources the bool will be true while in the release false. This solution seems much better than duplicated manifests, but the question is still actual.

like image 416
tomrozb Avatar asked Dec 05 '13 16:12

tomrozb


1 Answers

As of gradle plugin 0.10 it's finally supported. More info about new manifest merger: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger

At the moment (gradle plugin 0.10) it requires this extra configuration in build.gradle

android {
 useOldManifestMerger false
}
like image 127
tomrozb Avatar answered Sep 23 '22 00:09

tomrozb