Android java.lang.UnsatisfiedLinkError: не удалось найти DSO для загрузки
Я только что создал новый проект, поддерживающий реакцию (0.62). Запуск новой отладочной сборки работает нормально.
Я настроил подписку, следуя документации: https://reactnative.dev/docs/signed-apk-android, и убедился, что использую следующие ABI:"armeabi-v7a", "x86", "arm64-v8a", "x86_64"
.
Чтобы протестировать сборку релиза, я запускаю следующее: npx react-native run-android --variant release
Проблема
После выполнения указанной выше команды приложение пытается запуститься и сразу вылетает со следующей трассировкой стека:
--------- beginning of crash
2020-05-01 09:34:26.707 19961-19976/? E/AndroidRuntime: FATAL EXCEPTION: create_react_context
Process: <BUNDLE_ID>, PID: 19961
java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so
at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:789)
at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:639)
at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:577)
at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:525)
Конечно же, когда я распаковываю APK, в нем нет libhermes.so /lib/x86_64
(Сейчас я тестирую пиксель 2 API 28).
Я не уверен, почему Hermes не был включен с самого начала, но просто для уверенности я установил следующее в моем build.grade:
project.ext.react = [
enableHermes: true, // clean and rebuild if changing
]
Теперь, после очистки и строительства, я вижу libhermes.so
. К сожалению, я все еще вижу ту же проблему. Но я вижу, что файл существует.
На этом я довольно застрял. Я следил за несколькими потоками, в которых сообщалось об одной и той же проблеме (например, об этой). Похоже, основная проблема с soloader была исправлена и используется с последней версией react native. Хотя я использую последнюю версию RN, эта проблема все еще возникает.
Вопрос
Не очень хорошо разбираясь в разработке Android, какие шаги я могу предпринять для дальнейшего изучения этой проблемы?
2 ответа
Вы можете использовать старую версию soloader, добавив configurations.all в свой build.gradle
configurations.all {
resolutionStrategy {
force "com.facebook.soloader:soloader:0.8.2"
}
}
как это
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
configurations.all {
resolutionStrategy {
force "com.facebook.soloader:soloader:0.8.2"
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
выполните указанные ниже действия, если указанные выше действия не работают.
приложение / build.gradle.
android {
...
// add the following packagingOptions
packagingOptions {
pickFirst 'lib/x86_64/libjsc.so'
pickFirst 'lib/arm64-v8a/libjsc.so'
}
}
Мы также добавили следующее в defaultConfig в app/build.gradle
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
Причина ошибки
Fatal Exception: java.lang.UnsatisfiedLinkError
couldn't find DSO to load: libimagepipeline.so
com.facebook.soloader.SoLoader.doLoadLibraryBySoName
Добавьте ниже строки в build.gradle
// add the following packaging Options inside android { }
android {
...
packagingOptions {
pickFirst 'lib/x86_64/libjsc.so'
pickFirst 'lib/arm64-v8a/libjsc.so'
}
}