我刚刚更新了我的项目以使用 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 但不幸的是,它们都不适合我。请提出解决方法。
从 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")
}
我刚刚清理了 android 的构建文件夹,之后,它运行良好。希望对伴侣有所帮助。
cd android
./gradlew clean
我在 project_dir/build.gradle 的 allProject 块中添加了这个块,崩溃就消失了。
maven {
// Android JSC is installed from npm
url("$rootDir/../node_modules/jsc-android/dist")
}
我所做的是使用 react-native init 创建新项目并浏览了 android 构建文件。幸运的是,这是我注意到并解决了我的问题的第一个区别。如果这不起作用,我想你也可以这样做。
error: package com.facebook.react.module.annotations does not exist
如果您在更新到 React Native 版本 0.62.2
时遇到此错误:
将以下内容添加到您的 android/app/build.gradle
文件中:
dependencies {
implementation 'com.facebook.soloader:soloader:0.9.0+'
作为前 implementation
个条目之一。
打开 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
}
pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
我已经通过添加解决了这个问题
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" } } }
的末端内
对于遇到此问题的其他人,有 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()
}
}
我什么也没做。 ./gradlew clean
解决了我的问题。
这是因为 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
releaseImplementation 'com.facebook.soloader:soloader:0.9.0+'
implementation'com.facebook.soloader:soloader:0.9.0+'
说并按照他的其余说明使用 react-native 构建它。此外,在构建/启动 react-native 应用程序时在 Android Studio 中打开 logcat 可以让我找到问题,因为 Metro 没有吐出任何错误,并且应用程序在构建时立即崩溃。
将此添加到您的项目级别 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()
}
}
在遵循所有建议但没有成功后,我构建了一个 *.apk 而不是 *.aab。 APK 是 16 MB 而不是 8 MB AAB,但我终于摆脱了 UnsatisfiedLinkError。
要构建 AAB(因 UnsatisfiedLinkError 而崩溃):
cd android && ./gradlew clean && ./gradlew bundleRelease
构建一个 APK(没有崩溃,爱马仕也可以正常工作):
cd android && ./gradlew clean && ./gradlew assembleRelease
在我的情况下,我需要为每个 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
}
就我而言,Hermes 从未启用,但我遇到了这个错误。清理(通过 Android Studio)和重建解决了错误。
./gradlew clean
进行清理有区别吗?
尝试替换 app/build.gradle 中的 ndk 对象
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
当我尝试使用 0.60 之前的旧版本的 React Native 运行时,我遇到了这个错误,而在 package.json
中定义了一个较新的版本(0.60 之后)。
它发生在我更新我的 android studio 之后,然后我清理并再次构建,它不再崩溃。
maven {
// Android JSC is installed from npm
url("$rootDir/../node_modules/jsc-android/dist")
}
&
确保您已安装 - https://www.npmjs.com/package/jsc-android
就我而言,由于某种原因,它不存在。
为了避免这种意外行为,我选择在我的所有项目中使用 fastlane(很容易实现和使用)。每次我寻找新版本时,我都创建了一条短通道来清除项目。
lane :clean do
gradle(
task: "clean"
)
end
然后我在我的生产通道命令中使用这个通道
lane :release do
check_env
bump
...
clean
gradle(
task: 'bundle',
build_type: 'Release'
)
end
就我而言,只需在 app/build.gradle
中打开 enableHermes
:
project.ext.react = [
entryFile : "index.js",
enableHermes: true, // HERE!
]
如果任何人在尝试上述所有步骤后仍然面临问题,那么这里是解决方案
在 MainApplication.java 中,添加这个导入:
import com.facebook.react.BuildConfig;
BuildConfig.DEBUG
值并使您的调试版本不再工作。
用简单的方法解决这个问题。
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'