React-Native: java.lang.UnsatisfiedLinkError: DSO zum Laden konnte nicht gefunden werden: libhermes.so

83

Ich habe gerade mein Projekt aktualisiert, um die reaktionsnative Version 0.60.2 zu verwenden . Wenn ich jedoch versuche, eine Anwendung auf einem Android-Gerät auszuführen, stürzt sie nach dem Startbildschirm ab. Ich habe die folgenden Fehlerprotokolle erhalten:

E/AndroidRuntime: FATAL EXCEPTION: create_react_context
    Process: com.tjspeed, PID: 3909
    java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so
        at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:738)
        at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:591)
        at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:529)
        at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:484)
        at com.facebook.hermes.reactexecutor.HermesExecutor.<clinit>(HermesExecutor.java:20)
        at com.facebook.hermes.reactexecutor.HermesExecutorFactory.create(HermesExecutorFactory.java:27)
        at com.facebook.react.ReactInstanceManager$5.run(ReactInstanceManager.java:949)
        at java.lang.Thread.run(Thread.java:760)

Einige Vorschläge sind hier verfügbar: https://github.com/facebook/react-native/issues/25601, aber leider hat keiner von ihnen für mich funktioniert. Bitte schlagen Sie die Problemumgehung vor.

V-Xtreme
quelle
Ab v0.60 Changelog / Blog : Mit dieser Änderung müssen React Native-Apps AndroidX selbst verwenden. Sie können nicht nebeneinander in einer App verwendet werden, daher muss der gesamte App-Code und der Abhängigkeitscode den einen oder anderen verwenden. Dies könnte ein Fall für Sie sein?
AsifM

Antworten:

61

Ich hatte das gleiche Problem nach dem Upgrade von 0,59,8 auf 0,60,4

Stellen Sie sicher, dass Sie alle diese Zeilen in Ihrer app / build.gradle hinzugefügt haben , insbesondere den Abhängigkeitsteil, da dies sicherstellt, dass Sie über JSC-Binärdateien verfügen

project.ext.react = [

...
    // your index js if not default, other settings
  // Hermes JSC ?
 enableHermes: false,

...
]

def jscFlavor = 'org.webkit:android-jsc:+'

def enableHermes = project.ext.react.get("enableHermes", false);

