React Native 0.81.4 (New Arch + Bridgeless) stürzt nur im Play Store AAB mit SoLoaderDSONotFoundError: libjsctooling.so Android

Forum für diejenigen, die für Android programmieren
Anonymous
 React Native 0.81.4 (New Arch + Bridgeless) stürzt nur im Play Store AAB mit SoLoaderDSONotFoundError: libjsctooling.so

Post by Anonymous »

Ich habe eine React Native-App mithilfe der neuen Architektur (Fabric/TurboModules) und ohne Bridge auf RN 0.81.4 aktualisiert. Alles funktioniert:
  • iOS ✅
  • Android APK lokal installiert (

    Code: Select all

    assembleRelease
    ) ✅
Bei der Installation des AAB von Google Play (interner Testtrack) stürzt die App jedoch sofort beim Start ab. Logcat zeigt:

Code: Select all

com.facebook.soloader.SoLoaderDSONotFoundError: couldn't find DSO to load: libjsctooling.so
...
at com.facebook.react.runtime.JSCInstance.\(JSCInstance.kt:19)
at com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost(DefaultReactHost.kt:267)
Das sieht aus wie ein JSC-Ladepfad, obwohl mein Build nur Hermes ist. Ich habe bestätigt, dass das AAB keine JSC-Bibliotheken enthält. Meine Gradle-Konfigurationssätze reagieren auf { jsEngine = "hermes" und ich verwende DefaultReactHost + SoLoader.init(this, OpenSourceMergedSoMapping.INSTANCE) gemäß der Vorlage „new-arch/bridgeless“. Ich kann den Absturz mit einem lokalen APK nicht reproduzieren, da dies nur die von Play generierten Split-APKs aus dem AAB auslösen. Ich habe Schwierigkeiten zu debuggen, warum JSC zur Laufzeit referenziert wird, obwohl Hermes aktiviert ist.
Erwartet
Mit RN 0.81.4, neuer Architektur (bridgeless) und React { jsEngine = "hermes" } habe ich erwartet, dass die Play Store-Installation (von einem AAB) normal startet und Hermes lädt – genau wie mein lokal installiertes Release-APK dies tut.
Tatsächlich:
Nur die von Play bereitgestellte Installation (getrennte APKs aus dem AAB bei internen Tests) stürzt beim Start ab mit:

Code: Select all

com.facebook.soloader.SoLoaderDSONotFoundError: couldn't find DSO to load: libjsctooling.so
at com.facebook.react.runtime.JSCInstance.(JSCInstance.kt:19)
at com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost(DefaultReactHost.kt:267)
Was ich versucht habe:
  • Definieren Sie explizit die Hermes-Konfiguration in android/app/build.gradle und gradle.properties
  • Verifizierter AAB-Inhalt durch Entpacken und Suchen nach JSC-Dateien (z. B. kein libjsc.so, nur Hermes)
  • Saubere Builds ./gradlew clean, Caches geleert
Umgebung
  • React Native: 0.81.4
  • Bridgeless + Neue Architektur: aktiviert
  • JS-Engine: Hermes
Relevante Konfigurationsausschnitte

Code: Select all

android/build.gradle

Code: Select all

buildscript {
ext {
minSdkVersion = 24
compileSdkVersion = 35
targetSdkVersion = 35
kotlinVersion = "1.8.20"
ndkVersion = "27.0.12077973"
}
repositories {
google()
mavenCentral()
}
dependencies {
classpath("com.android.tools.build:gradle:8.13.0")
classpath("com.facebook.react:react-native-gradle-plugin")
classpath("com.newrelic.agent.android:agent-gradle-plugin:7.6.2")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
classpath("com.google.gms:google-services:4.4.2")
}
}

plugins {
id 'com.google.gms.google-services' version '4.4.2' apply false
}

allprojects {
repositories {
google()
mavenCentral()
maven { url = uri("$rootDir/../node_modules/detox/Detox-android") }
}
}

configurations.all {
resolutionStrategy {
force 'androidx.test:core:1.6.0'
force 'com.google.guava:guava:31.1-android'
}
}

Code: Select all

android/app/build.gradle

Code: Select all

apply plugin: "com.android.application"
apply plugin: "com.facebook.react"
apply plugin: 'newrelic'

project.ext.envConfigFiles = [
debug  : "$rootDir/../.env",
release: "$rootDir/../.env",
]

apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"

import com.android.build.OutputFile

dependencies {
androidTestImplementation('com.wix:detox:+')
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation("com.facebook.react:react-android")
implementation("com.facebook.react:hermes-android")
implementation project(':react-native-config')
implementation ('com.google.android.material:material:1.3.0')
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
implementation platform("com.google.firebase:firebase-bom:33.14.0")
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-messaging'
}

react {
jsEngine = "hermes"
autolinkLibrariesWithApp()
entryFile = file("../../src/main.tsx")
}

def enableSeparateBuildPerCPUArchitecture = false
def enableProguardInReleaseBuilds = false

def reactNativeArchitectures() {
def value = project.getProperties().get("reactNativeArchitectures")
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
}

android {
ndkVersion = rootProject.ext.ndkVersion
compileSdkVersion = rootProject.ext.compileSdkVersion
namespace = "com.rosamobilepatient.prod"
defaultConfig {
applicationId = "com.rosamobilepatient.prod"
minSdkVersion = rootProject.ext.minSdkVersion
targetSdkVersion = (rootProject.ext.compileSdkVersion ?:  35)
versionCode = 389
versionName = "1.15.0"
testBuildType = System.getProperty('testBuildType', 'debug')
testInstrumentationRunner = 'androidx.test.runner.AndroidJUnitRunner'
resValue "string", "build_config_package", "com.rosamobilepatient.prod"
externalNativeBuild {
cmake {
cppFlags ""
arguments "-DANDROID_STL=c++_shared"
}
}
}
splits {
abi {
reset()
enable = enableSeparateBuildPerCPUArchitecture
universalApk = false
include (*reactNativeArchitectures())
}
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
release {
if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
storeFile file(MYAPP_UPLOAD_STORE_FILE)
storePassword MYAPP_UPLOAD_STORE_PASSWORD
keyAlias MYAPP_UPLOAD_KEY_ALIAS
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
}
}
}
buildTypes {
debug {
signingConfig = signingConfigs.debug
}
release {
signingConfig = signingConfigs.release
minifyEnabled = enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro"
}
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) {
output.versionCodeOverride = defaultConfig.versionCode * 1000 + versionCodes.get(abi)
}

}
}

