Anonymous
React Native 0.81.4 (New Arch + Bridgeless) stürzt nur im Play Store AAB mit SoLoaderDSONotFoundError: libjsctooling.so
Post
by Anonymous » 05 Jan 2026, 17:45
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 ()
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
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
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
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
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
"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
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
1767631556
Anonymous
Ich habe eine React Native-App mithilfe der neuen Architektur (Fabric/TurboModules) und ohne Bridge auf RN 0.81.4 aktualisiert. Alles funktioniert: [list] [*]iOS ✅ [*]Android APK lokal installiert ([code]assembleRelease[/code]) ✅ [/list] Bei der Installation des AAB von Google Play (interner Testtrack) stürzt die App jedoch sofort beim Start ab. Logcat zeigt: [code]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) [/code] 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. [b]Tatsächlich:[/b] Nur die von Play bereitgestellte Installation (getrennte APKs aus dem AAB bei internen Tests) stürzt beim Start ab mit: [code]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) [/code] [b]Was ich versucht habe:[/b] [list] [*]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 [/list] Umgebung [list] [*]React Native: [b]0.81.4[/b] [*]Bridgeless + Neue Architektur: [b]aktiviert[/b] [*]JS-Engine: [b]Hermes[/b] [/list] Relevante Konfigurationsausschnitte [code]android/build.gradle[/code] [code]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] [code]android/app/build.gradle[/code] [code]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] [code]MainApplication.java[/code] [code]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] [code]gradle.properties[/code] [code]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] [code]package.json[/code] [code]"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" }, [/code] Config [code]npx react-native info[/code] [code]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 [/code]