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.