React-Native: java.lang.UnsatisfiedLinkError: nie można znaleźć DSO do załadowania: libhermes.so

86

Właśnie zaktualizowałem mój projekt, aby używał natywnej wersji 0.60.2 . Ale kiedy próbuję uruchomić aplikację na urządzeniu z Androidem, ulega awarii po ekranie uruchamiania. Mam następujące dzienniki błędów:

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)

Kilka propozycji dostępnych tutaj: https://github.com/facebook/react-native/issues/25601, ale niestety żadna z nich nie zadziałała. Zaproponuj obejście.

V-Xtreme
źródło
Od wersji 0.60 dziennik zmian / blog : Dzięki tej zmianie aplikacje React Native będą musiały same zacząć używać AndroidX. Nie można ich używać obok siebie w jednej aplikacji, więc cały kod aplikacji i kod zależności musi używać jednego lub drugiego. To może być dla Ciebie sprawa?
AsifM

Odpowiedzi:

62

Miałem ten sam problem po aktualizacji z 0.59.8 do 0.60.4

Upewnij się, że dodałeś wszystkie te linie w pliku app / build.gradle , zwłaszcza część dotyczącą zależności, ponieważ zapewnia to, że masz plik binarny JSC

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
    }

EDYTOWAĆ

Upewnij się również, że repozytorium Hermes Maven znajduje się w katalogu głównym build.gradle

maven {
        // Android JSC is installed from npm
        url("$rootDir/../node_modules/jsc-android/dist")
    }
Vinzzz
źródło
13
To nie zadziałało po uaktualnieniu do wersji 0.60.4. Wielokrotnie próbowałem czyścić. Nie mogę wyłączyć hermesa. Następuje awaria przy starcie „nie mogę znaleźć DSO do załadowania: libhermes.so”
Ed of the Mountain
3
Upewnij się, że w src / android / build.gradle dodałeś także repozytorium maven dla hermes libs (tak jak proponuje inna odpowiedź). Może to być związane z JavaScriptCore, a nie konkretnie z Hermesem
Vinzzz
Dziękuję Ci! Brakowało mi „maven {url (" $ rootDir /../ node_modules / jsc-android / dist ")}
Ed of the Mountain,
Dziękuję !! U mnie działa, ale nie zapomnij dodać tego bloku do projektu build.gradle maven {// Android JSC jest instalowany z adresu URL npm ("$ rootDir /../ node_modules / jsc-android / dist")}
Vishal Gadhiya
4
W respons-native 0.61 część hermesvm w android / app / build.gradle została przeniesiona do hermes-engine: github.com/facebook/react-native/blob/0.61-stable/template/ ...
Mike Hardy
25

Dodałem ten blok do bloku allProject w project_dir / build.gradle i awaria zniknęła.

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

To, co zrobiłem, to utworzenie nowego projektu za pomocą narzędzia react-native init i przejrzenie plików kompilacji Androida. Na szczęście ta była pierwszą różnicą, jaką zauważyłem i naprawiłem mój problem. Myślę, że możesz zrobić to samo, jeśli to nie zadziała.

skang
źródło
@msqar to samo tutaj
0x01Brain
2
Dodanie tej linii spowodowało następujący błąd podczas kompilacji:error: package com.facebook.react.module.annotations does not exist
0x01Brain
1
Weryfikacja zmian w tym miejscu może być dobrym pomysłem respons-native-community.github.io/upgrade-helper
P-RAD
25

Właśnie wyczyściłem folder kompilacji dla Androida i po tym wszystko działało dobrze. Mam nadzieję, że to pomoże kojarzyć się.

cd android
./gradlew clean 
samernady
źródło
godzin debugowania i przeszukiwania i został naprawiony przez czysty ...
tibbus
2
tak, to było bardzo rozczarowujące, gdy okazało się, że to absurdalna poprawka
samernady,
Zawsze mam ten błąd, kiedy tworzę wydanie pakietu, za każdym razem muszę działać czysto
tibbus
Myślę, że ten problem zaczął się, kiedy zaktualizowałem wersję nodejs. W każdym razie to rozwiązało mój problem!
King Julien
9
  1. otwórz node_modules / jsc-android / README.md
  2. znajdź sekcję 'Jak używać tego z moją aplikacją React Native'

na przykład:

  1. zmodyfikuj 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. zmodyfikuj 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
}
Starryi
źródło
wykonałem powyżej sposób bez użycia opcji PackagingOptions i to wystarczy. Dzięki.
oguzhan
Dla mnie wystarczyło dodać pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
dazza5000
Długie badania, aby znaleźć odpowiedź. Dzięki za rozwiązanie.
R.Mohanraj
8

Jeśli napotkasz ten błąd podczas aktualizacji do wersji React Native 0.62.2 :

Dodaj do swojego android/app/build.gradlepliku:

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

jako jeden z pierwszych implementation wpisów.

Rozwiązanie pobrane stąd

Andru
źródło
1
Po wdrożeniu nadal występuje ten problem ---> nie można znaleźć DSO do załadowania: 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] Natywny katalog lib: /data/app/com.tootitoo.tootitoo-1/lib/arm wynik : 0
Kyo Kurosagi,
7