packagingOptions {
pickFirst '**/armeabi-v7a/libc++_shared.so'
pickFirst '**/x86/libc++_shared.so'
pickFirst '**/arm64-v8a/libc++_shared.so'
pickFirst '**/x86_64/libc++_shared.so'
}
}

// Add configuration to resolve NewRelic/Guava conflict
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:31.1-android'
// Exclude problematic transitive dependencies
exclude group: 'com.google.guava', module: 'listenablefuture'
}
}

apply plugin: 'com.google.gms.google-services'

Code: Select all

MainApplication.java

Code: Select all

package com.rosamobilepatient.prod;

import android.app.Application;

import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactHost;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactHost;
import com.facebook.react.defaults.DefaultReactNativeHost;
import com.facebook.soloader.SoLoader;
import com.facebook.react.soloader.OpenSourceMergedSoMapping;
import com.lugg.RNCConfig.RNCConfigPackage;

import java.io.IOException;
import java.util.List;

public class MainApplication extends Application implements ReactApplication {

private List getReactPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List packages = new PackageList(this).getPackages();
packages.add(new RNCConfigPackage());
return packages;
}

private final DefaultReactNativeHost mReactNativeHost =
new DefaultReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}

@Override
protected List  getPackages() {
return getReactPackages();
}

@Override
protected String getJSMainModuleName() {
return "index";
}

@Override
protected boolean isNewArchEnabled() {
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
}

@Override
protected Boolean isHermesEnabled() {
return BuildConfig.IS_HERMES_ENABLED;
}
};

@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}

@Override
public ReactHost getReactHost() {
return DefaultReactHost.getDefaultReactHost(
getApplicationContext(),
getReactPackages(),
"index",
"index.android.bundle",
null,
BuildConfig.DEBUG,
BuildConfig.IS_NEW_ARCHITECTURE_ENABLED,
java.util.Collections.emptyList()
);
}

@Override
public void onCreate() {
super.onCreate();
try {
SoLoader.init(this, OpenSourceMergedSoMapping.INSTANCE);
} catch (IOException e) {
throw new RuntimeException(e);
}
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
DefaultNewArchitectureEntryPoint.load();
}
}
}

Code: Select all

gradle.properties

Code: Select all

org.gradle.jvmargs=-Xmx6g -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Dfile.encoding=UTF-8
org.gradle.workers.max=2
org.gradle.configureondemand=false
android.useAndroidX=true
android.enableJetifier=true
newrelic.warning.agp=false
reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
newArchEnabled=true
hermesEnabled=true

Code: Select all

package.json

Code: Select all

