skip to Main Content

I am working on an old React Native app and want to upgrade RN version from version ^0.64.2 to 0.70.1. After using command npx react-native upgrade, there are changes in number version of dependencies. I also edit build.gradle in andriodapp folder as instructed in this document:

project.ext.react = [
    enableHermes: true  // clean and rebuild if changing
]
...
dependencies {
    ...
    if (enableHermes) {
        def hermesPath = "../../node_modules/hermes-engine/android/";
        debugImplementation files(hermesPath + "hermes-debug.aar")
        releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
        implementation jscFlavor
    }
    ...
}

After that, I run command ./gradlew clean in android folder and run npx react-native run-android. Then this error shows up:

BUILD FAILED in 9s

error Failed to install the app. Make sure you have the Android development environment set up: https://reactnative.dev/docs/environment-setup.
Error: Command failed: gradlew.bat app:installDebug -PreactNativeDevServerPort=8081

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:checkDebugAarMetadata'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Failed to transform hermes-debug.aar to match attributes {artifactType=android-aar-metadata}.
      > Execution failed for JetifyTransform: D:{ProjectFolder}node_moduleshermes-engineandroidhermes-debug.aar.
         > Transform's input file does not exist: D:{ProjectFolder}node_moduleshermes-engineandroidhermes-debug.aar. (See https://issuetracker.google.com/issues/158753935)

After taking a while, I also found out that there is no hermes-engine folder inside node_modules folder but still have no clue what to do.

Here is my package.json:

{
  "name": "MyApp",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "start": "react-native start",
    "test": "jest",
    "lint": "eslint ."
  },
  "dependencies": {
    "@notifee/react-native": "^3.0.4",
    "@react-native-async-storage/async-storage": "^1.17.10",
    "@react-native-community/art": "^1.2.0",
    "@react-native-community/datetimepicker": "^3.5.2",
    "@react-native-firebase/app": "^12.9.0",
    "@react-native-firebase/messaging": "^12.9.0",
    "@react-navigation/material-top-tabs": "^6.2.1",
    "@react-navigation/native": "^6.0.1",
    "@react-navigation/stack": "^6.2.1",
    "axios": "^0.24.0",
    "fbjs": "^3.0.4",
    "jest": "^26.6.3",
    "jwt-decode": "^3.1.2",
    "moment": "^2.29.3",
    "moment-timezone": "^0.5.34",
    "prop-types": "^15.8.1",
    "react": "18.1.0",
    "react-native": "0.70.1",
    "react-native-biometrics": "^2.1.4",
    "react-native-camera": "^3.35.0",
    "react-native-chart-kit": "^6.12.0",
    "react-native-elements": "^2.0.4",
    "react-native-file-viewer": "^2.1.1",
    "react-native-fs": "^2.20.0",
    "react-native-gesture-handler": "^1.10.3",
    "react-native-image-crop-picker": "^0.32.2",
    "react-native-modal": "^11.5.6",
    "react-native-pager-view": "^5.4.24",
    "react-native-pdf": "^6.2.0",
    "react-native-picker-select": "^8.0.0",
    "react-native-pie-chart": "^2.0.2",
    "react-native-render-html": "^6.3.4",
    "react-native-safe-area-context": "^3.0.2",
    "react-native-screens": "^3.13.1",
    "react-native-simple-toast": "^1.1.2",
    "react-native-svg": "^12.1.1",
    "react-native-swipe-list-view": "^3.2.9",
    "react-native-tab-view": "^3.1.1",
    "react-native-vector-icons": "^7.0.0",
    "react-navigation": "^4.4.0",
    "react-query": "^3.34.2",
    "react-redux": "^7.2.0",
    "redux": "^4.0.5",
    "redux-devtools-extension": "^2.13.8",
    "redux-thunk": "^2.3.0",
    "toggle-switch-react-native": "^3.3.0"
  },
  "devDependencies": {
    "@react-native-community/eslint-config": "^2.0.0",
    "babel-plugin-root-import": "^6.5.0",
    "eslint": "^7.14.0",
    "react-test-renderer": "^17.0.1"
  },
  "jest": {
    "preset": "react-native"
  }
}