rozwiązałem to, dodając

 configurations.all {
    resolutionStrategy {
        force "com.facebook.soloader:soloader:0.8.2"
    }
}
dasl
źródło
Gdzie dokładnie to dodałeś iw którym pliku?
Andru,
1
app/build.gradlewewnątrz końcadependencies { } dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } }
dasl
4

Dla innych, którzy napotkali ten problem, istnieją 2 sekcje, które wyglądają podobnie. Musisz zaktualizować dolną repositoriessekcję w 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
źródło
1
właśnie dodałem url ("$ rootDir /../ node_modules / jsc-android / dist") w gradle projektu. dziękuję Eliezer Steinbock
Guru
3

Dodaj to do oceny na poziomie projektu

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
źródło
3

Nic więcej nie zrobiłem. ./gradlew cleanrozwiązał mój problem.

Jack Au
źródło
od tego momentu formalnie zamieszczasz odpowiedź na starsze pytanie. Byłoby bardzo pomocne, gdybyś poparł swoją rzekomą odpowiedź jakimś kodem i wynikami wynikającymi z użycia twojego kodu. Możesz poprzeć swoją odpowiedź kopiowaniem i wklejaniem lub nawet wydrukiem ekranu, jeśli wynik z twojego kodu nie może zostać skopiowany.
Gray
2

Po wykonaniu wszystkich porad bez powodzenia, zbudowałem * .apk zamiast * .aab. Pakiet APK ma 16 MB w przeciwieństwie do 8 MB AAB, ale w końcu pozbyłem się UnsatisfiedLinkError.

Aby zbudować AAB (awaria z UnsatisfiedLinkError):

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

Aby zbudować APK (bez awarii i hermetyków też działa dobrze):

cd android && ./gradlew clean && ./gradlew assembleRelease
Henrik
źródło
Chociaż nie jest to trwałe rozwiązanie, jest to tymczasowe obejście, które na razie rozwiązało problem. Dzięki!
kentrh
0

W moim przypadku Hermes nigdy nie był włączony, a mimo to napotkałem ten błąd. Czyszczenie (przez Android Studio) i odbudowanie rozwiązało problem.

Isaac Overacker
źródło
Czy czyszczenie przez Android Studio w porównaniu z via ./gradlew cleanma znaczenie?
Andru,
0

Spróbuj zamienić obiekt ndk w app / build.gradle

defaultConfig {
...
    ndk {
        abiFilters "armeabi-v7a", "x86"
    }
}
user3571779
źródło
0

Wystąpił ten błąd, gdy próbowałem uruchomić ze starszą wersją React Native, przed 0.60, podczas gdy package.jsonmiałem zdefiniowaną nowszą wersję (post 0.60).

Sir Codesalot
źródło
0

Zdarza mi się, że po zaktualizowaniu mojego studia Android, a następnie wyczyszczę i zbuduję ponownie, już się nie zawiesza.

Rozmach
źródło
0

Dzieje się tak, ponieważ SOLoader jest nieobecny.

Zapewnić

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

jest dodawany w zależnościach w android / app / build.gradlle

wyczyść swoją kompilację

cd android

./gradlew clean

Spróbuj połączyć ./gradlew bundleRelease

Zamknij folder Androida cd ../

Spróbuj biegać npx react-native run-android --variant=release

michael_vons
źródło
-1

W moim przypadku wystarczy włączyć enableHermesw app/build.gradle:

project.ext.react = [
    entryFile   : "index.js",
    enableHermes: true,  // HERE!
]
Wolny
źródło
Jeśli włączysz Hermesa, po prostu zmienisz opcje kompilacji, a SoLoader zastąpi Hermesa i utworzy kompilację przez Hermesa ... ale to nie jest naprawione
Lukáš Šálek
-2

Rozwiąż ten problem w prosty sposób.

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
źródło
4
Myślę, że to zbyt proste !!
Hani
@Chaurasia, co zrobiłeś, aby rozwiązać ten problem? jakie linie rozwiązały ten problem?
Kruupös
@ Kruupös Wyświetlam tylko instrukcję pliku. ten plik działa dobrze. czy użytkownik może dopasować własne pliki do mojego pliku? tak prosty.
Chaurasia
1
@Chaurasia niezupełnie, mam określoną konfigurację, która nie pasowałaby do twoich wymagań. Prawdziwą odpowiedzią byłoby zrozumienie, która precyzyjna linia powoduje lub rozwiązuje problem. Nie znam nawet twojej wersji Reacta, więc nie jest to takie proste.
Kruupös
-2

Jeśli ktoś nadal boryka się z problemem, nawet po wykonaniu wszystkich powyższych kroków, oto rozwiązanie

W pliku MainApplication.java dodaj ten import:

import com.facebook.react.BuildConfig;
Moaz Khan
źródło
Ostrzeżenie! Nie dodawaj tego importu, jeśli używasz samego przepływu pracy Expo. Spowoduje to zepsucie BuildConfig.DEBUGwartości i sprawi, że kompilacje debugowania przestaną działać.
Andru
BuildConfig to plik generowany automatycznie dla twojego projektu, nie powinieneś importować tego z Facebooka.
Bruno Lemos