hermes: [CRASH] Android 6.0.1 crashes with java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so
I uploaded a release build to Google Play and they ran automated tests leading to a lot of crashes coming in with the following stack trace:
Fatal Exception: java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so
at com.facebook.soloader.SoLoader.doLoadLibraryBySoName + 738(SoLoader.java:738)
at com.facebook.soloader.SoLoader.loadLibraryBySoName + 591(SoLoader.java:591)
at com.facebook.soloader.SoLoader.loadLibrary + 529(SoLoader.java:529)
at com.facebook.soloader.SoLoader.loadLibrary + 484(SoLoader.java:484)
at com.facebook.hermes.reactexecutor.HermesExecutor.<clinit> + 20(HermesExecutor.java:20)
at com.facebook.hermes.reactexecutor.HermesExecutorFactory.create + 27(HermesExecutorFactory.java:27)
at com.facebook.react.ReactInstanceManager$5.run + 949(ReactInstanceManager.java:949)
at java.lang.Thread.run + 818(Thread.java:818)
Affected OS is always 6.0.1. Interestingly Hermes is not even enabled in my build.gradle:
project.ext.react = [
entryFile: "index.android.js",
enableHermes: false, // clean and rebuild if changing
bundleInDebug: false,
bundleInRelease: true,
root: "../../",
]
...
def enableHermes = project.ext.react.get("enableHermes", false);
...
// Hermes config
if (enableHermes) {
def hermesPath = "../../node_modules/hermesvm/android/";
debugImplementation files(hermesPath + "hermes-debug.aar")
releaseImplementation files(hermesPath + "hermes-release.aar")
} else {
implementation jscFlavor
}
Setup:
System:
OS: macOS 10.14.6
CPU: (12) x64 Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz
Memory: 82.07 MB / 32.00 GB
Shell: 5.3 - /bin/zsh
Binaries:
Node: 10.16.0 - /usr/local/bin/node
Yarn: 1.17.3 - /usr/local/bin/yarn
npm: 6.9.0 - /usr/local/bin/npm
Watchman: 4.9.0 - /usr/local/bin/watchman
SDKs:
iOS SDK:
Platforms: iOS 12.4, macOS 10.14, tvOS 12.4, watchOS 5.3
Android SDK:
API Levels: 23, 26, 27, 28
Build Tools: 23.0.1, 25.0.0, 26.0.3, 27.0.3, 28.0.1, 28.0.2, 28.0.3
System Images: android-24 | Google APIs Intel x86 Atom, android-24 | Google Play Intel x86 Atom, android-27 | Google APIs Intel x86 Atom, android-28 | Google APIs Intel x86 Atom, android-29 | Google APIs Intel x86 Atom
IDEs:
Android Studio: 3.4 AI-183.6156.11.34.5692245
Xcode: 10.3/10G8 - /usr/bin/xcodebuild
npmPackages:
react: ^16.8.6 => 16.8.6
react-native: ^0.60.4 => 0.60.4
npmGlobalPackages:
eslint-plugin-react-native: 3.5.0
react-native-cli: 2.0.1
react-native-git-upgrade: 0.2.7
About this issue
- Original URL
- State: closed
- Created 5 years ago
- Reactions: 9
- Comments: 23 (4 by maintainers)
Links to this issue
Commits related to this issue
- Merge pull request #78 from dannyvv/pr/Compliant Make pipeline compliant — committed to mganandraj/hermes by dannyvv 2 years ago
I am using firebase to track the crashes and a few of my users with following Android version are having crashes:
Android 4.2.2 Android 4.3 Android 4.3.1 Android 4.4.2 Android 5.1
Fatal Exception: java.lang.UnsatisfiedLinkError - couldn't find DSO to load: libhermes.soI am using RN 0.60.5 and split APKs.
I’m seeing this crash in production with RN 0.61.2, using android bundles with hermes disabled.
Thanks @mhorowitz for the hint. I did look into the app bundle and extracted the apk for the device type. It contains the
libjsc.sofile but not thelibhermes.so. Which imho is correct because my gradle is configured to not include it. The big question is why does it want to load it if it not enabled? What also surprised me is that I foundlibhermes-executor-release.soandlibhermes-executor-debug.soin it too. Shouldn’t they be excluded too? If you think it will make sense to bring this up in the react-native project, I will do so and link the issue here.the relevant bit of code is here: https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java#L288-L296 React Native tries to load JSC, and if it’s not present, it tries to load Hermes. If the latter fails, you get the exception you’re seeing.
Since you’re building for JSC, the latter error is expected, but the first error is not. From your screen shot, libjscexecutor.so seems to be present, but the code is swallowing the error loading JSC, which is what would tell us what’s wrong. I’ve asked someone here to improve the error reporting. In the interim, you could hack this code to comment out the try/catch. This will break enableHermes in the gradle files, but it should illuminate the problem.
One hypothesis is that the failing devices are not arm32, and the libraries for that platform are different.
I it makes sense to open an RN issue. I’m not sure what the problem is, but I suspect the fix will need to be in the react-native repo.
You’re right that those hermes .so files should be excluded, but that’s a separate problem.
YES,but not work. My project has used Jsc, and disable Hermes. It OK in android 6.* 7.* It has crashed in android 5.0
Something wrong with SoLoader.loadLibrary(“jscexecutor”);
The crash is here https://github.com/facebook/react-native/issues/25923#issuecomment-554295179
I’m still trying to find the solution. -!!!
Our build pipeline does fresh checkouts removing all gradle caches programmatically and running gradle in a non-daemon mode.
Shouldn’t that be sufficient and not require us to run a
./gradlew clean?Thanks for the more detailed report! A few other people have reported similar issues in https://github.com/facebook/react-native/issues/25601 and running
./gradlew cleanhas fixed it. Can you try that?