"dependencies": {
"@aws-amplify/react-native": "^1.1.10",
"@d11/react-native-fast-image": "^8.10.0",
"@notifee/react-native": "^9.1.8",
"@octokit/rest": "^22.0.0",
"@pact-foundation/pact": "15.0.1",
"@react-native-async-storage/async-storage": "^2.2.0",
"@react-native-community/blur": "^4.4.1",
"@react-native-community/datetimepicker": "^8.4.2",
"@react-native-community/geolocation": "^3.1.0",
"@react-native-community/netinfo": "^11.4.1",
"@react-native-firebase/app": "^22.4.0",
"@react-native-firebase/messaging": "^22.4.0",
"@react-native-masked-view/masked-view": "^0.3.2",
"@react-native-picker/picker": "^2.11.1",
"@react-native/gradle-plugin": "^0.81.4",
"@react-native/new-app-screen": "0.81.4",
"@react-navigation/bottom-tabs": "^7.4.2",
"@react-navigation/material-top-tabs": "^7.3.2",
"@react-navigation/native": "^7.1.14",
"@react-navigation/native-stack": "^7.3.21",
"@react-navigation/stack": "^7.4.2",
"@tanstack/react-query": "5.83.0",
"@types/text-encoding": "^0.0.40",
"aws-amplify": "^6.15.5",
"aws-cdk-lib": "^2.206.0",
"axios": "^1.11.0",
"constructs": "^10.4.2",
"date-fns": "^4.1.0",
"date-fns-tz": "^3.2.0",
"firebase-admin": "^13.4.0",
"formik": "^2.4.6",
"google-libphonenumber": "^3.2.42",
"i18n-iso-countries": "^7.14.0",
"i18next": "^25.3.2",
"jwt-decode": "^4.0.0",
"leaflet": "1.9.4",
"leaflet.markercluster": "1.5.3",
"lodash": "4.17.21",
"lottie-react-native": "^7.2.4",
"mixpanel-react-native": "3.1.2",
"newrelic-react-native-agent": "1.5.6",
"npm": "^11.4.2",
"prettier": "2.8.8",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-i18next": "^15.6.1",
"react-native":  "0.81.4",
"react-native-add-calendar-event": "^5.0.0",
"react-native-bootsplash": "^6.3.10",
"react-native-collapsible": "^1.6.2",
"react-native-config": "^1.5.9",
"react-native-confirmation-code-field": "^8.0.1",
"react-native-date-picker": "^5.0.13",
"react-native-device-info": "^14.0.4",
"react-native-gesture-handler": "2.27.2",
"react-native-get-random-values": "^1.11.0",
"react-native-keyboard-aware-scroll-view": "^0.9.5",
"react-native-keychain": "^10.0.0",
"react-native-linear-gradient": "^2.8.3",
"react-native-mask-input": "^1.2.3",
"react-native-modal": "^14.0.0-rc.1",
"react-native-modal-datetime-picker": "^18.0.0",
"react-native-pager-view": "^6.8.1",
"react-native-permissions": "^5.4.2",
"react-native-picker-select": "^9.3.1",
"react-native-reanimated": "4.1.0",
"react-native-reanimated-carousel": "^4.0.2",
"react-native-redash": "^18.1.0",
"react-native-render-html": "^6.3.4",
"react-native-safe-area-context": "^5.5.2",
"react-native-screens": "4.13.1",
"react-native-svg": "15.12.0",
"react-native-switch": "^1.5.1",
"react-native-tab-view": "^4.1.2",
"react-native-touchable-scale": "^2.2.0",
"react-native-webview": "13.15.0",
"react-native-worklets": "^0.5.1",
"text-encoding": "^0.7.0",
"tslib": "^2.8.1",
"universal-github-app-jwt": "^2.2.2",
"yup": "^1.6.1"
},
"devDependencies": {
"@actions/core": "1.11.1",
"@actions/github": "6.0.1",
"@aws-sdk/client-dynamodb": "3.848.0",
"@aws-sdk/lib-dynamodb": "3.850.0",
"@babel/core": "^7.28.0",
"@babel/preset-env": "^7.28.0",
"@babel/preset-react": "7.27.1",
"@babel/runtime": "^7.28.2",
"@nx/detox": "21.3.5",
"@nx/eslint": "21.3.5",
"@nx/eslint-plugin": "21.3.5",
"@nx/jest": "21.4.1",
"@nx/js": "21.3.5",
"@nx/react-native": "21.3.5",
"@nx/rspack": "21.3.5",
"@nx/webpack": "21.3.5",
"@nx/workspace": "21.3.5",
"@react-native-community/cli": "19.1.1",
"@react-native-community/cli-platform-android": "19.1.1",
"@react-native-community/cli-platform-ios": "19.1.1",
"@react-native/babel-preset": "0.81.4",
"@react-native/eslint-config": "0.81.4",
"@react-native/metro-config": "0.81.4",
"@react-native/typescript-config": "0.81.4",
"@rspack/core": "^1.4.10",
"@storybook/cli": "9.0.18",
"@swc-node/register": "1.10.10",
"@swc/core": "1.13.2",
"@swc/jest": "0.2.39",
"@testing-library/jest-dom": "6.8.0",
"@testing-library/jest-native": "5.4.3",
"@testing-library/react-native": "13.2.0",
"@types/google-libphonenumber": "^7.4.23",
"@types/jest": "^30.0.0",
"@types/leaflet": "1.9.20",
"@types/leaflet.markercluster": "1.5.5",
"@types/lodash": "4.17.20",
"@types/node": "24.1.0",
"@types/react": "^19.1.0",
"@types/react-test-renderer": "^19.1.0",
"@types/uuid": "^10.0.0",
"@typescript-eslint/eslint-plugin": "^8.38.0",
"@typescript-eslint/parser":  "^8.38.0",
"auto-changelog": "2.5.0",
"aws-cdk": "2.1022.0",
"aws-cli-js": "2.2.3",
"aws-sdk": "2.1692.0",
"babel-jest": "30.1.1",
"better-npm-audit": "3.11.0",
"detox": "^20.40.2",
"eslint": "^9.31.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-import": "2.32.0",
"eslint-plugin-jsx-a11y": "6.10.2",
"eslint-plugin-react": "7.37.5",
"eslint-plugin-react-hooks": "5.2.0",
"husky": "9.1.7",
"istanbul-diff": "2.0.0",
"jest": "30.1.1",
"jest-circus": "30.1.1",
"jest-environment-jsdom": "30.1.1",
"jest-environment-node": "30.1.1",
"jest-react-native": "18.0.0",
"license-checker": "25.0.1",
"metro": "0.83.1",
"metro-babel-register": "0.83.1",
"metro-config": "0.83.1",
"metro-react-native-babel-preset": "0.77.0",
"metro-react-native-babel-transformer": "0.77.0",
"metro-resolver": "0.83.1",
"nock": "14.0.6",
"nx": "21.3.5",
"orval": "7.10.0",
"patch-package": "8.0.0",
"postinstall-postinstall": "2.1.0",
"prettier": "3.6.2",
"prettier-plugin-organize-imports": "^4.2.0",
"react-native-bundle-visualizer": "^3.1.3",
"react-native-storybook-loader": "^2.0.5",
"react-native-svg": "15.12.0",
"react-native-svg-transformer": "1.5.1",
"react-test-renderer": "19.1.0",
"ts-jest": "29.4.1",
"ts-node": "10.9.2",
"typescript": "5.8.3",
"uuid": "11.1.0",
"webpack": "5.100.2",
"webpack-cli": "6.0.1"
},
"engines": {
"node": ">=18"
},
Config

