ionic cordova build android: 错误:spawn EACCES

5
我看到很多关于通过chmod(+x或755)更改gradle的执行属性的参考资料...但是这些都似乎没有任何影响。即使我运行以下命令,我仍然会收到消息: sudo ionic cordova build android
我的设置如下:
唯一我能想到的可能是由于插件钩子中的某些内容没有执行属性...

Plugins - no custom hooks folder entries

sudo ionic cordova build android

....
> cordova build android
ANDROID_HOME=/Users/jgf/Library/Android/sdk
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
Subproject Path: CordovaLib
Error: spawn EACCES

[ERROR] An error occurred while running cordova build android (exit code 1).

这个错误最让人烦恼的事情之一就是它没有给出足够的细节,并且隐藏了问题的根本原因...我尝试添加--verbose--release标志,但在解决问题方面没有任何改变。

运行Mac OS X High Sierra 10.13.2

ionic信息

cli packages: (/Users/jgf/.nvm/versions/node/v8.9.3/lib/node_modules)

    @ionic/cli-utils  : 1.18.0
    ionic (Ionic CLI) : 3.18.0

global packages:

    cordova (Cordova CLI) : 7.0.1

local packages:

    @ionic/app-scripts : 3.1.5
    Cordova Platforms  : android 6.4.0 browser 4.1.0 ios 4.4.0
    Ionic Framework    : ionic-angular 3.9.2

System:

    Android SDK Tools : 26.1.1
    Node              : v8.9.3
    npm               : 5.6.0
    OS                : macOS High Sierra
    Xcode             : Xcode 9.2 Build version 9C40b

Environment Variables:

    ANDROID_HOME : /Users/jgf/Library/Android/sdk

Misc:

    backend : legacy

cordova平台版本

Installed platforms:
  android 6.4.0
  browser 4.1.0
  ios 4.4.0
Available platforms:
  blackberry10 ~3.8.0 (deprecated)
  osx ~4.0.1
  webos ~3.7.0

cordova build android --verbose

No scripts found for hook "before_build".
No scripts found for hook "before_prepare".
Checking config.xml and package.json for saved platforms that haven't been added to the project
Config.xml and package.json platforms are the same. No pkg.json modification.
Package.json and config.xml platforms are different. Updating config.xml with most current list of platforms.
PlatformApi successfully found for platform android
Checking config.xml for saved plugins that haven't been added to the project
Checking for any plugins added to the project that have not been installed in android platform
No differences found between plugins added to project and installed in android platform. Continuing...
Generating platform-specific config.xml from defaults for android at /opt/IonicProjects/aews_official_rc_1.2.09/platforms/android/res/xml/config.xml
Merging project's config.xml into platform-specific android config.xml
Merging and updating files from [www, platforms/android/platform_www] to platforms/android/assets/www
Wrote out android application name "ET-Mobile" to /opt/IonicProjects/aews_official_rc_1.2.09/platforms/android/res/values/strings.xml
android-versionCode not found in config.xml. Generating a code based on version in config.xml (0.0.1): 1
Wrote out Android package name "com.extratechnology.etmobile" to /opt/IonicProjects/aews_official_rc_1.2.09/platforms/android/src/com/extratechnology/etmobile/MainActivity.java
Updating icons at platforms/android/res
Updating splash screens at platforms/android/res
This app does not have additional resource files defined
Prepared android project successfully
No scripts found for hook "after_prepare".
No scripts found for hook "before_compile".
ANDROID_HOME=/Users/jgf/Library/Android/sdk
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
Subproject Path: CordovaLib
Running command: /opt/IonicProjects/aews_official_rc_1.2.09/platforms/android/gradlew cdvBuildDebug -b /opt/IonicProjects/aews_official_rc_1.2.09/platforms/android/build.gradle -Dorg.gradle.daemon=true -Dorg.gradle.jvmargs=-Xmx2048m -Pandroid.useDeprecatedNdk=true
Error: spawn EACCES

build.gradle in platorms/android gradlew in platforns/android

我已经拥有Android Studio 3.0.1 Android Studio 3.0.1。还有SDK Platforms (SDK Location shown for .profile)SDK ToolsSDK Update SitesPath to Gradle inside Android Studio package contents。我的.profile(基于this)包含:
export JAVA_HOME=$(/usr/libexec/java_home)
export ANDROID_HOME=~/Library/Android/sdk
#ANDROID_HOME=/opt/android-sdk
export NVM_DIR="$HOME/.nvm"
export PATH=${JAVA_HOME}/bin:${PATH}
export PATH=${ANDROID_HOME}/platform-tools:${PATH}
export PATH=${ANDROID_HOME}/tools:${PATH}
export PATH=${ANDROID_HOME}/tools/bin:${PATH}
#${ANDROID_HOME}/tools/bin:${HOME}/bin:.
export GRADLE_HOME="/Applications/Android Studio.app/Contents/gradle/gradle-4.1"
export PATH=${PATH}:${GRADLE_HOME}/bin

