React-Native: java.lang.UnsatisfiedLinkError: không tìm thấy DSO để tải: libhermes.so


83

Tôi vừa cập nhật dự án của mình để sử dụng phiên bản react -native 0.60.2 . Nhưng khi tôi đang cố gắng chạy một ứng dụng trên thiết bị Android, nó bị treo sau màn hình khởi chạy. Tôi nhận được nhật ký lỗi sau:

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)

Một số đề xuất có sẵn ở đây: https://github.com/facebook/react-native/issues/25601 nhưng tiếc là không có đề xuất nào phù hợp với tôi. Vui lòng đề xuất cách giải quyết.


Từ thay đổi v0.60 / blog : Với thay đổi này, các ứng dụng React Native sẽ cần phải bắt đầu sử dụng chính AndroidX. Chúng không thể được sử dụng song song trong một ứng dụng, vì vậy tất cả mã ứng dụng và mã phụ thuộc cần phải sử dụng mã này hoặc mã khác. Đây có thể là một trường hợp cho bạn?
AsifM

Câu trả lời:


61

Tôi gặp sự cố tương tự sau khi nâng cấp từ 0,59,8 lên 0,60,4

Đảm bảo rằng bạn đã thêm tất cả các dòng này vào app / build.gradle của mình , đặc biệt là phần phụ thuộc vì điều này đảm bảo bạn có mã nhị phân 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
    }

BIÊN TẬP

Ngoài ra, hãy chắc chắn rằng các repo Hermes Maven là trong thư mục gốc của bạn build.gradle

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

11
Điều này không hoạt động đối với tôi sau khi nâng cấp lên 0,60.4. Tôi đã thử làm sạch nhiều lần. Tôi dường như không thể vô hiệu hóa hermes. Tôi có được vụ tai nạn trên đầu "không thể tìm thấy DSO để tải: libhermes.so"
Ed Núi

3
Đảm bảo trong src / android / build.gradle, bạn cũng đã thêm repo maven cho hermes libs (giống như câu trả lời khác đề xuất). Nó có thể liên quan đến JavaScriptCore & không cụ thể là Hermes
Vinzzz

Cảm ơn bạn! Tôi đã thiếu "maven {url (" $ rootDir /../ node_modules / jsc-android / dist ")}
Ed of the Mountain

Cảm tạ !! Hình thức hoạt động của nó là tôi nhưng đừng quên thêm khối này vào project build.gradle maven {// Android JSC được cài đặt từ url npm ("$ rootDir /../ node_modules / jsc-android / dist")}
Vishal Gadhiya

4
Trong react-native 0.61, phần hermesvm trong android / app / build.gradle đã chuyển sang hermes-engine: github.com/facebook/react-native/blob/0.61-stable/template/…
Mike Hardy

23

Tôi đã thêm khối này vào khối allProject trong project_dir / build.gradle và sự cố đã biến mất.

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

Những gì tôi đã làm là tạo một dự án mới với react-native init và duyệt qua các tệp xây dựng android. May mắn thay, đây là điểm khác biệt đầu tiên tôi nhận thấy và đã khắc phục được sự cố của mình. Tôi đoán bạn cũng có thể làm như vậy nếu điều này không hiệu quả.


@msqar giống ở đây
0x01Brain

2
Thêm dòng đó gây ra lỗi sau trong quá trình xây dựng:error: package com.facebook.react.module.annotations does not exist
0x01Brain

1
Xác minh những thay đổi ở đây có thể là một ý tưởng tốt react-native-community.github.io/upgrade-helper
P-RAD

21

Tôi vừa dọn dẹp thư mục xây dựng cho android và sau đó, nó hoạt động tốt. Hy vọng rằng sẽ giúp bạn đời.

cd android
./gradlew clean 

hàng giờ gỡ lỗi và tìm kiếm và nó đã được sửa ...
tibbus

vâng, rất thất vọng khi thấy đó là bản sửa lỗi vô lý này
samernady

Tôi luôn gặp lỗi này khi tạo bản phát hành gói, cần chạy sạch mọi lúc
tibbus

8
  1. mở node_modules / jsc-android / README.md
  2. tìm phần 'Cách sử dụng nó với ứng dụng Native phản ứng của tôi'

ví dụ:

  1. sửa đổi 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. sửa đổi 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
}

Tôi đã thực hiện theo cách trên mà không cần sử dụng packagingOptions và vậy là đủ. Cảm ơn.
oguzhan

Đối với tôi, tôi chỉ cần thêm pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
dazza5000

Nghiên cứu thời gian dài để tìm ra câu trả lời. Cảm ơn vì giải pháp.
R.Mohanraj

7

tôi đã giải quyết điều này bằng cách thêm

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

Chính xác thì bạn đã thêm cái này ở đâu và trong tệp nào?
Andru

1
app/build.gradlebên trong cuốidependencies { } dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } }
dasl

5

