react-native: Android with RN 0.67.3 crashes when running custom build type with hermes enabled

Description

When you create new RN project running on 0.67.3 and add a custom build type that inherits from release and launch the app it crashes. Does not crash in debug and does not crash when launching the app in release build type (pre-defined).

Version

0.67.3

Output of npx react-native info

System:
    OS: Windows 10 10.0.22000
    CPU: (12) x64 Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz
    Memory: 25.48 GB / 47.76 GB
  Binaries:
    Node: 16.13.0 - C:\Program Files\nodejs\node.EXE
    Yarn: 1.22.17 - ~\AppData\Roaming\npm\yarn.CMD
    npm: 8.1.3 - C:\Program Files\nodejs\npm.CMD
    Watchman: Not Found
  SDKs:
    Android SDK: Not Found
    Windows SDK: Not Found
  IDEs:
    Android Studio: Version     2021.1.0.0 AI-211.7628.21.2111.8139111
    Visual Studio: 17.0.32014.148 (Visual Studio Community 2022)
  Languages:
    Java: 17.0.1 - C:\Program Files\Common Files\Oracle\Java\javapath\javac.EXE
  npmPackages:
    @react-native-community/cli: Not Found
    react: 17.0.2 => 17.0.2
    react-native: 0.67.3 => 0.67.3
    react-native-windows: Not Found
  npmGlobalPackages:
    *react-native*: Not Found

Steps to reproduce

  1. npx react-native init AwesomeProject
  2. enable hermes engine
  3. in app/build.gradle define custom build type like this:
        staging {
            initWith release
            signingConfig signingConfigs.debug
            applicationIdSuffix ".staging"
            matchingFallbacks =  ['release']
        }

and enable hermes:

project.ext.react = [
    enableHermes: true,  // clean and rebuild if changing
    bundleInStaging: true, //include JS bundle in staging builds
    devDisabledInStaging: true //disable DEV mode in staging builds
]
  1. Build and try to run the app in staging build type

Snack, code example, screenshot, or link to a repository

Crash in Android Studio:

2022-02-25 01:00:27.863 32152-32152/? E/SoLoader: couldn't find DSO to load: libjscexecutor.so
    	SoSource 0: com.facebook.soloader.ApkSoSource[root = /data/data/com.awesomeproject.staging/lib-main flags = 1]
    	SoSource 1: com.facebook.soloader.DirectorySoSource[root = /data/app/~~JSLNwb7IlKnxWGWDPiIrbQ==/com.awesomeproject.staging-N3SYkVVNGuwgJimlsN-CtQ==/lib/arm64 flags = 0]
    	SoSource 2: com.facebook.soloader.DirectorySoSource[root = /vendor/lib64 flags = 2]
    	SoSource 3: com.facebook.soloader.DirectorySoSource[root = /system/lib64 flags = 2]
    	Native lib dir: /data/app/~~JSLNwb7IlKnxWGWDPiIrbQ==/com.awesomeproject.staging-N3SYkVVNGuwgJimlsN-CtQ==/lib/arm64
     result: 0
2022-02-25 01:00:27.878 21175-21175/? E/ssioncontrolle: Unknown bits set in runtime_flags: 0x800000
2022-02-25 01:00:27.882 21175-21175/? E/ssioncontrolle: Not starting debugger since process cannot load the jdwp agent.
2022-02-25 01:00:27.891 32152-32152/? E/SoLoader: couldn't find DSO to load: libhermes-executor-debug.so caused by: dlopen failed: cannot locate symbol "_ZN8facebook6hermes13HermesRuntime11getDebuggerEv" referenced by "/data/app/~~JSLNwb7IlKnxWGWDPiIrbQ==/com.awesomeproject.staging-N3SYkVVNGuwgJimlsN-CtQ==/lib/arm64/libhermes-executor-common-debug.so"... result: 0
2022-02-25 01:00:27.897 19539-19576/? E/ExternalAccountType: Unsupported attribute readOnly
2022-02-25 01:00:27.908 32152-32152/? E/SoLoader: couldn't find DSO to load: libhermes-executor-release.so
    	SoSource 0: com.facebook.soloader.ApkSoSource[root = /data/data/com.awesomeproject.staging/lib-main flags = 1]
    	SoSource 1: com.facebook.soloader.DirectorySoSource[root = /data/app/~~JSLNwb7IlKnxWGWDPiIrbQ==/com.awesomeproject.staging-N3SYkVVNGuwgJimlsN-CtQ==/lib/arm64 flags = 0]
    	SoSource 2: com.facebook.soloader.DirectorySoSource[root = /vendor/lib64 flags = 2]
    	SoSource 3: com.facebook.soloader.DirectorySoSource[root = /system/lib64 flags = 2]
    	Native lib dir: /data/app/~~JSLNwb7IlKnxWGWDPiIrbQ==/com.awesomeproject.staging-N3SYkVVNGuwgJimlsN-CtQ==/lib/arm64
     result: 0