在这一点上,我唯一的想法是... Android Studio 中的一个空格。这可能会影响路径,所以我倾向于将其复制出来。 which gradle 可以得到正确的路径...
/Applications/Android Studio.app/Contents/gradle/gradle-4.1/bin/gradle

(之前有一个旧版的酿造软件,我已经卸载了,但是指向Android Studio版本的路径似乎没有任何区别)。

最后一点注释...回到过去,当android命令可以用于sdk和apk管理器功能时,你需要做类似接受许可条款之类的事情。 我是否也错过了这样的东西? 只是,我正在为选项苦苦思索。


在SurajRao的建议下,运行cordova build android --verbose后,我现在已经解决了最初的问题。
通过以下步骤完成此操作:
cd <project folder>/platform/android/
chmod +x build.gradle 
chmod +x gradlew

现在它产生:

Error: /opt/IonicProjects/aews_official_rc_1.2.09/platforms/android/gradlew: Command failed with exit code 1 Error output:
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':CordovaLib'.
> Could not resolve all files for configuration ':CordovaLib:classpath'.
   > Could not resolve org.bouncycastle:bcprov-jdk15on:1.48.
     Required by:
         project :CordovaLib > com.android.tools.build:gradle:2.2.3 > com.android.tools.build:gradle-core:2.2.3 > com.android.tools.build:builder:2.2.3
         project :CordovaLib > com.android.tools.build:gradle:2.2.3 > com.android.tools.build:gradle-core:2.2.3 > com.android.tools.build:builder:2.2.3 > com.android.tools:sdk-common:25.2.3
         project :CordovaLib > com.android.tools.build:gradle:2.2.3 > com.android.tools.build:gradle-core:2.2.3 > com.android.tools.build:builder:2.2.3 > org.bouncycastle:bcpkix-jdk15on:1.48
      > Could not resolve org.bouncycastle:bcprov-jdk15on:1.48.
         > Could not get resource 'https://jcenter.bintray.com/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.pom'.
            > Could not HEAD 'https://jcenter.bintray.com/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.pom'. Received status code 502 from server: Bad Gateway

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug optionto get more log output.

* Get more help at https://help.gradle.org

根据这里的建议,我会尝试运行gradle init... 看起来问题已经解决了。


你的cordova-android版本是多少?我可以通过更改gradle的权限来解决它,就像我在这里回答的那样(https://stackoverflow.com/a/47350972/4826457)。但如果那行不通,你可以尝试将cordova-android平台更新到6.4.0,因为该错误已在该版本中得到解决。https://issues.apache.org/jira/browse/CB-13495 - Suraj Rao
1
你尝试过在命令中不加 ionic 的情况下运行 cordova build android --verbose 吗?否则,最好在 GitHub 上提出问题。 - Suraj Rao
这很奇怪。我建议提出一个问题,因为它应该被修复了。 - Suraj Rao
将chmod +x添加到gradlew似乎也使命令进展更快。感谢@SurajRao的帮助。 - JGFMK
@SurajRao - 如果你想回答这个问题,可以说使用 cordova build android --verbose 命令,并在 <project folder>/platform/android/ 中的 build.gradle 和 gradlew 上执行 chmod +x 命令。由于你的评论帮助我发现了根本原因,所以我很乐意给你奖励积分作为答案。这样问题看起来也得到了解决。 - JGFMK
显示剩余5条评论
2个回答

9

我发现在cordova的构建过程中,直接使用--verbose标志与cordova命令一起使用,而不是使用ionic命令,可以提供调试信息。

 cordova build android --verbose

编辑 -> 我已向Ionic 提出了一个Github请求,关于verbose,并且它应该在Ionic Cli 4中得到修复。

根据你的日志,

Running command: /opt/IonicProjects/aews_official_rc_1.2.09/platforms/android/gradlew cdvBuildDebug -b /opt/IonicProjects/aews_official_rc_1.2.09/platforms/android/build.gradle -Dorg.gradle.daemon=true -Dorg.gradle.jvmargs=-Xmx2048m -Pandroid.useDeprecatedNdk=true

这是你的问题。

你需要给予可执行权限给

/opt/IonicProjects/aews_official_rc_1.2.09/platforms/android/build.gradle

并且

/opt/IonicProjects/aews_official_rc_1.2.09/platforms/android/gradlew 

使用 chmod +x 命令


0
如果您正在使用Ubuntu,则需要在终端中添加sudo cordova build android --verbose。这基本上是一个权限问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接