Trong trường hợp bạn gặp phải lỗi này khi cập nhật lên phiên bản React Native 0.62.2:

Thêm phần sau vào android/app/build.gradletệp của bạn :

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

là một trong những implementationmục đầu tiên .

Giải pháp lấy từ đây


1
Sau khi triển khai vẫn gặp sự cố này ---> không thể tìm thấy DSO để tải: 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 / nhà cung cấp / 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

Tôi gặp lỗi tương tự, bạn có thể giải quyết vấn đề này không?
Hugo Pretorius

bất kỳ ai trong số các bạn có thể giải quyết điều này? @HugoPretorius
Diego Rivera

4

Đối với những người khác gặp phải vấn đề này, có 2 phần trông giống nhau. Bạn cần cập nhật phần dưới cùng repositoriestrong 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
tôi vừa thêm url ("$ rootDir /../ node_modules / jsc-android / dist") trong dự án gradle. cảm ơn bạn Eliezer Steinbock
Guru

3

Thêm cái này vào lớp dự án của bạn

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

Sau khi làm theo tất cả các lời khuyên mà không thành công, tôi đã tạo một * .apk thay vì * .aab. APK là 16 MB so với 8 MB AAB, nhưng cuối cùng tôi đã loại bỏ Lỗi liên kết không hài lòng.

Để tạo AAB (bị lỗi với UnsatisfiedLinkError):

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

Để tạo APK (không có sự cố và hermes cũng hoạt động tốt):

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

Mặc dù đây không phải là một giải pháp lâu dài, nhưng đó là một giải pháp tạm thời đã khắc phục sự cố cho tôi bây giờ. Cảm ơn!
kentrh

2

Tôi không làm gì hơn. ./gradlew cleanđã giải quyết vấn đề của tôi.


vì bạn đang chính thức đăng câu trả lời cho một câu hỏi cũ hơn. Sẽ hữu ích nhất khi bạn hỗ trợ câu trả lời có chủ đích của mình bằng một số mã và kết quả đầu ra từ việc sử dụng mã của bạn. Bạn có thể hỗ trợ câu trả lời của mình bằng bản sao và dán hoặc thậm chí là bản in màn hình nếu không thể sao chép kết quả từ mã của bạn.
Màu xám

0

Trong trường hợp của tôi, Hermes chưa bao giờ được kích hoạt và tôi đã gặp phải lỗi này. Việc dọn dẹp (thông qua Android Studio) và xây dựng lại đã giải quyết được lỗi.


Việc dọn dẹp qua Android Studio so với thông qua ./gradlew cleancó tạo ra sự khác biệt không?
Andru

0

Cố gắng thay thế đối tượng ndk của bạn bên trong app / build.gradle

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

0

Tôi đã gặp lỗi này khi cố gắng chạy với phiên bản React Native cũ hơn, trước 0,60 trong khi package.jsonphiên bản mới hơn được xác định (bài 0,60).


0

Điều đó xảy ra với tôi sau khi tôi cập nhật studio android của mình, sau đó tôi dọn dẹp và xây dựng lại, nó không bị lỗi nữa.


-1

Trong trường hợp của tôi, chỉ cần bật các enableHermestrên trong app/build.gradle:

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

Nếu bạn bật Hermes, bạn chỉ cần thay đổi tùy chọn bản dựng và nó sẽ thay thế SoLoader thành Hermes và tạo bản dựng thông qua Hermes ... nhưng nó không được sửa
Lukáš Šálek

-1

Nếu bất kỳ ai vẫn gặp sự cố ngay cả khi đã áp dụng thử tất cả các bước ở trên thì đây là giải pháp

Trong MainApplication.java, thêm nhập này:

import com.facebook.react.BuildConfig;

Cảnh báo! Không thêm nhập đó trong trường hợp bạn đang sử dụng quy trình làm việc trống của Expo. Nó sẽ làm xáo trộn BuildConfig.DEBUGgiá trị và làm cho các bản dựng gỡ lỗi của bạn không hoạt động nữa.
Andru

-2

Giải quyết vấn đề này một cách đơn giản.

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
Tôi nghĩ nó quá đơn giản !!
Hani

@Chaurasia bạn đã làm gì để giải quyết vấn đề này? những dòng đã giải quyết điều này là gì?
Kruupös

@ Kruupös Tôi chỉ hiển thị hướng dẫn tệp của mình. tệp này đang hoạt động một cách tốt. người dùng có thể đối sánh các tệp riêng với tệp của tôi không? Quá dễ.
Chaurasia

1
@Chaurasia không thực sự, tôi có một số cấu hình cụ thể không phù hợp với yêu cầu của bạn. Câu trả lời thực sự sẽ là hiểu dòng chính xác nào đang gây ra hoặc giải quyết vấn đề. Tôi thậm chí không biết phiên bản React của bạn, vì vậy không đơn giản như vậy.
Kruupös
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.