10

I have a question about Firebase+Crashlytics+Android. On Android Studio I am getting the following error:

org.gradle.api.GradleException: Crashlytics Developer Tools error. com.crashlytics.tools.android.exception.PluginException: Crashlytics Developer Tools error. java.lang.illegalArgumentException: Crashlytics found an invalid API key: null.

I have followed the instructions here and here. As I understand it, I don’t need to set the apiKey in the project and Firebase will take care of this. But the project build still fails and complains. I haven’t been able to find appropriate help online about this. The documentation on Crashlytics also seems to be in beta on Firebase.

The closest I’ve gotten is someone suggesting that I set up a fabric.properties file with an apiKey field set. But on the Firebase->Crashlytics dashboard I can’t find this API key.

Does anyone have an idea how this can be resolved?

Note 1: I don’t have admin access to the project on Firebase. Maybe the key is only visible to them?

Note 2: It’s actually a react-native project. But that shouldn’t really make a difference since this is purely a native-side configuration.

Edit: Adding app/build.gradle on request:

apply plugin: "com.android.application"
apply plugin: "io.fabric"
apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle" // MANUAL CHANGE

import com.android.build.OutputFile
def enableSeparateBuildPerCPUArchitecture = false
def enableProguardInReleaseBuilds = false

android {

    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.my.app"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 4
        versionName "1.0"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a", "x86"
        }
    }

    buildTypes {
        release {
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
            signingConfig signingConfigs.release
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.each { output ->

            def versionCodes = ["armeabi-v7a":1, "x86":2]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
            }
        }
    }
}

dependencies {
    compile(project(':react-native-firebase')) {
        transitive = false
    }
    compile project(':react-native-push-notification')
    compile project(':react-native-google-analytics-bridge')
    compile project(':react-native-device-info')
    compile (project(':react-native-google-analytics-bridge')) {
        exclude group: 'com.google.android.gms'
    }

    compile (project(':react-native-device-info')) {
        exclude group: 'com.google.android.gms'
    }

    compile (project(':react-native-push-notification')) {
        exclude group: 'com.google.android.gms'
    }
    compile(project(':react-native-maps')) {
        exclude group: 'com.google.android.gms'
    }
    compile project(':react-native-config')
    compile project(':react-native-vector-icons')

    compile('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') {
        transitive = true
    }

    // Forcing version 11.8.0 of play-services because that's the version firebase needs for all its features
    compile ("com.google.android.gms:play-services-maps:11.8.0") {
        force = true
    }
    compile ("com.google.android.gms:play-services-gcm:11.8.0") {
        force = true
    }
    //Analytics
    compile ('com.google.firebase:firebase-core:11.8.0') {
        force = true
    }
    //Cloud Messaging
    compile ('com.google.firebase:firebase-messaging:11.8.0') {
        force = true
    }
    //Authentication
    compile ('com.google.firebase:firebase-auth:11.8.0') {
        force = true
    }

    compile fileTree(dir: "libs", include: ["*.jar"])
    compile "com.android.support:appcompat-v7:23.0.1"
    compile "com.facebook.react:react-native:+"  // From node_modules
}

task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}
Benjamin
  • 7,055
  • 6
  • 40
  • 60