Update: The error still occur after I edited package.json and use npm install to add hermes-engine. Here are the errors:

npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR!
npm ERR! While resolving: [email protected]
npm ERR! Found: [email protected]
npm ERR! node_modules/react
npm ERR!   react@"18.1.0" from the root project
npm ERR!   peer react@"*" from @jsamr/[email protected]
npm ERR!   node_modules/@jsamr/react-native-li
npm ERR!     @jsamr/react-native-li@"^2.3.0" from [email protected]
npm ERR!     node_modules/react-native-render-html
npm ERR!       react-native-render-html@"^6.3.4" from the root project
npm ERR!   27 more (@react-native-community/art, ...)
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^16.8.0 || ^17.0.0" from [email protected]
npm ERR! node_modules/react-query
npm ERR!   react-query@"^3.34.2" from the root project
npm ERR!
npm ERR! Conflicting peer dependency: [email protected]
npm ERR! node_modules/react
npm ERR!   peer react@"^16.8.0 || ^17.0.0" from [email protected]
npm ERR!   node_modules/react-query
npm ERR!     react-query@"^3.34.2" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

4

Answers


  1. Try to add this to your package.json and npm install again with –legacy-peer-deps option:

    "dependencies": {
        "hermes-engine": "^0.11.0",
      },
    
    Login or Signup to reply.
  2. I am also interested about this issue, the same thing is happening for me, I already checked the Upgrade Helper, and I am upgrading from 0.68.5 to 0.70.1.

    I still haven’t turned on the NEW_ARCHITECTURE flag.

    Installing hermes-engine package seems like not a good solution, since the upgrade steps doesn’t mention that it should be done.

    Login or Signup to reply.
  3. I’m also upgrading RN version to 0.70.1, from 0.69.x you have some changes to do in app/build.gradle about hermes.

    ...
    
    if (enableHermes) {
        implementation("com.facebook.react:hermes-engine:+") {
            exclude group: 'com.facebook.fbjni'
        }
    } else {
        implementation jscFlavor
    }
    
    ...
    

    Source: Bundled Hermes Documentation

    Login or Signup to reply.
  4. I went through the same error and followed the solution suggested by @fernando-garcía, but to my case it was not enough.
    Indeed, I was getting the error:

    TypeError: Cannot read property 'isBatchingLegacy' of undefined, js engine: hermes
    

    The problem is definitely due to hermes, but I had to tune some other things to properly update my react-native application and let it work with react-native 0.70.0.

    Here the steps I had to do to properly update my React-Native application in order to solve the problem:

    1. Add the following snippets in android/app/build.gradle:
    dependencies {
        ...
        if (enableHermes) {
            //noinspection GradleDynamicVersion
            implementation("com.facebook.react:hermes-engine:+") {
                exclude group:'com.facebook.fbjni'
            }
        }
    }
    
    if (isNewArchitectureEnabled()) {
        // If new architecture is enabled, we let you build RN from source
        // Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
        // This will be applied to all the imported transtitive dependency.
        configurations.all {
            resolutionStrategy.dependencySubstitution {
                substitute(module("com.facebook.react:react-native"))
                        .using(project(":ReactAndroid"))
                        .because("On New Architecture we're building React Native from source")
                substitute(module("com.facebook.react:hermes-engine"))
                        .using(project(":ReactAndroid:hermes-engine"))
                        .because("On New Architecture we're building Hermes from source")
            }
        }
    }
    
    1. add the following inside android/settings.gradle:
    if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true") {
        include(":ReactAndroid")
        project(":ReactAndroid").projectDir = file('../node_modules/react-native/ReactAndroid')
        include(":ReactAndroid:hermes-engine")
        project(":ReactAndroid:hermes-engine").projectDir = file('../node_modules/react-native/ReactAndroid/hermes-engine')
    }
    
    1. update the react dependency inside your package.json (I had 17.0.2 and I had to update to 18.1.10):
    dependencies {
        ...
        "react": "18.1.0"
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search