Code: Select all

npx react-native info

Code: Select all

System:
OS: macOS 14.6.1
CPU: (14) arm64 Apple M3 Max
Memory: 40.08 GB / 96.00 GB
Shell:
version: "5.9"
path: /bin/zsh
Binaries:
Node:
version: 24.4.1
path: ~/.nvm/versions/node/v24.4.1/bin/node
Yarn:
version: 1.22.22
path: /usr/local/bin/yarn
npm:
version: 11.6.1
path: ~/rosa-patient-mobile-app/node_modules/.bin/npm
Watchman:
version: 2025.05.26.00
path: /usr/local/bin/watchman
Managers:
CocoaPods:
version: 1.16.2
path: /Users/martin/.rbenv/shims/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 24.2
- iOS 18.2
- macOS 15.2
- tvOS 18.2
- visionOS 2.2
- watchOS 11.2
Android SDK:
API Levels:
- "21"
- "31"
- "32"
- "33"
- "34"
- "35"
- "36"
Build Tools:
- 30.0.3
- 32.0.0
- 33.0.0
- 34.0.0
- 35.0.0
- 36.0.0
- 36.0.0
System Images:
- android-31 | Google APIs ARM 64 v8a
- android-31 | Google Play ARM 64 v8a
- android-32 | Google APIs ARM 64 v8a
- android-34 | Google Play ARM 64 v8a
Android NDK: Not Found
IDEs:
Android Studio: 2025.1 AI-251.25410.109.2511.13752376
Xcode:
version: 16.2/16C5032a
path: /usr/bin/xcodebuild
Languages:
Java:
version: 17.0.14
path: /usr/bin/javac
Ruby:
version: 2.6.10
path: /usr/bin/ruby
npmPackages:
"@react-native-community/cli":
installed: 20.0.2
wanted: 19.1.1
react:
installed: 19.1.1
wanted: 19.1.0
react-native:
installed: 0.81.4
wanted: 0.81.4
react-native-macos: Not Found
npmGlobalPackages:
"*react-native*": Not Found
Android:
hermesEnabled:  Not found
newArchEnabled: Not found
iOS:
hermesEnabled: true
newArchEnabled: true

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post