React-Native : java.lang.UnsatisfiedLinkError :로드 할 DSO를 찾을 수 없음 : libhermes.so


83

React -native 버전 0.60.2 를 사용하도록 프로젝트를 업데이트 했습니다 . 그러나 Android 장치에서 응용 프로그램을 실행하려고 할 때 시작 화면 후에 충돌이 발생합니다. 다음과 같은 오류 로그가 있습니다.

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)

여기에 몇 가지 제안이 있습니다 : https://github.com/facebook/react-native/issues/25601 그러나 불행히도 그들 중 누구도 나를 위해 일하지 않았습니다. 해결 방법을 제안하십시오.


에서 v0.60 변경 로그 / 블로그 :이 변경으로 기본 응용 프로그램이 AndroidX 스스로 사용을 시작해야합니다 반응한다. 한 앱에서 나란히 사용할 수 없으므로 모든 앱 코드와 종속성 코드는 둘 중 하나를 사용해야합니다. 이것이 당신을위한 경우일까요?
— AsifM

답변:


61

0.59.8에서 0.60.4로 업그레이드 한 후에도 동일한 문제가 발생했습니다.

app / build.gradle에이 모든 줄을 추가했는지 확인하세요 . 특히 종속성 부분은 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
    }

편집하다

또한 Hermes Maven 저장소가 루트 빌드 에 있는지 확인하십시오.

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

11
0.60.4로 업그레이드 한 후에는 작동하지 않았습니다. 여러 번 청소를 시도했습니다. 헤르메스를 무력화시킬 수없는 것 같습니다. 나는 "부하에 DSO를 찾을 수 없습니다 : libhermes.so을"시작에 충돌을 얻을
— 산의 에드

3
src / android / build.gradle에서 hermes libs에 대한 maven repo도 추가했는지 확인하십시오 (다른 답변이 제안한 것처럼). Hermes가 아닌 JavaScriptCore와 관련이있을 수 있습니다.
— Vinzzz

감사합니다! 내가 실종됐다 "{($ ROOTDIR /../ node_modules / JSC-안드로이드 / DIST") 받는다는 URL "}
— 에드 산의

감사합니다 !! 작동 형식이 나지만 프로젝트 build.gradle maven {// Android JSC가 npm url ( "$ rootDir /../ node_modules / jsc-android / dist")에서
— 설치됨

4
에서 반응 네이티브 0.61 hermesvm 부분을 안드로이드에서 / 응용 프로그램 / build.gradle로 이동 한 헤르메스 - 엔진 : github.com/facebook/react-native/blob/0.61-stable/template/...
— 마이크 하디

23

이 블록을 project_dir / build.gradle의 allProject 블록에 추가했는데 충돌이 사라졌습니다.

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

내가 한 일은 react-native init로 새 프로젝트를 만들고 Android 빌드 파일을 살펴 보는 것입니다. 다행히도 이것은 내가 발견하고 문제를 해결 한 첫 번째 차이점이었습니다. 이것이 작동하지 않으면 똑같이 할 수 있다고 생각합니다.


여기에 같은 @msqar
— 0x01Brain

2
이 줄을 추가하면 빌드 중에 다음 오류가 발생했습니다.error: package com.facebook.react.module.annotations does not exist
— 0x01Brain

1
여기서 변경 사항을 확인하는 것이 좋은 생각 일 수 있습니다. react-native-community.github.io/upgrade-helper
— P-RAD

21

방금 Android 용 빌드 폴더를 정리 한 후 정상적으로 작동했습니다. 짝짓기를 돕는 희망.

cd android
./gradlew clean 

몇 시간의 디버깅 및 검색 결과 깨끗한 문제로 해결되었습니다 ...
— tibbus

네,이 어리석은 수정 이었다는 사실이 매우 실망 스러웠습니다
— samernady

번들 릴리스를 만들 때 항상이 오류가 발생합니다. 매번 깨끗하게 실행해야합니다
— tibbus

8
  1. node_modules / jsc-android / README.md를 엽니 다.
  2. '내 반응 네이티브 앱과 함께 사용하는 방법'섹션을 찾습니다.

예를 들면 :

  1. 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. 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
}

나는 packagingOptions를 사용하지 않고 위의 방법으로 수행했으며 충분합니다. 감사.
— oguzhan

저에게는 추가 만 필요했습니다 pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
— dazza5000

답을 찾기 위해 오랜 시간 연구하십시오. 솔루션에 감사드립니다.
— R.Mohanraj

7

나는 이것을 추가하여 해결했습니다.

 configurations.all {
    resolutionStrategy {
        force "com.facebook.soloader:soloader:0.8.2"
    }
}

정확히 어디에 어떤 파일을 추가 했습니까?
— Andru

1
app/build.gradle내부 끝dependencies { } dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } }
— dasl