dependencies {

    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "com.facebook.react:react-native:+"  // From node_modules

    if (enableHermes) {
      // For RN 0.60.x
      def hermesPath = "../../node_modules/hermesvm/android/"

      // --- OR ----          

      // for RN 0.61+
      def hermesPath = "../../node_modules/hermes-engine/android/";


      debugImplementation files(hermesPath + "hermes-debug.aar")
      releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
      implementation jscFlavor
    }

BEARBEITEN

Stellen Sie außerdem sicher, dass sich das Hermes Maven-Repo in Ihrem root build.gradle befindet

maven {
        // Android JSC is installed from npm
        url("$rootDir/../node_modules/jsc-android/dist")
    }
Vinzzz
quelle
11
Dies funktionierte bei mir nach dem Upgrade auf 0.60.4 nicht. Ich habe es mehrmals sauber gemacht. Ich kann Hermes nicht deaktivieren. Ich bekomme einen Absturz beim Start "DSO konnte nicht zum Laden gefunden werden: libhermes.so"
Ed of the Mountain
3
Stellen Sie sicher, dass Sie in src / android / build.gradle auch das Maven-Repo für Hermes Libs hinzugefügt haben (wie in der anderen Antwort vorgeschlagen). Es könnte mit JavaScriptCore & nicht speziell Hermes verwandt sein
Vinzzz
Vielen Dank! Mir fehlte "maven {url (" $ rootDir /../ node_modules / jsc-android / dist ")}
Ed of the Mountain
Danke !! Es funktioniert von mir, aber vergessen Sie nicht, diesen Block im Projekt build.gradle maven hinzuzufügen. {// Android JSC wird von der npm-URL ("$ rootDir /../ node_modules / jsc-android / dist")}
Vishal Gadhiya installiert
4
In React-Native 0.61 wurde der Hermesvm-Teil in android / app / build.gradle auf Hermes-Engine verschoben: github.com/facebook/react-native/blob/0.61-stable/template/…
Mike Hardy
23

Ich habe diesen Block im allProject-Block in project_dir / build.gradle hinzugefügt und der Absturz ist verschwunden.

    maven {
        // Android JSC is installed from npm
        url("$rootDir/../node_modules/jsc-android/dist")
    }

Was ich getan habe, ist, ein neues Projekt mit reaktionsnativen Init zu erstellen und die Android-Build-Dateien durchzugehen. Glücklicherweise war dies der erste Unterschied, den ich bemerkte und mein Problem behebte. Ich denke, Sie könnten das Gleiche tun, wenn dies nicht funktioniert.

Skang
quelle
@msqar gleiche hier
0x01Brain
2
Das Hinzufügen dieser Zeile verursachte den folgenden Fehler während des error: package com.facebook.react.module.annotations does not exist
Builds
1
Das Überprüfen der Änderungen hier könnte eine gute Idee sein. React-native-community.github.io/upgrade-helper
P-RAD
21

Ich habe gerade den Build-Ordner für Android bereinigt und danach hat es gut funktioniert. Hoffe das hilft sich zu paaren.

cd android
./gradlew clean 
Samernady
quelle
Stunden des Debuggens und Durchsuchens und es wurde durch einen sauberen ...
tibbus
Ja, es war sehr enttäuschend zu sehen, dass es diese absurde Lösung war
Samernady
Ich habe immer diesen Fehler, wenn ich eine Bundle-Version erstelle, die jedes Mal sauber laufen muss
tibbus
8
  1. öffne node_modules / jsc-android / README.md
  2. Finden Sie den Abschnitt 'Wie verwende ich es mit meiner React Native App?'

zum Beispiel:

  1. Ändern Sie android / build.gradle
allprojects {
    repositories {
        maven {
            // All of React Native (JS, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
        maven {
            // Local Maven repo containing AARs with JSC library built for Android
            url "$rootDir/../node_modules/jsc-android/dist"
        }
        google()
        jcenter()

    }
}
  1. Ändern Sie Android / App / Build.gradle
android {
    packagingOptions {
        pickFirst '**/libjsc.so'
        pickFirst '**/libc++_shared.so'
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation "org.webkit:android-jsc:+"
    implementation "com.facebook.react:react-native:+" // From node_modules
}
Kun Guan
quelle
Ich habe oben ohne VerpackungOptions durchgeführt und das ist genug. Vielen Dank.
Oguzhan
Für mich musste ich nur hinzufügen pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
dazza5000
Langjährige Recherche, um die Antwort zu finden. Danke für die Lösung.
R. Mohanraj
7

Ich habe dies durch Hinzufügen gelöst

 configurations.all {
    resolutionStrategy {
        force "com.facebook.soloader:soloader:0.8.2"
    }
}
dasl
quelle
Wo genau haben Sie das hinzugefügt und in welcher Datei?
Andru
1
app/build.gradleInnen Ende vondependencies { } dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } }
dasl
5

Falls Sie beim Aktualisieren auf die React Native-Version auf diesen Fehler stoßen 0.62.2:

Fügen Sie Ihrer android/app/build.gradleDatei Folgendes hinzu :

dependencies {
   implementation 'com.facebook.soloader:soloader:0.9.0+'

als einer der ersten implementationEinträge.

Lösung von hier genommen

Andru
quelle
1
Nach der Implementierung ist dieses Problem immer noch aufgetreten ---> DSO konnte nicht geladen werden: libhermes.so SoSource 0: com.facebook.soloader.ApkSoSource [root = /data/data/com.tootitoo.tootitoo/lib-main flags = 1] SoSource 1: com.facebook.soloader.DirectorySoSource [root = /data/app/com.tootitoo.tootitoo-1/lib/arm flags = 0] SoSource 2: com.facebook.soloader.DirectorySoSource [root = / system / vendor / lib flags = 2] SoSource 3: com.facebook.soloader.DirectorySoSource [root = / system / lib flags = 2] Native lib dir: /data/app/com.tootitoo.tootitoo-1/lib/arm result : 0
Kyo Kurosagi
Ich erhalte den gleichen Fehler. Können Sie das beheben?
Hugo Pretorius
Könnte jemand von euch das lösen? @ HugoPretorius
Diego Rivera
4

Für andere, die auf dieses Problem stoßen, gibt es zwei Abschnitte, die ähnlich aussehen. Sie müssen den unteren repositoriesBereich in aktualisieren android/build.gradle!

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

buildscript {
    ext {
        buildToolsVersion = "28.0.3"
        minSdkVersion = 16
        compileSdkVersion = 28
        targetSdkVersion = 28
        supportLibVersion = "28.0.0"
    }
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:3.4.1")

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

allprojects {
    repositories {
        mavenLocal()
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url("$rootDir/../node_modules/react-native/android")
        }
        maven {
            // Android JSC is installed from npm
            url("$rootDir/../node_modules/jsc-android/dist")
        }

        google()
        jcenter()
    }
}
Eliezer Steinbock
quelle
1
Ich habe gerade URL ("$ rootDir /../ node_modules / jsc-android / dist") in Projekt Gradle hinzugefügt. danke Eliezer Steinbock
Guru
3

Fügen Sie dies in Ihren Gradle auf Projektebene ein

allprojects {
    repositories {
        maven {
            url "$rootDir/../node_modules/react-native/android"
        }
        maven {
            // Android JSC is installed from npm
            url("$rootDir/../node_modules/jsc-android/dist")
        }
        mavenLocal()
        google()
        jcenter()
    }
}
Kishan Verma
quelle
2

Nachdem ich alle Ratschläge ohne Erfolg befolgt hatte, baute ich eine * .apk anstelle einer * .aab. Die APK ist 16 MB im Gegensatz zur 8 MB AAB, aber ich habe endlich den UnsatisfiedLinkError losgeworden.

So erstellen Sie ein AAB (abgestürzt mit UnsatisfiedLinkError):

cd android && ./gradlew clean && ./gradlew bundleRelease

So erstellen Sie eine APK (kein Absturz und Hermes funktionieren auch gut):

cd android && ./gradlew clean && ./gradlew assembleRelease
Henrik
quelle
Obwohl dies keine dauerhafte Lösung ist, ist es eine vorübergehende Umgehung, die das Problem für mich vorerst behoben hat. Vielen Dank!
8.
2

Ich habe nichts mehr getan. ./gradlew cleanlöste mein Problem.

Jack Au
quelle
Sobald Sie offiziell eine Antwort auf eine ältere Frage veröffentlichen. Es wäre sehr hilfreich, wenn Sie Ihre angebliche Antwort mit etwas Code und der Ausgabe unterstützen würden, die sich aus der Verwendung Ihres Codes ergibt. Sie können Ihre Antwort durch Kopieren und Einfügen oder sogar durch einen Siebdruck unterstützen, wenn das Ergebnis Ihres Codes nicht kopiert werden kann.
Grauer
0

In meinem Fall wurde Hermes nie aktiviert und dennoch trat dieser Fehler auf. Durch Bereinigen (über Android Studio) und Wiederherstellen wurde der Fehler behoben.

Isaac Overacker
quelle
Macht die Reinigung über Android Studio oder über Via ./gradlew cleaneinen Unterschied?
Andru
0

Versuchen Sie, Ihr ndk-Objekt in app / build.gradle zu ersetzen

defaultConfig {
...
    ndk {
        abiFilters "armeabi-v7a", "x86"
    }
}
user3571779
quelle
0

Ich hatte diesen Fehler, als ich versuchte, mit einer älteren Version von React Native vor 0.60 zu laufen, während in der package.jsoneine neuere Version definiert war (nach 0.60).

Sir Codesalot
quelle
0

Es passiert mir, nachdem ich mein Android Studio aktualisiert habe, dann bereinige und baue ich es erneut, es stürzt nicht mehr ab.

Elan
quelle
-1

In meinem Fall, schalten Sie einfach die enableHermesauf in app/build.gradle:

project.ext.react = [
    entryFile   : "index.js",
    enableHermes: true,  // HERE!
]
lfree
quelle
Wenn Sie Hermes einschalten, ändern Sie einfach die Build-Optionen und es wird SoLoader durch Hermes ersetzen und Build über Hermes erstellen ... aber es ist nicht behoben
Lukáš Šálek
-1

Wenn jemand auch nach dem Anwenden aller oben genannten Schritte immer noch mit dem Problem konfrontiert ist, finden Sie hier die Lösung

Fügen Sie in der Datei MainApplication.java diesen Import hinzu:

import com.facebook.react.BuildConfig;
Moaz Khan
quelle
Warnung! Fügen Sie diesen Import nicht hinzu, wenn Sie den Expo Bare Workflow verwenden. Dies wird den BuildConfig.DEBUGWert durcheinander bringen und dazu führen, dass Ihre Debug-Builds nicht mehr funktionieren.
Andru
-2

Lösen Sie dieses Problem auf einfache Weise.

apply plugin: "com.android.application"
// def useIntlJsc = false

import com.android.build.OutputFile
project.ext.react = [
    entryFile: "index.js",
    bundleInStaging: true,       // Add this
    bundleInInternalTest: true,  // Add this
    bundleInRelease: true
]

apply from: "../../node_modules/react-native/react.gradle"

def enableSeparateBuildPerCPUArchitecture = false

def enableProguardInReleaseBuilds = false

def jscFlavor = 'org.webkit:android-jsc:+'

def enableHermes = project.ext.react.get("enableHermes", false);

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        applicationId "com.inbox.clean.free.gmail.unsubscribe.smart.email.fresh.mailbox"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 2597205 //4242929
        versionName "1.6.3"
        multiDexEnabled true
        ndk {
            //  abiFilters "armeabi-v7a", "x86"
                //   abiFilters.clear()

        }

    }

    signingConfigs {
        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 {

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



    project.ext.sentryCli = [
        logLevel: "debug",
        flavorAware: false,
        //add
         enableHermes: false
    ]




    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }


    splits {
        abi {
            reset()
            enable true
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a","arm64-v8a","x86","x86_64"
            //"armeabi-v7a" "arm64-v8a" "x86" "x86_64"
            // include "armeabi-v7a", "x86"
            exclude "ldpi", "xxhdpi", "xxxhdpi"
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // For each separate APK per architecture, set a unique version code as described here:
            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
            def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a":3,"x86_64":4]
            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 {
    implementation project(':react-native-linear-gradient')
    implementation fileTree(dir: "libs", include: ["*.jar"])

    if (enableHermes) {
      def hermesPath = "../../node_modules/hermesvm/android/";
      debugImplementation files(hermesPath + "hermes-debug.aar")
      releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
      implementation jscFlavor
    }

}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}

apply plugin: 'com.google.gms.google-services'
Chaurasia
quelle
4
Es ist zu einfach, denke ich !!
Hani
@Chaurasia Was hast du getan, um dieses Problem zu lösen? Was sind die Zeilen, die dies gelöst haben?
Kruupös
@ Kruupös Ich zeige nur meine Datei Anweisung. Diese Datei funktioniert gut. Kann der Benutzer eigene Dateien mit meiner Datei abgleichen? so einfach.
Chaurasia
1
@Chaurasia nicht wirklich, ich habe eine bestimmte Konfiguration, die nicht Ihren Anforderungen entspricht. Eine echte Antwort wäre zu verstehen, welche genaue Linie das Problem verursacht oder löst. Ich kenne Ihre React-Version nicht einmal, also nicht so einfach.
Kruupös