2022-02-25 01:00:27.911 32152-32152/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.awesomeproject.staging, PID: 32152
    java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libjscexecutor.so
    	SoSource 0: com.facebook.soloader.ApkSoSource[root = /data/data/com.awesomeproject.staging/lib-main flags = 1]
    	SoSource 1: com.facebook.soloader.DirectorySoSource[root = /data/app/~~JSLNwb7IlKnxWGWDPiIrbQ==/com.awesomeproject.staging-N3SYkVVNGuwgJimlsN-CtQ==/lib/arm64 flags = 0]
    	SoSource 2: com.facebook.soloader.DirectorySoSource[root = /vendor/lib64 flags = 2]
    	SoSource 3: com.facebook.soloader.DirectorySoSource[root = /system/lib64 flags = 2]
    	Native lib dir: /data/app/~~JSLNwb7IlKnxWGWDPiIrbQ==/com.awesomeproject.staging-N3SYkVVNGuwgJimlsN-CtQ==/lib/arm64
     result: 0
        at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:918)
        at com.facebook.soloader.SoLoader.loadLibraryBySoNameImpl(SoLoader.java:740)
        at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:654)
        at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:634)
        at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:582)
        at com.facebook.react.jscexecutor.JSCExecutor.loadLibrary(JSCExecutor.java:24)
        at com.facebook.react.jscexecutor.JSCExecutor.<clinit>(JSCExecutor.java:20)
        at com.facebook.react.jscexecutor.JSCExecutor.loadLibrary(Unknown Source:0)
        at com.facebook.react.ReactInstanceManagerBuilder.getDefaultJSExecutorFactory(ReactInstanceManagerBuilder.java:352)
        at com.facebook.react.ReactInstanceManagerBuilder.build(ReactInstanceManagerBuilder.java:319)
        at com.facebook.react.ReactNativeHost.createReactInstanceManager(ReactNativeHost.java:95)
        at com.facebook.react.ReactNativeHost.getReactInstanceManager(ReactNativeHost.java:42)
        at com.awesomeproject.MainApplication.onCreate(MainApplication.java:47)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1208)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6986)
        at android.app.ActivityThread.access$1700(ActivityThread.java:274)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2093)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:233)
        at android.app.ActivityThread.main(ActivityThread.java:8010)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)

About this issue

  • Original URL
  • State: closed
  • Created 2 years ago
  • Reactions: 6
  • Comments: 18 (3 by maintainers)

Most upvoted comments

I think I found the issue. It got broken because of this commit:

https://github.com/facebook/react-native/commit/91adb761cf1583598d4d63ce879fd7e0f4ae793c

so in order for this to work you need to name your build variants including a word “release”. What I tried to do then is this:

rename build variant

stagingRelease {
            initWith release
            signingConfig signingConfigs.debug
            applicationIdSuffix ".staging"
            matchingFallbacks =  ['release']
}

rename settings to align with the new name:

    if (enableHermes) {
        def hermesPath = "../../node_modules/hermes-engine/android/";
        debugImplementation files(hermesPath + "hermes-debug.aar")
        stagingReleaseImplementation files(hermesPath + "hermes-release.aar")
        releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
        implementation jscFlavor
    }

and

project.ext.react = [
    enableHermes: true,  // clean and rebuild if changing
    bundleInStagingRelease: true, //include JS bundle in staging builds
    devDisabledInStagingRelease: true //disable DEV mode in staging builds
]

But I still think this is breaking change and probably not the right way to do it. This requires us to change not only name of build variants but also all references to it like CI scripts.

But I still think this is breaking change and probably not the right way to do it. This requires us to change not only name of build variants but also all references to it like CI scripts.

You could specify hermesFlagsForVariant and deleteDebugFilesForVariant to customize variant configs.

That gives you full control over variant behavior + you don’t need to rename it to stagingRelease anymore.

Thanks ! Got it resolved by adding these lines in android/app/build.gradle (my variant name’s beta) :

project.ext.react = [
    bundleInBeta: true,
    devDisabledInBeta: true,
    hermesFlagsForVariant: {
        def v -> v.name.toLowerCase().contains('release') || v.name.toLowerCase().contains('beta') ? ['-w'] : []
    },
    deleteDebugFilesForVariant: {
        def v -> v.name.toLowerCase().contains('release') || v.name.toLowerCase().contains('beta')
    },
]

as mentioned in https://github.com/facebook/react-native/pull/32281

But I still think this is breaking change and probably not the right way to do it. This requires us to change not only name of build variants but also all references to it like CI scripts.

You could specify hermesFlagsForVariant and deleteDebugFilesForVariant to customize variant configs.

That gives you full control over variant behavior + you don’t need to rename it to stagingRelease anymore.

Thank you so much for reporting this. We had the same issue and we probably never would have found the solution without this report. ❤️

@LadislavBohm i edited my builld.gradle below. And here goes my error:

2022-02-26 11:06:28.641 1657-1657/com.app.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.app.app, PID: 1657
    java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libjscexecutor.so caused by: dlopen failed: library "libjsc.so" not found: needed by /data/app/~~R3RmzM0PSs5cjsK8SfkpXQ==/com.app.app-NG27bssWS3HWJTIklRgEoQ==/lib/arm64/libjscexecutor.so in namespace classloader-namespace result: 0
        at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:1098)
        at com.facebook.soloader.SoLoader.loadLibraryBySoNameImpl(SoLoader.java:914)
        at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:826)
    ...

Is this documented somewhere or can you please show an example how to configure staging with adding Release suffix to work in release builds? This is a breaking change from 0.66.x as it was working and we never had to specify those so IMO it’s worth mentioning somewhere, thank you.