Rameez Hussain
  • 6,414
  • 10
  • 56
  • 85
  • As per note there in documentation: `If you're upgrading from Fabric Crashlytics, remove the Fabric API key from your AndroidManifest.xml. Delete the key's meta-data tag, which should have io.fabric.ApiKey and the API key.` Have you tried this? Try to link firebase crashlytics from Android Studio Tools > Firebase section – NightFury Mar 12 '18 at 10:21
  • Hi. I've tried both of those things. No luck. There doesn't seem to be a Crashlytics option in my Firebase assistant window. Is there a way I can check the version. (Looked around for info on that, also without success). I do have a "Crash Reporting" option though. But this leads to this page -> https://firebase.google.com/docs/crash/?utm_source=studio, where it says Firebase Crash Reporting is deprecated. – Rameez Hussain Mar 12 '18 at 10:31
  • I see. Actually they have deprecated firebase crashlytics recently, and made Fabric crashlytics official. Have you linked with fabric crashlytics in Firebase console? – NightFury Mar 12 '18 at 10:38
  • The Crashlytics section on the Firebase console for this project is active, yes. But it isn't apparent if it is "Firebase Crashlytics" or "Fabric Crashlytics". Also, if it is the latter, do the crash reports get delivered to Firebase, or to Fabric? (I'm guessing it's the latter given the naming) – Rameez Hussain Mar 12 '18 at 10:51
  • 2
    If you have recently created app after 6th march, firebase console should be pointing towards Fabric Crashlytics, else there should be an option for migration as written in blog – NightFury Mar 12 '18 at 10:58
  • 1
    Mike from Firebase here. Can you share your current app build.gradle? – Mike Bonnell Mar 12 '18 at 16:16
  • @MikeBonnell Thanks for your comment. I've added `app/build.gradle` as requested. – Rameez Hussain Mar 13 '18 at 07:53
  • @NightFury We enabled Crashlytics for the app, on the console, before the 6th of March. Now we are setting up the app-side configuration. But I don't see any migration options there in the dashboard. – Rameez Hussain Mar 13 '18 at 10:15
  • I have a similar issue, where there is a dependency for an API key to be detailed - I commented about it here https://github.com/firebase/FirebaseUI-Android/issues/269 – brandall Mar 19 '18 at 10:14
  • did you add the google-services.json file which contains the keys in your project? – Daniel Raouf Mar 20 '18 at 12:58
  • I do have that file. What should I be looking for in there? – Rameez Hussain Mar 21 '18 at 05:36

1 Answers1

4

Mike from Firebase here. If you are an existing Firebase customer, using Crashlytics via Fabric, then here's what your files should look like. Note: We don't have official React Native support, so I'm not including any of those files. I don't think it's relevant given the native implementation here, but trying to be clear :)

Project build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        maven {
            url 'https://maven.fabric.io/public'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath 'com.google.gms:google-services:3.2.0' // google-services plugin
        classpath 'io.fabric.tools:gradle:1.25.1'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com/'
        }
    }


}

task clean(type: Delete) {
    delete rootProject.buildDir
}

App's build.gradle:

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.25.1'

    }
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    maven { url 'https://maven.fabric.io/public' }
    maven {url 'https://maven.google.com'} // Google's Maven repository}

}


android {
    compileSdkVersion 25
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "com.example.mbonnell.myapplication"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false

        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.0'
    testCompile 'junit:junit:4.12'
    compile('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') {
        transitive = true;
    }
    compile('com.google.firebase:firebase-core:11.8.0')


}

apply plugin: 'com.google.gms.google-services'

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mbonnell.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
      <!--<meta-data-->
            <!--android:name="io.fabric.ApiKey"-->
            <!--android:value="YourApiKey" />-->
    </application>

    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

MainActivity.java:

There should be some implementation of Firebase. To keep thing simple, I'm initializing Firebase analytics:

public class MainActivity extends AppCompatActivity {

    private FirebaseAnalytics mFirebaseAnalytics;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
        setContentView(R.layout.activity_main);
}
Mike Bonnell
  • 16,181
  • 3
  • 61
  • 77
  • Thanks! That solved the build issue! I have a follow-up question though: Where do the Fabric logs show up? I mean, specifically, which Fabric account? – Rameez Hussain Mar 19 '18 at 10:46
  • If you're using Firebase Crashlytics, the data won't show up in Fabric unless you were a Fabric customer beforehand. – Mike Bonnell Mar 19 '18 at 12:05
  • I see. We had been Fabric customers since beforehand. But we don't see any logs on our Fabric dashboard. One app did get created when we explicitly used the `apiKey` and `apiSecret` explicitly in `fabric.properties` to silence the errors I’ve mentioned in the original question. But I’ve removed those according to your answer. Now, the issue is that I am not able to see where the logs are ending up. Or are we supposed to create a new Fabric account based on some credentials connected to our Firebase account? – Rameez Hussain Mar 20 '18 at 07:01
  • Did you link the app via Firebase Crashlytics or start it from scratch in Firebase? – Mike Bonnell Mar 20 '18 at 14:06
  • We started from scratch on Firebase. – Rameez Hussain Mar 27 '18 at 08:33
  • Ok, in that case, best to contact Firebase support so that things can be looked into more deeply. – Mike Bonnell Mar 27 '18 at 15:58
  • Ok. Great. Thanks, Mike. I'll do that. – Rameez Hussain Mar 28 '18 at 06:34