Reputation: 1403
I am working with a new codebase that has Fabric SDKs. I believe an issue with our AndroidManifest.xml is causing an app crash on certain android devices. We keep getting this error:
04-30 21:25:05.770 E/Fabric (31863): Error dealing with settings
04-30 21:25:05.770 E/Fabric (31863): java.lang.IllegalArgumentException: Fabric could not be initialized, API key missing from AndroidManifest.xml. Add the following tag to your Application element
04-30 21:25:05.770 E/Fabric (31863): <meta-data android:name="io.fabric.ApiKey" android:value="YOUR_API_KEY"/>
04-30 21:25:05.770 E/Fabric (31863): at io.fabric.sdk.android.services.common.ApiKey.logErrorOrThrowException(ApiKey.java:130)
04-30 21:25:05.770 E/Fabric (31863): at io.fabric.sdk.android.services.common.ApiKey.getValue(ApiKey.java:67)
04-30 21:25:05.770 E/Fabric (31863): at io.fabric.sdk.android.services.settings.Settings.initialize(Settings.java:78)
04-30 21:25:05.770 E/Fabric (31863): at io.fabric.sdk.android.Onboarding.retrieveSettingsData(Onboarding.java:124)
04-30 21:25:05.770 E/Fabric (31863): at io.fabric.sdk.android.Onboarding.doInBackground(Onboarding.java:99)
04-30 21:25:05.770 E/Fabric (31863): at io.fabric.sdk.android.Onboarding.doInBackground(Onboarding.java:45)
04-30 21:25:05.770 E/Fabric (31863): at io.fabric.sdk.android.InitializationTask.doInBackground(InitializationTask.java:63)
04-30 21:25:05.770 E/Fabric (31863): at io.fabric.sdk.android.InitializationTask.doInBackground(InitializationTask.java:28)
04-30 21:25:05.770 E/Fabric (31863): at io.fabric.sdk.android.services.concurrency.AsyncTask$2.call(AsyncTask.java:311)
04-30 21:25:05.770 E/Fabric (31863): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-30 21:25:05.770 E/Fabric (31863): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
04-30 21:25:05.770 E/Fabric (31863): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-30 21:25:05.770 E/Fabric (31863): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
04-30 21:25:05.770 E/Fabric (31863): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
04-30 21:25:05.770 E/Fabric (31863): at java.lang.Thread.run(Thread.java:761)
I noticed that we did NOT have our meta-data tag inside the <application>
node, instead it was a sibling to it. When I put the meta-data tag inside it, I see this error on app launch (and the app crashes):
Bindings.FabricSdk.Services.Concurrency.UnmetDependencyException <timeout occurred getting exception details>
Here are the contents of my AndroidManifest.xml, minus any sensitive information.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="My Obfuscated Package Name" android:versionName="3.0.5" android:versionCode="6" android:installLocation="auto">
<uses-sdk android:targetSdkVersion="27" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application android:hardwareAccelerated="true" android:largeHeap="true" android:label="Obfuscated" android:icon="@mipmap/ic_launcher">
<meta-data android:name="io.fabric.ApiKey" android:value="My Obfuscated Fabric API Key" />
</application>
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
</manifest>
Can anyone point out what I am doing wrong here? Please let me know if I am using the right tags as I'm very unfamiliar with stuff like this.
Upvotes: 0
Views: 90
Reputation: 1403
I found this solution but didn't understand it at first. After some more digging, I found that I had to put a Crashlytics build ID string variable in a file called strings.xml
. I didn't have this file, so I created it in the Resources/values folder of my Xamarin.Droid project:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="com.crashlytics.android.build_id">e9e6beb9c4284289ac68b9ab76a9ee56</string>
</resources>
Since doing this, the app launches successfully every time, with the meta-data tag in the correct place.
Upvotes: 1