cordova-android: gradlew: 'sh' is not recognized as an internal or external command,

Bug Report

Problem

When I run the following command in PowerShell on Windows 10, I get an error:

cordova build android --verbose

=> 
...
Running command: C:\MyPath\platforms\android\gradlew cdvBuildDebug -b C:\MyPath\platforms\android\build.gradle
'sh' is not recognized as an internal or external command,
operable program or batch file.
Command finished with error code 1: C:\MyPath\platforms\android\gradlew cdvBuildDebug,-b,C:\MyPath\platforms\android\build.gradle
C:\MyPath\platforms\android\gradlew: Command failed with exit code 1 Error output:
'sh' is not recognized as an internal or external command,
operable program or batch file.
Error: C:\MyPath\platforms\android\gradlew: Command failed with exit code 1 Error output:
'sh' is not recognized as an internal or external command,
operable program or batch file.
    at ChildProcess.whenDone (C:\MyPath\node_modules\cordova-common\src\superspawn.js:135:23)
    at ChildProcess.emit (events.js:315:20)
    at ChildProcess.cp.emit (C:\MyPath\node_modules\cross-spawn\lib\enoent.js:34:29)
    at maybeClose (internal/child_process.js:1021:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:286:5)

What is expected to happen?

I am able to run this command on Ubuntu (non-WSL) and it successfully finds the correct version of gradlew. However, in Windows, I think it should find gradlew.bat.

What does actually happen?

It runs gradlew on Windows, rather than gradlew.bat

Information

check_reqs.js locates Android Studio and then gradle in this location:

C:\Program Files\Android\Android Studio\gradle\gradle-4.6\bin\gradle

However, ProjectBuilder.js shows this:

build (opts) {
    var wrapper = path.join(this.root, 'gradlew');
    ...

It looks to me like there is no attempt to append .bat to the filename if it’s on Windows. Maybe execa is supposed to append it, but it doesn’t seem to. If I hack this to ‘gradlew.bat’, it builds successfully.

Command or Code

cordova build android --verbose

Environment, Platform, Device

Windows 10

Version information

Cordova 9.0.0 It seems to find Android Studio 3.2.1, although I’m not actually using it.

Checklist

  • I searched for existing GitHub issues
  • I updated all Cordova tooling to most recent version
  • I included all the necessary information above

About this issue

  • Original URL
  • State: open
  • Created 4 years ago
  • Comments: 18 (4 by maintainers)

Most upvoted comments

Found this issue thread while investigating the same " ‘sh’ is not recognized" occurring on Windows 10 after upgrading to cordova-android.

All the above didn’t resolve the issue, and I was at the point of installing the WSL.

And then… it just worked. And the next time… it didn’t.

The difference? I’d opened the emulator, and then closed it.

So it seems, for me at least, when the Android Studio emulator isn’t running, the ‘sh’ error occurs.

Hope that helps anyone else afflicted with this, and maybe @breautek et al root out the cause or at least catch and issue a more meaningful message

I have confirmed “sh” error caused by when emulator not start

Faced this issue on Windows when using device, but it is disconnected, so cordova-android tried to running emulator.

It uses emulator and run that command when adb devices returns empty list, so you can run adb devices and ensure that here is your device (or pre-runned emulator?)

Problem is in apkanalyzer which is a file in

C:\Users\<username>\AppData\Local\Android\Sdk\tools\bin

and it is shell script, not cmd…

I think it is a bug in Android SDK. More info: https://stackoverflow.com/questions/47081004/apkanalyzer-is-not-recognized-as-an-internal-or-external-command But if they aren’t fixing it, it should be work-arounded in cordova-android…

Same result here. With Android Studio open but emulator not running, I get the sh error. Open an emulator and re-build, and the error goes away.

image

An android emulator has to be running ! phew 6hours later it’s working ❤️

It’s there, I can execute bat files just fine, but the script never tries to.