React-Native: java.lang.UnsatisfiedLinkError: не удалось найти DSO для загрузки: libhermes.so

86

Я только что обновил свой проект, чтобы использовать версию 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, но, к сожалению, ни одно из них не помогло мне. Предложите обходной путь.

V-Xtreme
источник
Из журнала изменений v0.60 / блог : С этим изменением приложениям React Native нужно будет начать использовать AndroidX самостоятельно. Их нельзя использовать бок о бок в одном приложении, поэтому весь код приложения и код зависимостей должен использовать одно или другое. Это может быть случай для вас?
AsifM
связанный stackoverflow.com/questions/60054822/…
0xcaff

Ответы:

62

У меня была такая же проблема после обновления с 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 находится в вашем корневом build.gradle.

maven {
        // Android JSC is installed from npm
        url("$rootDir/../node_modules/jsc-android/dist")
    }
Vinzzz
источник
13
У меня это не сработало после обновления до 0.60.4. Я пробовал очистить несколько раз. Кажется, я не могу отключить Гермеса. Я получаю сбой при запуске «не удалось найти DSO для загрузки: libhermes.so»
Эд Горы,
3
Убедитесь, что в src / android / build.gradle вы также добавили репозиторий maven для библиотек hermes (как и в другом ответе). Это может быть связано с JavaScriptCore, а не конкретно с Hermes,
Винззз
Спасибо! Мне не хватало "maven {url (" $ rootDir /../ node_modules / jsc-android / dist ")}
Эд Горы
Спасибо !! Он работает у меня, но не забудьте добавить этот блок в проект build.gradle maven {// Android JSC устанавливается с npm url ("$ rootDir /../ node_modules / jsc-android / dist")}
Vishal Gadhiya
4
В react-native 0.61 часть hermesvm в android / app / build.gradle перемещена в hermes-engine: github.com/facebook/react-native/blob/0.61-stable/template/…
Майк Харди,
25

Я добавил этот блок в блок allProject в project_dir / build.gradle, и сбой исчез.

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

Я создал новый проект с помощью init-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
25

Я только что очистил папку сборки для Android, и после этого все заработало. Надеюсь, это поможет товарищу.

cd android
./gradlew clean 
Самернадий
источник
часов отладки и поисков, и это было исправлено чистым ...
tibbus
2
да, было очень разочаровывающе обнаружить, что это абсурдное исправление
самернадий
У меня всегда появляется эта ошибка, когда я создаю выпуск пакета, мне нужно каждый раз запускать чистый
tibbus
Я думаю, эта проблема началась, когда я обновил версию nodejs. В любом случае это устранило мою проблему!
Король Жюльен
9
  1. открыть node_modules / jsc-android / README.md
  2. найдите раздел "Как использовать его с моим приложением React Native"

например:

  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
}
Старрый
источник
Я выполнил вышеуказанный способ без использования packageOptions, и этого достаточно. Благодарю.
огужан
Для меня просто нужно было добавить pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
dazza5000
Долгие исследования, чтобы найти ответ. Спасибо за решение.
R.Mohanraj 05
8

Если вы столкнулись с этой ошибкой при обновлении до версии 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.DirectorySoSoSource [root = / system / lib flags = 2] Собственный каталог библиотеки: /data/app/com.tootitoo.tootitoo-1/lib/arm result : 0
Kyo Kurosagi
7

я решил это, добавив

 configurations.all {
    resolutionStrategy {
        force "com.facebook.soloader:soloader:0.8.2"
    }
}
дасл
источник
Куда именно вы это добавили и в каком файле?
Andru
1
app/build.gradleinside end ofdependencies { } dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } }
dasl
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
Я только что добавил URL ("$ rootDir /../ node_modules / jsc-android / dist") в Gradle проекта. спасибо Элиэзер Штайнбок
Гуру
3

Добавьте это в свой уровень проекта.

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()
    }
}
Кишан верма
источник
3

Больше я ничего не делал. ./gradlew cleanрешил мою проблему.

Джек Ау
источник
поскольку вы официально публикуете ответ на старый вопрос. Было бы очень полезно, если бы вы подкрепили свой предполагаемый ответ некоторым кодом и результатами, полученными в результате использования вашего кода. Вы можете подкрепить свой ответ копией и вставкой или даже печатью экрана, если результат из вашего кода не может быть скопирован.
Грей
2

После безуспешного следования всем советам я создал * .apk вместо * .aab. Размер APK составляет 16 МБ, а не AAB 8 МБ, но я наконец избавился от UnsatisfiedLinkError.

Чтобы построить AAB (сбой с UnsatisfiedLinkError):

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

Чтобы собрать APK (без сбоев, и Hermes тоже отлично работает):

cd android && ./gradlew clean && ./gradlew assembleRelease
Хенрик
источник
Хотя это не постоянное решение, это временное решение, которое на данный момент устранило проблему для меня. Благодаря!
kentrh
0

В моем случае Hermes никогда не был включен, но я столкнулся с этой ошибкой. Очистка (через Android Studio) и восстановление устранили ошибку.

Исаак Оверакер
источник
Имеет ли ./gradlew cleanразница между очисткой через Android Studio и через ?
Андру
0

Попробуйте заменить свой объект ndk внутри app / build.gradle

defaultConfig {
...
    ndk {
        abiFilters "armeabi-v7a", "x86"
    }
}
user3571779
источник
0

У меня была эта ошибка, когда я пытался запустить более старую версию React Native до 0.60, в то время как в ней package.jsonбыла определена более новая версия (сообщение 0.60).

Сэр Кодесалот
источник
0

Это случается со мной после того, как я обновил свою студию Android, затем я снова чищу и строю, она больше не вылетает.

Элан
источник
0

Это потому, что SOLoader отсутствует.

Обеспечить

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

добавлен в зависимости в android / app / build.gradlle

очисти свою сборку

cd android

./gradlew clean

Попробуйте связать ./gradlew bundleRelease

Выйти из папки Android cd ../

Попробуйте бежать npx react-native run-android --variant=release

michael_vons
источник
-1

В моем случае, просто поверните enableHermesдальше в app/build.gradle:

project.ext.react = [
    entryFile   : "index.js",
    enableHermes: true,  // HERE!
]
lfree
источник
Если вы включите Hermes, вы просто измените параметры сборки, и он заменит SoLoader на Hermes и сделает сборку через Hermes ... но это не исправлено
Лукаш Шалек
-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'
Chaurasia
источник
4
Я думаю, это слишком просто !!
Хани
@Chaurasia, что вы сделали для решения этой проблемы? какие строки решили это?
Kruupös
@ Kruupös Показываю только свою файловую инструкцию. этот файл работает хорошо. может ли пользователь сопоставить собственные файлы с моим файлом? так просто.
Chaurasia
1
@Chaurasia не совсем, у меня есть конкретная конфигурация, которая не соответствует вашим требованиям. Реальный ответ - понять, какая именно строка вызывает или решает проблему. Я даже не знаю вашу версию React, так что не все так просто.
Kruupös
-2

Если кто-то все еще сталкивается с проблемой даже после выполнения всех вышеперечисленных шагов, вот решение.

В MainApplication.java добавьте этот импорт:

import com.facebook.react.BuildConfig;
Моаз Хан
источник
Предупреждение! Не добавляйте этот импорт, если вы используете простой рабочий процесс Expo. Это испортит BuildConfig.DEBUGзначение и ваши отладочные сборки больше не будут работать.
Андру
BuildConfig - это файл, автоматически созданный для вашего проекта, вы не должны импортировать его из facebook.
Бруно Лемос