Juliette Rapala
Jun 19 · 3 min read

If you’re a React Native developer like me, you may have been surprised to see your Android build that JUST WORKED, failing and failing and failing again.

The issue, if you’re in Android Studio, went something like this:

Caused by: java.lang.RuntimeException: Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18–91
is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18–86 value=(androidx.core.app.CoreComponentFactory).
Suggestion: add ‘tools:replace=”android:appComponentFactory”’ to <application> element at manifestMerger6369655802117611865.xml:7:5–9:19 to override.

Did you think to yourself “Huh? AndroidX? I’m not supporting that yet.”, then follow along. Here’s how to fix the issue without adding AndroidX support.

What Happened?

Google pulled a fast one on us yesterday (June 17, 2019) and released a MAJOR version update on it’s Google Play and Firebase libraries. That means, any dependencies imported to the tune of:

implementation ‘com.google.android.gms:play-services-base:+’ 

…(note the +) will be affected.

How to Fix It

  1. Hop over to your /android/app/build.gradle file and check out your dependencies. Search for any instance of play-services or firebase* and see if it’s pulling in the latest version (+).
dependencies {
implementation "com.android.support:appcompat-v7...
implementation "com.facebook.react:react-native:+"
// found one! vv
implementation "com.google.android.gms:play-services-base:+"
// found one! vv
implementation "com.google.android.gms:play-services-maps:+"
implementation "com.google.firebase:firebase-core:16.0.1"
}

2. Head over to MVNRepository and search for the troublesome dependencies. Here you’ll be able to find the last released version of your module. Update /android/app/build.gradle to that version along with a force flag to handle any version conflicts:

dependencies {
implementation "com.android.support:appcompat-v7..
implementation "com.facebook.react:react-native:+"
implementation ("com.google.android.gms:play-services-base:16.1.0"){ force = true }
implementation ("com.google.android.gms:play-services-maps:16.1.0"){ force = true }
implementation "com.google.firebase:firebase-core:16.0.1"
}

3. Time to handle your node_modules. Navigate into /android and run the following command:

./gradlew :app:dependencies

This will generate a dependency tree for your entire project.

4. Grab the tree and paste in into a text editor. Search for any instance of play-services or firebase* and navigate up the tree to see where the module is being used. In this case, react-native-push-notifications has a com.google.android.gms:play-services-gcm:+ dependency.

+ — — project :react-native-push-notification
| + — — com.android.support:appcompat-v7:28.0.0 (*)
| + — — com.facebook.react:react-native:+ -> 0.59.8 (*)
| + — — com.google.android.gms:play-services-gcm:+ -> 17.0.0 (*)
| + — — me.leolin:ShortcutBadger:1.1.8

5. Patch those packages! If I am in a time crunch, I will use patch-package, a genius library that lets you make changes to a package and then creates a patch for you to store with your project. The patch will then apply via a postinstall any time you or someone on your team runs npm i.

In my case, I navigated to the build.gradle file of react-native-push-notification, made my updates, ran:

npx patch-package react-native-push-notification

…and voila! I have a patch!

And You’re Done!

In my case, I needed to apply patches to both react-native-push-notification and react-native-push-notification.

Do note that this is just a band-aid until you’re ready to support AndroidX and all its glory 🤖

Hope this helps!

*For a full list of updated dependencies navigate here.


👋 Hi! I’m Juliette. I work at Eventric as a Software Developer. Come follow me on Twitter at @Juliette.

Juliette Rapala

Written by

React & React Native Developer. Building awesome things @Eventric.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade