Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gradle: How to merge Android manifest files for different buildTypes which need the same Activity, but with different intent-filters

so I'm trying to use gradle to create a separate buildType, but that buildType needs to use different characteristics for the same Activity. In this case, my splash activity needs a different intent-filter depending on buildType. Is this possible?

I get the following error in gradle:

:Tinder:processUtestManifest
[AndroidManifest.xml:67, AndroidManifest.xml:38] Trying to merge incompatible /manifest/application/activity[@name=com.<company_name>.activities.ActivitySplash] element:
  <activity
      @android:name="com.<company_name>.activities.ActivitySplash"
      <intent-filter>
          <action
--            @android:name="android.intent.action.MAIN">
  <activity
      @android:name="com.<company_name>.activities.ActivitySplash"
      <intent-filter>
          <action
++            @android:name="com.apphance.android.LAUNCH">
like image 262
Karim Varela Avatar asked Sep 09 '13 22:09

Karim Varela


People also ask

What is use of Android manifest file also explain its common settings?

The manifest file is also where you can declare what types of hardware or software features your app requires, and thus, which types of devices your app is compatible with. Google Play Store does not allow your app to be installed on devices that don't provide the features or system version that your app requires.

What is manifest placeholder?

xml file in the directory structure. Android Manifest usually contains pre-defined or static information which is then used to run the app. However, Android toolchain provides customization by allowing you to specify dynamic information through variable declaration, generally referred as Android Manifest placeholders.


2 Answers

It's not possible to merge the intent-filter separately at the moment so I would recommend copying the whole <activity> node into

src/buildtype1/AndroidManifest.xml

and

src/buildtype2/AndroidManifest.xml

and it'll get merged automatically into the final manifest (of course you also want to remove it from the main manifest).

like image 109
Xavier Ducrohet Avatar answered Sep 21 '22 03:09

Xavier Ducrohet


Let me post a full solution that works. In this case, the application manages intent filters for both images and videos. However, for a particular flavor, we only want to capture videos, not images.

Say your activity is defined like this:

<activity
    android:name=".MainActivity"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:label="@string/app_name"
    android:launchMode="singleTop"
    android:screenOrientation="landscape"
    android:theme="@style/CameraTheme">

    <intent-filter>
        <action android:name="android.media.action.IMAGE_CAPTURE"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>

    <intent-filter>
        <action android:name="android.media.action.VIDEO_CAPTURE"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

For your flavor named myFlavor, that I assume you already have, you have to have this in your AndroidManifest.xml file:

<!-- Remove the intent filter for images. MyFlavor is only for videos. -->
<activity
    android:name="com.androidsx.heliumvideochanger.MainActivity"
    tools:node="merge">

    <intent-filter tools:node="remove">
        <action android:name="android.media.action.IMAGE_CAPTURE"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

Sync with Gradle, and check the final manifest, that is usually in myApp/build/intermediates/manifests/full/myFlavor/debug/AndroidManifest.xml

like image 29
espinchi Avatar answered Sep 22 '22 03:09

espinchi