React-Native:java.lang.UnsatisfiedLinkError:找不到要加载的 DSO:libhermes.so
Posted
技术标签:
【中文标题】React-Native:java.lang.UnsatisfiedLinkError:找不到要加载的 DSO:libhermes.so【英文标题】:React-Native :java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so 【发布时间】:2019-11-23 22:53:45 【问题描述】:我刚刚更新了我的项目以使用 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 changelog/blog:随着这一变化,React Native 应用程序将需要自己开始使用 AndroidX。它们不能在一个应用程序中并排使用,因此所有应用程序代码和依赖项代码都需要使用其中一个。你可能会遇到这种情况? 相关***.com/questions/60054822/… 【参考方案1】:我在 project_dir/build.gradle 的 allProject 块中添加了这个块,崩溃就消失了。
maven
// Android JSC is installed from npm
url("$rootDir/../node_modules/jsc-android/dist")
我所做的是使用 react-native init 创建新项目并浏览了 android 构建文件。幸运的是,这是我注意到并解决了我的问题的第一个区别。如果这不起作用,我想你也可以这样做。
【讨论】:
@msqar 相同 在构建过程中添加该行导致以下错误:error: package com.facebook.react.module.annotations does not exist
在此处验证更改可能是个好主意react-native-community.github.io/upgrade-helper【参考方案2】:
从 0.59.8 升级到 0.60.4 后我遇到了同样的问题
确保您在 app/build.gradle 中添加了所有这些行,尤其是 dependencies 部分,因为这确保您拥有 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")
【讨论】:
升级到 0.60.4 后这对我不起作用。我多次尝试清洁。我似乎无法禁用爱马仕。我在启动时崩溃“找不到要加载的 DSO:libhermes.so” 确保在 src/android/build.gradle 中,您还为 hermes 库添加了 maven 存储库(就像其他答案所建议的那样)。它可能与 javascriptCore 而非 Hermes 相关 谢谢!我错过了“maven url("$rootDir/../node_modules/jsc-android/dist") 谢谢!!它的工作形式是我,但不要忘记在项目 build.gradle maven 中添加这个块 // Android JSC 是从 npm url("$rootDir/../node_modules/jsc-android/dist") 在 react-native 0.61 中,android/app/build.gradle 中的 hermesvm 部分已移至 hermes-engine:github.com/facebook/react-native/blob/0.61-stable/template/…【参考方案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()
【讨论】:
【参考方案4】:用简单的方法解决这个问题。
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 你是怎么解决这个问题的?解决这个问题的方法是什么? @Kruupös 我只显示我的文件说明。这个文件的工作方式很好。用户可以将自己的文件与我的文件匹配吗?如此简单。 @Chaurasia 不是真的,我有一些特定的配置不符合您的要求。真正的答案是了解导致或解决问题的确切线路。我什至不知道你的 React 版本,所以没那么简单。【参考方案5】:对于遇到此问题的其他人,有 2 个部分看起来相似。您需要更新android/build.gradle
中底部的repositories
部分!
// 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()
【讨论】:
我刚刚在项目 gradle 中添加了 url("$rootDir/../node_modules/jsc-android/dist")。谢谢 Eliezer Steinbock【参考方案6】:就我而言,只需在app/build.gradle
中打开enableHermes
:
project.ext.react = [
entryFile : "index.js",
enableHermes: true, // HERE!
]
【讨论】:
如果您打开 Hermes,您只需更改构建选项,它会将 SoLoader 替换为 Hermes 并通过 Hermes 进行构建...但它不是固定的【参考方案7】:就我而言,Hermes 从未启用,但我遇到了这个错误。清理(通过 Android Studio)和重建解决了错误。
【讨论】:
通过 Android Studio 与通过./gradlew clean
进行清理有区别吗?【参考方案8】:
我刚刚清理了 android 的构建文件夹,之后,它运行良好。希望对伴侣有所帮助。
cd android
./gradlew clean
【讨论】:
几个小时的调试和搜索,它被一个干净的...修复了...... 是的,发现它是这个荒谬的修复方法非常令人失望 我在创建捆绑发布时总是出现这个错误,每次都需要运行干净 我认为这个问题是我升级nodejs版本时开始的。无论如何,这解决了我的问题!【参考方案9】:在遵循所有建议但没有成功后,我构建了一个 *.apk 而不是 *.aab。 APK 是 16 MB 而不是 8 MB AAB,但我终于摆脱了 UnsatisfiedLinkError。
构建 AAB(因 UnsatisfiedLinkError 崩溃):
cd android && ./gradlew clean && ./gradlew bundleRelease
构建一个 APK(没有崩溃,hermes 也可以正常工作):
cd android && ./gradlew clean && ./gradlew assembleRelease
【讨论】:
虽然这不是一个永久的解决方案,但它是一个临时的解决方法,暂时为我解决了这个问题。谢谢!【参考方案10】:尝试替换 app/build.gradle 中的 ndk 对象
defaultConfig
...
ndk
abiFilters "armeabi-v7a", "x86"
【讨论】:
【参考方案11】:我已经通过添加解决了这个问题
configurations.all
resolutionStrategy
force "com.facebook.soloader:soloader:0.8.2"
【讨论】:
你到底是在哪里添加的以及在哪个文件中添加的?app/build.gradle
dependencies
dependencies implementation project(':react-native-permissions') configurations.all resolutionStrategy force "com.facebook.soloader:soloader:0.8.2"
的末尾【参考方案12】:
当我尝试使用 0.60 之前的旧版本的 React Native 运行时遇到此错误,而在 package.json
中定义了新版本(0.60 后)。
【讨论】:
【参考方案13】:-
打开 node_modules/jsc-android/README.md
查找“如何将它与我的 react Native 应用程序一起使用”部分
例如:
-
修改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()
-
修改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 的情况下完成了上述操作,这就足够了。谢谢。 对我来说,我只需要添加pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
长期研究寻找答案。感谢您的解决方案。
OMFG 如果可以的话,我会为这个答案投票十亿@#$%ing 次!!我以为我已经疯了好几个小时了;尝试了上述所有答案的建议并添加 second maven repo 链接终于解决了!只有一个或另一个是不够的。 TYSM! :D
这是我唯一的解决方案。【参考方案14】:
如果任何人在尝试上述所有步骤后仍然面临问题,那么这里是解决方案
在 MainApplication.java 中,添加这个导入:
import com.facebook.react.BuildConfig;
【讨论】:
警告!如果您使用 Expo 裸工作流,请不要添加该导入。它会弄乱BuildConfig.DEBUG
的值并使您的调试版本不再工作。
BuildConfig 是为您的项目自动生成的文件,您不应从 facebook 导入该文件。【参考方案15】:
我更新了我的 android studio 后发生了这种情况,然后我清理并再次构建,它不再崩溃了。
【讨论】:
【参考方案16】:如果您在更新到 React Native 版本时遇到此错误0.62.2
:
将以下内容添加到您的 android/app/build.gradle
文件中:
dependencies
implementation 'com.facebook.soloader:soloader:0.9.0+'
作为第一个 implementation
条目之一。
Solution taken from here
【讨论】:
实现后还是有这个问题--->找不到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] 本机库目录:/data/app/com.tootitoo. Tootitoo-1/lib/arm 结果:0【参考方案17】:我什么也没做。 ./gradlew clean
解决了我的问题。
【讨论】:
因为您正式发布了对较早问题的答案。用一些代码和使用代码产生的输出来支持你声称的答案将是最有帮助的。如果无法复制代码的结果,您可以通过复制和粘贴甚至屏幕打印来支持您的答案。【参考方案18】:这是因为没有 SOLoader。
确保
implementation'com.facebook.soloader:soloader:0.9.0+'
在android/app/build.gradlle的依赖项下添加
清理你的构建
cd android
./gradlew clean
尝试捆绑
./gradlew bundleRelease
退出安卓文件夹
cd ../
尝试运行
npx react-native run-android --variant=release
【讨论】:
就我而言,我错过了releaseImplementation 'com.facebook.soloader:soloader:0.9.0+'
@michael_vons 感谢您的解决方案。对于似乎突然停止工作的任何人,它都可以在 Android Studio 中构建,并且 react-native run-android 将适用于低于 30 的 API,但对于 30 及以上的 API,我需要像 Michael 一样添加 implementation'com.facebook.soloader:soloader:0.9.0+'
说并按照他的其余说明使用 react-native 构建它。此外,在构建/启动 react-native 应用程序时在 Android Studio 中打开 logcat 可以让我找到问题,因为 Metro 没有吐出任何错误,并且应用程序在构建时立即崩溃。【参考方案19】:
maven
// Android JSC is installed from npm
url("$rootDir/../node_modules/jsc-android/dist")
&
确保你已经安装了这个 - https://www.npmjs.com/package/jsc-android
就我而言,由于某种原因它不存在。
【讨论】:
【参考方案20】:在我的情况下,我需要为每个 android 风格添加 hermes 路径
if (enableHermes)
def hermesPath = "../../node_modules/hermes-engine/android/";
debugImplementation files(hermesPath + "hermes-debug.aar")
releaseImplementation files(hermesPath + "hermes-release.aar")
qaImplementation files(hermesPath + "hermes-release.aar")
stageImplementation files(hermesPath + "hermes-release.aar")
prodImplementation files(hermesPath + "hermes-release.aar")
else
implementation jscFlavor
【讨论】:
【参考方案21】:为了避免这种意外行为,我选择在我的所有项目中使用 fastlane(非常容易实现和使用)。每次我寻找新版本时,我都会创建一条短通道来清理项目。
lane :clean do
gradle(
task: "clean"
)
end
然后我在我的生产通道命令中使用这个通道
lane :release do
check_env
bump
...
clean
gradle(
task: 'bundle',
build_type: 'Release'
)
end
【讨论】:
以上是关于React-Native:java.lang.UnsatisfiedLinkError:找不到要加载的 DSO:libhermes.so的主要内容,如果未能解决你的问题,请参考以下文章
在另一个 React-Native 库中使用 React-Native 库
React-Native + crypto:如何在 React-Native 中生成 HMAC?
React-native:如何在 React-native 中使用(和翻译)带有 jsx 的 typescript .tsx 文件?
React-Native 开发 在react-native 中 运用 redux
在解析模块`react-native/Libraries/Core/Devtools/getDevServer`时,发现了Haste包`react-native`