5

React Native 버전으로 업데이트하는 동안이 오류가 발생하는 경우 0.62.2:

android/app/build.gradle파일에 다음을 추가 하십시오.

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

첫 번째 implementation항목 중 하나로 .

여기에서 가져온 솔루션


1
구현 후에도 여전히이 문제가 있습니다 --->로드 할 DSO를 찾을 수 없음 : 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 결과 : 0
— Kyo Kurosagi

동일한 오류가 발생합니다.이 문제를 해결할 수 있습니까?
— Hugo Pretorius

이 문제를 해결할 수있는 사람이 있습니까? @HugoPretorius
— Diego Rivera

4

이 문제가 발생하는 다른 경우에는 비슷해 보이는 섹션이 2 개 있습니다. ! 에서 하단 repositories섹션 을 업데이트해야합니다 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()
    }
}

1
방금 프로젝트 gradle에 url ( "$ rootDir /../ node_modules / jsc-android / dist")을 추가했습니다. 감사합니다 Eliezer Steinbock
— Guru

3

프로젝트 수준 gradle에 이것을 추가하십시오.

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()
    }
}

2

성공하지 않고 모든 조언을 따른 후 * .aab 대신 * .apk를 만들었습니다. APK는 8MB AAB와 달리 16MB이지만 마침내 UnsatisfiedLinkError를 제거했습니다.

AAB를 빌드하려면 (UnsatisfiedLinkError로 인해 충돌이 발생 함) :

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

APK를 빌드하려면 (크래시 없음 및 hermes도 잘 작동 함) :

cd android && ./gradlew clean && ./gradlew assembleRelease

이것은 영구적 인 해결책은 아니지만, 당분간 문제를 해결 한 임시 해결 방법입니다. 감사!
— kentrh

2

나는 더 이상 아무것도하지 않았다. ./gradlew clean내 문제를 해결했습니다.


이전 질문에 대한 답변을 공식적으로 게시하고 있습니다. 일부 코드와 코드 사용으로 인한 결과로 의도 된 답변을 지원하는 것이 가장 도움이 될 것입니다. 코드의 결과를 복사 할 수없는 경우 복사 및 붙여 넣기 또는 화면 인쇄로 답변을 뒷받침 할 수 있습니다.
— 회색

0

제 경우에는 Hermes가 활성화되지 않았지만이 오류가 발생했습니다. 청소 (Android Studio를 통해)하고 다시 빌드하면 오류가 해결되었습니다.


Android Studio를 통한 청소와 via를 통한 청소 ./gradlew clean가 차이가 있습니까?
— Andru

0

app / build.gradle 내에서 ndk 객체를 바꾸십시오.

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

0

package.json에서 새로운 버전이 정의 된 동안 (0.60 이후) 0.60 이전의 이전 버전의 React Native로 실행하려고 할 때이 오류가 발생했습니다 .


0

Android 스튜디오를 업데이트 한 후 다시 청소하고 다시 빌드하면 더 이상 충돌하지 않습니다.


-1

제 경우에는 그냥 차례 enableHermes에에 app/build.gradle:

project.ext.react = [
    entryFile   : "index.js",
    enableHermes: true,  // HERE!
]

Hermes를 켜면 빌드 옵션 만 변경하면 SoLoader가 Hermes로 대체되고 Hermes를 통해 빌드됩니다 ...하지만 수정되지 않았습니다
— Lukáš Šálek

-1

위의 모든 단계를 시도한 후에도 여전히 문제가 발생하면 여기에 해결책이 있습니다.

MainApplication.java에서 다음 가져 오기를 추가하십시오.

import com.facebook.react.BuildConfig;

경고! Expo 베어 워크 플로우를 사용하는 경우 가져 오기를 추가하지 마십시오. BuildConfig.DEBUG값 을 엉망으로 만들고 디버그 빌드가 더 이상 작동하지 않게 만듭니다.
— Andru

-2

이 문제를 간단한 방법으로 해결하십시오.

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'

4
너무 간단하다고 생각합니다 !!
— Hani

@Chaurasia이 문제를 해결하기 위해 무엇을 했습니까? 이 문제를 해결 한 라인은 무엇입니까?
— Kruupös

@ Kruupös 내 파일 지침 만 표시하고 있습니다. 이 파일은 좋은 방식으로 작동합니다. 사용자가 자신의 파일을 내 파일과 일치시킬 수 있습니까? 너무 간단합니다.
— Chaurasia

1
@Chaurasia 실제로는 귀하의 요구 사항과 일치하지 않는 특정 구성이 있습니다. 진짜 대답은 정확한 라인이 문제를 일으키거나 해결하는 것을 이해하는 것입니다. 나는 당신의 React 버전도 모르기 때문에 그렇게 간단하지 않습니다.
— Kruupös
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.