SDK 44 beta: expo prebuild "Config syncing" takes forever with 100% node CPU usage

Platform: Android
Workflow: Managed
expo-cli: 4.13.0
eas-cli: eas-cli/0.40.0 darwin-arm64 node-v16.13.1
eas-cli-local-build-plugin: 0.0.54
Node: 16.13.1
expo: 44.0.0-beta.1

I upgraded one app to SDK 44 beta. I then tried building a custom dev client locally using:

eas build --profile=development --platform=android --local

I left it to run while doing something else and came back later to check on it, only to find that it seemed to be repeating the “Config syncing” part of the prebuild process over and over, so I killed it. I noticed node (version 16) using 100% CPU, so I tried with node version 12 to see if it made a difference. It was still taking a long time, so I tried a build on the build servers. That seems to be having the same problems. I then tried running expo prebuild and killed it after about 15 minutes.

Local build log
✔ Linked to project @wodin/fizzy-app
✔ Using remote Android credentials (Expo server)
✔ Using Keystore from configuration: Build Credentials e8iHXCaEW8 (default)
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
[...]
ANDROID_NDK_HOME environment variable was not specified, continuing build without NDK
[SETUP_WORKINGDIR] Preparing workingdir /var/folders/kj/rwm7htb51n18wlz4pbljb75w0000gn/T/eas-build-local-nodejs/7a9cb0a1-0cbc-4541-96de-9f09502e12ec
[START_BUILD] Starting build
  "job": {
    "type": "managed",
    "platform": "android",
    "projectRootDirectory": ".",
    "projectArchive": {
      "type": "PATH",
      "path": "/var/folders/kj/rwm7htb51n18wlz4pbljb75w0000gn/T/eas-cli-nodejs/020ad138-b127-4941-9996-1fe7df6eb50b.tar.gz"
    },
    "builderEnvironment": {},
    "cache": {
      "disabled": false,
      "customPaths": [],
      "cacheDefaultPaths": true,
      "clear": false
    },
    "updates": {},
    "developmentClient": true,
    "buildType": "apk",
    "username": "wodin"
  }
[INSTALL_DEPENDENCIES] Running yarn in the root dir of your repository
[INSTALL_DEPENDENCIES] yarn install v1.22.17
[INSTALL_DEPENDENCIES] [1/4] Resolving packages...
[INSTALL_DEPENDENCIES] [2/4] Fetching packages...
[INSTALL_DEPENDENCIES] [3/4] Linking dependencies...
[INSTALL_DEPENDENCIES] warning "react-native > react-native-codegen > jscodeshift@0.11.0" has unmet peer dependency "@babel/preset-env@^7.1.6".
[INSTALL_DEPENDENCIES] warning " > react-native-paper@4.11.1" has unmet peer dependency "react-native-vector-icons@*".
[INSTALL_DEPENDENCIES] [4/4] Building fresh packages...
[INSTALL_DEPENDENCIES] Done in 5.72s.
[READ_APP_CONFIG] Using app configuration:
[READ_APP_CONFIG] {
  "name": "Fizzy App",
  "slug": "fizzy-app",
  "owner": "wodin",
  "privacy": "unlisted",
  "version": "1.2.1",
  "orientation": "portrait",
  "icon": "./assets/icon.png",
  "splash": {
    "image": "./assets/simon-buchou-5Qd3Gj49gzk-unsplash.png",
    "resizeMode": "contain",
    "backgroundColor": "#131412"
  },
  "updates": {
    "checkAutomatically": "ON_ERROR_RECOVERY",
    "fallbackToCacheTimeout": 0
  },
  "assetBundlePatterns": [
    "assets/**/*"
  ],
  "ios": {
    "supportsTablet": true,
    "bundleIdentifier": "wodin.acted.splice.gadget.fizzy-app",
    "buildNumber": "1.2.1"
  },
  "android": {
    "adaptiveIcon": {
      "foregroundImage": "./assets/adaptive-icon.png",
      "backgroundColor": "#FFFFFF"
    },
    "package": "wodin.acted.splice.gadget.fizzy_app",
    "versionCode": 9
  },
  "web": {
    "favicon": "./assets/favicon.png"
  },
  "sdkVersion": "44.0.0",
  "platforms": [
    "ios",
    "android",
    "web"
  ],
  "currentFullName": "@wodin/fizzy-app",
  "originalFullName": "@wodin/fizzy-app"
}
[PREBUILD] - Creating native project directories (./ios and ./android) and updating .gitignore
[PREBUILD] ✔ Created native project
[PREBUILD] - Adding Metro bundler config
[PREBUILD] ✔ Added Metro config
[PREBUILD] - Updating your package.json scripts, dependencies, and main file
[PREBUILD] ✔ Updated package.json and added index.js entry point for iOS and Android
[PREBUILD] [18:05:31] › Removed "main": "node_modules/expo/AppEntry.js" from package.json because we recommend using index.js as main instead
[PREBUILD]
[PREBUILD] [18:05:31] 🧶 Using Yarn to install packages. Pass --npm to use npm instead.
[PREBUILD] - Installing JavaScript dependencies
[PREBUILD] ✔ Installed JavaScript dependencies 3929ms
[PREBUILD] - Config syncing
[PREBUILD] Using node to generate images. This is much slower than using native packages.
[PREBUILD] › Optionally you can stop the process and try again after successfully running `npm install -g sharp-cli`.
[PREBUILD] - Config syncing
[PREBUILD] Using node to generate images. This is much slower than using native packages.
[PREBUILD] › Optionally you can stop the process and try again after successfully running `npm install -g sharp-cli`.
[PREBUILD] - Config syncing
^C[ABORT] Received termination signal.
[ABORT] Received termination signal.
[PREBUILD]
Error: /Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/expo-cli/bin/expo.js exited with signal: SIGINT
    at ChildProcess.completionListener (/Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/@expo/spawn-async/build/spawnAsync.js:51:23)
    at Object.onceWrapper (node:events:510:26)
    at ChildProcess.emit (node:events:390:28)
    at maybeClose (node:internal/child_process:1064:16)
    at Socket. (node:internal/child_process:450:11)
    at Socket.emit (node:events:390:28)
    at Pipe. (node:net:687:12)
    ...
    at Object.spawnAsync [as default] (/Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/@expo/spawn-async/build/spawnAsync.js:17:21)
    at Object.spawn [as default] (/Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/@expo/turtle-spawn/dist/index.js:17:42)
    at LocalExpoCliEjectProvider.runEject (/Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/eas-cli-local-build-plugin/dist/eject.js:21:37)
    at ejectProject (/Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/@expo/build-tools/dist/builders/android.js:76:29)
    at /Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/@expo/build-tools/dist/builders/android.js:21:19
    at BuildContext.runBuildPhase (/Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/@expo/build-tools/dist/context.js:44:34)
    at Object.androidBuilder (/Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/@expo/build-tools/dist/builders/android.js:20:19)
    at async Object.buildAndroidAsync (/Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/eas-cli-local-build-plugin/dist/android.js:43:27)
    at async Object.buildAsync (/Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/eas-cli-local-build-plugin/dist/build.js:23:32)
    at async main (/Users/michael/.npm/_npx/cb741f5d316d434c/node_modules/eas-cli-local-build-plugin/dist/main.js:16:9)

Build failed

EDIT: I’ve just re-read the blog post and noticed the following. Not sure if the above problem is a result of this:

Known regressions

The expo-dev-client config plugin still needs to be updated to work in SDK 44 projects. You can configure it manually in your bare project for now.

After upgrading to a later beta and then the final SDK 44 release this is no longer a problem.