首页 > 解决方案 > 本机模块中的异常,FirebaseAuth 解析失败

问题描述

我已经构建了一个应用程序,它在 iPhone 上运行良好,但在 Android 上我有一个奇怪的错误。
我不得不弹出该应用程序,因为本机模块对于 Firefbase 更可靠(断开连接更少)。
在我得到的错误下方:

Java exception in 'NativeModules'
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/firebase/firestore/FieldValue;
io.invertase.firebase.firestore.RNFirebaseFirestore.getConstants
    RNFirebaseFirestore.java:759
com.facebook.react.bridge.JavaModuleWrapper.getConstants
    JavaModuleWrapper.java:138
android.os.Handler.handleCallback
    Handler.java:790
android.os.Handler.dispatchMessage
    Handler.java:99
com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage
    MessageQueueThreadHandler.java:29
moduleAndStatics
    C:\Users\snoof\Documents\project\react-native\node_modules\react-native-firebase\dist\utils\apps.js:190:42
Firebase
    C:\Users\snoof\Documents\project\react-native\node_modules\react-native-firebase\dist\modules\core\firebase.js:39:43
<unknown>
    C:\Users\snoof\Documents\project\react-native\node_modules\react-native-firebase\dist\modules\core\firebase.js:97:20
loadModuleImplementation
    C:\Users\snoof\Documents\project\react-native\node_modules\metro\src\lib\polyfills\require.js:292:12
<unknown>
    C:\Users\snoof\Documents\project\react-native\node_modules\react-native-firebase\dist\index.js:1
loadModuleImplementation
    C:\Users\snoof\Documents\project\react-native\node_modules\metro\src\lib\polyfills\require.js:292:12
<unknown>
    C:\Users\snoof\Documents\project\react-native\src\firebase.ts:1
loadModuleImplementation
    C:\Users\snoof\Documents\project\react-native\node_modules\metro\src\lib\polyfills\require.js:292:12
<unknown>
    C:\Users\snoof\Documents\project\react-native\src\Commons\rx+firebase\withIsSignedIn.ts:1
loadModuleImplementation
    C:\Users\snoof\Documents\project\react-native\node_modules\metro\src\lib\polyfills\require.js:292:12
<unknown>
    C:\Users\snoof\Documents\project\react-native\src\RootRouter.tsx:2
loadModuleImplementation
    C:\Users\snoof\Documents\project\react-native\node_modules\metro\src\lib\polyfills\require.js:292:12
<unknown>
    C:\Users\snoof\Documents\project\react-native\src\App.tsx:12
loadModuleImplementation
    C:\Users\snoof\Documents\project\react-native\node_modules\metro\src\lib\polyfills\require.js:292:12
<unknown>
    C:\Users\snoof\Documents\project\react-native\App.js:2
loadModuleImplementation
    C:\Users\snoof\Documents\project\react-native\node_modules\metro\src\lib\polyfills\require.js:292:12
guardedLoadModule
    C:\Users\snoof\Documents\project\react-native\node_modules\metro\src\lib\polyfills\require.js:179:45
global code

任何人都知道如何解决这个问题或如何调查?

使用主要由 Expo 生成的 build.graddle 进行编辑

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

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

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

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'

    defaultConfig {
        applicationId 'com.yamble.k'
        targetSdkVersion 26
        versionCode 1
        versionName '0.7.0'
        ndk {
            abiFilters 'armeabi-v7a', 'x86'
        }
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        // Deprecated. Used by net.openid:appauth
        manifestPlaceholders = [
                'appAuthRedirectScheme': 'host.exp.exponent'
        ]
    }
    dexOptions {
        javaMaxHeapSize System.getenv("DISABLE_DEX_MAX_HEAP") ? null : "8g"
    }

    flavorDimensions 'minSdk', 'remoteKernel'
    productFlavors {
        devKernel {
            dimension 'remoteKernel'
        }
        prodKernel {
            dimension 'remoteKernel'
        }
        devMinSdk {
            dimension 'minSdk'
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prodMinSdk {
            dimension 'minSdk'
            minSdkVersion 21
        }
    }
    signingConfigs {
        debug {
            storeFile file('../debug.keystore')
        }
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
    buildTypes {
        debug {
            debuggable true
            ext.enableCrashlytics = false
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            zipAlignEnabled true
            signingConfig signingConfigs.release
        }
    }

    lintOptions {
        abortOnError false
    }
    packagingOptions {
        pickFirst "**"
    }
    configurations.all {
        resolutionStrategy.force 'com.android.support:design:27.1.0'
        resolutionStrategy.force 'com.android.support:support-v4:27.1.0'
    }
}


configurations.all {
    resolutionStrategy {
        force 'org.webkit:android-jsc:r224109'
    }
}


apply from: 'expo.gradle'


dependencies {
    implementation project(':react-native-firebase')
    implementation project(':react-native-contacts')
    implementation project(':instabug-reactnative')
    implementation project(':react-native-flurry-sdk')
    implementation project(':react-native-vector-icons')

    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:multidex:1.0.1'

    // Our dependencies
    implementation 'com.android.support:appcompat-v7:27.1.1'

    // Our dependencies from ExpoView
    // DON'T ADD ANYTHING HERE THAT ISN'T IN EXPOVIEW. ONLY COPY THINGS FROM EXPOVIEW TO HERE.
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.facebook.android:facebook-android-sdk:4.37.0'
    implementation('com.facebook.android:audience-network-sdk:4.99.0') {
        exclude module: 'play-services-ads'
    }
    compileOnly 'org.glassfish:javax.annotation:3.1.1'
    implementation 'com.jakewharton:butterknife:8.4.0'
    implementation 'de.greenrobot:eventbus:2.4.0'
    implementation 'com.amplitude:android-sdk:2.9.2'
    // Be careful when upgrading! Upgrading might break experience scoping. Check with Jesse. See Analytics.resetAmplitudeDatabaseHelper
    implementation 'com.squareup.picasso:picasso:2.5.2'
    implementation 'com.google.android.gms:play-services-gcm:15.0.1'
    implementation 'com.google.android.gms:play-services-analytics:16.0.1'
    implementation 'com.google.android.gms:play-services-maps:15.0.1'
    implementation 'com.google.android.gms:play-services-auth:15.0.1'
    implementation 'com.google.android.gms:play-services-location:15.0.1'
    implementation 'com.google.android.gms:play-services-ads:15.0.1'
    annotationProcessor 'com.raizlabs.android:DBFlow-Compiler:2.2.1'
    implementation "com.raizlabs.android:DBFlow-Core:2.2.1"
    implementation "com.raizlabs.android:DBFlow:2.2.1"
    implementation "com.madgag.spongycastle:core:1.53.0.0"
    implementation "com.madgag.spongycastle:prov:1.53.0.0"
    debugImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
    // debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.4-beta1'
    releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
    implementation 'com.facebook.device.yearclass:yearclass:1.0.1'
    implementation 'commons-io:commons-io:1.3.2'
    implementation 'me.leolin:ShortcutBadger:1.1.4@aar'
    implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
    implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.7'
    implementation 'com.yqritc:android-scalablevideoview:1.0.1'
    implementation 'commons-codec:commons-codec:1.10'
    implementation 'com.segment.analytics.android:analytics:4.3.0'
    implementation 'com.google.zxing:core:3.2.1'
    implementation 'net.openid:appauth:0.4.1'
    implementation('com.airbnb.android:lottie:2.5.5') {
        exclude group: 'com.android.support', module: 'appcompat-v7'
    }
    implementation 'io.branch.sdk.android:library:2.17.1'
    implementation('io.nlopez.smartlocation:library:3.2.11') {
        transitive = false
    }
    implementation 'com.android.support:exifinterface:27.1.1'
    implementation 'com.squareup.okio:okio:1.9.0'
    implementation 'com.facebook.soloader:soloader:0.5.1'

    implementation 'com.google.android.exoplayer:exoplayer:2.6.1'
    implementation 'expolib_v1.com.google.android.exoplayer:expolib_v1-extension-okhttp:2.6.1@aar'

    // expo-file-system
    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.10.0'

    // Testing
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    // We use a modified build of com.android.support.test:runner:1.0.1. Explanation in maven-test/README
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support:support-annotations:27.1.1'
    androidTestImplementation 'com.google.code.findbugs:jsr305:3.0.0'
    androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
    androidTestImplementation 'com.azimolabs.conditionwatcher:conditionwatcher:0.2'

    testImplementation 'junit:junit:4.12'
    testImplementation 'org.mockito:mockito-core:1.10.19'
    testImplementation 'org.robolectric:robolectric:3.8'
    testImplementation 'com.android.support.test:runner:1.0.2-alpha1'
    testImplementation 'com.android.support.test:rules:1.0.2-alpha1'


    implementation('host.exp.exponent:expoview:31.0.0@aar') {
        transitive = true
        exclude group: 'com.squareup.okhttp3', module: 'okhttp'
        exclude group: 'com.squareup.okhttp3', module: 'okhttp-urlconnection'
    }


}

// This has to be down here for some reason
apply plugin: 'com.google.gms.google-services'

在 react-native-firebase 中,我有(由 expo 生成):

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

apply plugin: 'com.android.library'

def DEFAULT_COMPILE_SDK_VERSION = 27
def DEFAULT_BUILD_TOOLS_VERSION = "28.0.2"
def DEFAULT_TARGET_SDK_VERSION = 27
def DEFAULT_SUPPORT_LIB_VERSION = "27.1.1"

android {
  compileSdkVersion rootProject.hasProperty('compileSdkVersion') ? rootProject.compileSdkVersion : DEFAULT_COMPILE_SDK_VERSION
  buildToolsVersion rootProject.hasProperty('buildToolsVersion') ? rootProject.buildToolsVersion : DEFAULT_BUILD_TOOLS_VERSION
  defaultConfig {
    minSdkVersion 16
    targetSdkVersion rootProject.hasProperty('targetSdkVersion') ? rootProject.targetSdkVersion : DEFAULT_TARGET_SDK_VERSION
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
  }
  buildTypes {
    release {
      minifyEnabled false
    }
  }
  productFlavors {
  }
  lintOptions {
    disable 'GradleCompatible'
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

rootProject.gradle.buildFinished { buildResult ->
  if (buildResult.getFailure() != null) {
    //noinspection GroovyUnusedCatchParameter
    try {
      String message = buildResult.getFailure().properties.get("reportableCauses").toString()
      if (message.contains("com.android.dex.DexException: Multiple dex files define Lcom/google/") ||
        message.contains("java.util.zip.ZipException: duplicate entry: com/google/android/gms/")) {
        logger.log(LogLevel.ERROR, "")
        logger.log(LogLevel.ERROR, " -----------------------------------------------------------")
        logger.log(LogLevel.ERROR, "|                    REACT NATIVE FIREBASE                  |")
        logger.log(LogLevel.ERROR, " ----------------------------------------------------------- ")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|  This is a common build error when using libraries that   |")
        logger.log(LogLevel.ERROR, "|  require google play services.                            |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|  This error occurs because different versions of google   |")
        logger.log(LogLevel.ERROR, "|  play services or google play services modules are being  |")
        logger.log(LogLevel.ERROR, "|  required by different libraries.                         |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|  A temporary fix would be to set:                         |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|             android { multiDexEnabled true }              |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|  inside your build gradle, however it is recommended for  |")
        logger.log(LogLevel.ERROR, "|  your prod build that you de-duplicate these to minimize  |")
        logger.log(LogLevel.ERROR, "|  bundle size.                                             |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, "|  See http://invertase.link/dupe-dex for how to do this.   |")
        logger.log(LogLevel.ERROR, "|                                                           |")
        logger.log(LogLevel.ERROR, " ----------------------------------------------------------- ")
      }
    } catch (Exception exception) {
    }
  }
}

repositories {
  google()
  jcenter()

  def found = false
  def parentDir = rootProject.projectDir
  def androidSourcesName = 'React Native sources'
  def androidPrebuiltBinaryName = 'React Native prebuilt binary'

  1.upto(4, {
    if (found) return true
    parentDir = parentDir.parentFile

    // Running React Native from sources locally or for ExpoKit
    def androidSourcesDir = new File(
      parentDir,
      'node_modules/react-native'
    )

    // Official releases of React Native come with a prebuilt version of Android sources
    // in ./android, e.g. react-native/android/**/react-native-0.57.1.aar
    def androidPrebuiltBinaryDir = new File(
      parentDir,
      'node_modules/react-native/android'
    )

    if (androidPrebuiltBinaryDir.exists()) {
      maven {
        url androidPrebuiltBinaryDir.toString()
        name androidPrebuiltBinaryName
      }

      println "${project.name}: using ${androidPrebuiltBinaryName} from ${androidPrebuiltBinaryDir.toString()}"
      found = true
    } else if (androidSourcesDir.exists()) {
      maven {
        url androidSourcesDir.toString()
        name androidSourcesName
      }

      println "${project.name}: using ${androidSourcesName} from ${androidSourcesDir.toString()}"
      found = true
    }
  })

  if (!found) {
    throw new GradleException(
      "${project.name}: unable to locate React Native android sources or prebuilt binary. " +
        "Ensure you have you installed React Native as a dependency in your project and try again."
    )
  }
}

def supportVersion = rootProject.hasProperty('supportLibVersion') ? rootProject.supportLibVersion : DEFAULT_SUPPORT_LIB_VERSION

dependencies {
  //noinspection GradleDynamicVersion
  api "com.facebook.react:react-native:+"

  /* ----------------------------
   *    REACT NATIVE FIREBASE
   * ---------------------------- */

  // Required dependencies
  //noinspection GradleCompatible
  compileOnly "com.google.firebase:firebase-core:16.0.4"
  compileOnly "com.google.android.gms:play-services-base:16.0.1"

  /* -------------------------
   *   OPTIONAL FIREBASE SDKS
   * ------------------------- */

  // Ads
  compileOnly('com.google.firebase:firebase-ads:15.0.1') {
    // exclude `customtabs` as the support lib version is out of date
    // we manually add it as a dependency below with a custom version
    exclude group: 'com.android.support', module: 'customtabs'
  }
  // Authentication
  compileOnly "com.google.firebase:firebase-auth:16.0.5"
  // Analytics
  compileOnly "com.google.firebase:firebase-analytics:16.0.4"
  // Performance Monitoring
  compileOnly "com.google.firebase:firebase-perf:16.2.0"
  // Remote Config
  compileOnly "com.google.firebase:firebase-config:16.1.0"
  // Cloud Storage
  compileOnly "com.google.firebase:firebase-storage:16.0.4"
  // Invites
  compileOnly "com.google.firebase:firebase-invites:16.0.4"
  // Dynamic Links
  compileOnly "com.google.firebase:firebase-dynamic-links:16.1.2"
  // Real-time Database
  compileOnly "com.google.firebase:firebase-database:16.0.4"
  // Cloud Functions
  compileOnly "com.google.firebase:firebase-functions:16.1.2"
  // Cloud Firestore
  compileOnly "com.google.firebase:firebase-firestore:17.1.2"
  // Cloud Messaging / FCM
  compileOnly "com.google.firebase:firebase-messaging:17.3.4"
  // Crashlytics
  compileOnly('com.crashlytics.sdk.android:crashlytics:2.9.5@aar') {
    transitive = true
  }
  /* --------------------------------
   *  OPTIONAL SUPPORT LIBS
   * -------------------------------- */

  // For Firebase Ads
  compileOnly "com.android.support:customtabs:$supportVersion"

  // For React Native Firebase Notifications
  api "com.android.support:support-v4:$supportVersion"

  // For React Native Firebase Notifications
  compileOnly 'me.leolin:ShortcutBadger:1.1.21@aar'
}

这是 Mainapplication.java 文件:

public List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
        // Add your own packages here!
        // TODO: add native modules!

        // Needed for `react-native link`
        // new MainReactPackage(),
            new RNFirebasePackage(),
            new ReactNativeContacts(),
                    new RNInstabugReactnativePackage.Builder("ID",MainApplication.this)
                            .setInvocationEvent("shake")
                            .setPrimaryColor("#1D82DC")
                            .setFloatingEdge("left")
                            .setFloatingButtonOffsetFromTop(250)
                            .build(),
            new FlurryPackage(),
            new VectorIconsPackage(),
            new RNFirebaseAuthPackage(),
            new RNFirebaseMessagingPackage(),
            new RNFirebaseNotificationsPackage()
    );
  }

标签: androidfirebasereact-nativereact-native-firebase

解决方案


推荐阅读