Cordova无法创建AndroidManifest.xml文件。

37

我在使用 Cordova 和 AndroidStudio 创建 Android/iOS 应用程序。一切都很顺利,直到昨天我将 Cordova 更新到 8 版本。我也更新了 Node 到最新版本。当我创建 Cordova 项目并添加 Android 平台时,它会产生完全不同的目录结构。在项目的平台目录 D:\testApp1\platforms\android 中,我无法看到assetsressrc 文件夹。更重要的是,上述目录缺少 AndroidManifest.xml,这导致无法成功添加admob 插件。

以下是添加插件时出现的错误:

安装'cordova-plugin-admobpro'失败:错误:ENOENT:没有该文件或目录,打开'D:\Projects\testApp1\platforms\android\AndroidManifest.xml' at Object.fs.openSync (fs.js:646:18) at Object.fs.readFileSync (fs.js:551:33) at Object.parseElementtreeSync (D:\Projects\testApp1\platforms\android\cordova\node_modules\cordova-common\src\util\xml-helpers.js:180:27) at new AndroidManifest (D:\Projects\testApp1\platforms\android\cordova\lib\AndroidManifest.js:29:20) at AndroidProject.getPackageName (D:\Projects\testApp1\platforms\android\cordova\lib\AndroidProject.js:99:12) at Api.addPlugin (D:\Projects\testApp1\platforms\android\cordova\Api.js:223:57) at handleInstall (C:\Users\Rao\AppData\Roaming\npm\node_modules\cordova\node_modules\cordova-lib\src\plugman\install.js:594:10) at C:\Users\Rao\AppData\Roaming\npm\node_modules\cordova\node_modules\cordova-lib\src\plugman\install.js:357:28 at _fulfilled (C:\Users\Rao\AppData\Roaming\npm\node_modules\cordova\node_modules\cordova-lib\node_modules\q\q.js:787:54)"能有人帮忙吗?" 在C:\Users\Rao\AppData\Roaming\npm\node_modules\cordova\node_modules\cordova-lib\node_modules\q\q.js的self.promiseDispatch.done处。


我也遇到了缺少 AndroidManifest.xml 文件的问题。虽然这个变更很简单,但是会带来大量涉及下游的改动,需要花费无法计算的时间。我确信这种兼容性的破坏是值得的。另外,我还注意到在 IOS 上添加插件使用描述到 *-Info.plist 的 edit-config 支持出现了问题。在暂时期间使用 config-file 标签。不幸的是,回退到 cordova 7.1.0 在所有相关插件都支持该变更之前可以解决问题。 - jmelvin
9个回答

45

Cordova CLI v8.0 默认使用 cordova-android@7.0.0

由于大多数 Cordova 插件尚不支持 cordova-android@7.0.0,您可以指定版本使用旧版本:

cordova platform add android@6.4.0

或者,如果您感觉舒适使用 cordova-android@7.0.0,您也可以等待 cordova-plugi-admobpro 更新以支持 cordova-android@7.0.0,这将很快到来。


2
救了我的一天!对我有用。 - Sandi Laufenberg-Deku
2
那刚刚把一切都搞砸了... :S - fabriek-huis
即使现在......当你发现这种情况时,只需继续尝试使用不同的版本进行构建,你就能让它正常工作。版本可能会改变,但解决方案本身在其核心仍然是有效的并且可行的。 - Indy-Jones

35

最终编辑:

cordova-android 7.1.4已经发布,它应该修复了大部分此类问题。

编辑:

由于人们不断给予回答点赞,我将提供更多关于问题的详细信息。

问题并不是插件在AndroidManifest.xml或者config.xml中的编写。虽然位置已经改变,插件也应该更新路径,但这不是强制性的,Cordova会处理新路径。 问题在于一些插件使用source-file标签来处理非源代码文件(例如,在复制图像时使用它而不是使用resource-file标签)。这会创建一个res文件夹(或lib)使得Cordova混淆,并认为这是旧版本Eclipse项目,而实际上它是一个Android Studio项目,因此搜索文件时会去旧的位置而不是查找新的位置。

这个问题在cordova-android中已经被修补,并将在下一个版本中解决。解决方法是查找使用source-file标签的插件,并将其更新为使用resource-file标签。

旧回答:

现在它在app/src/main/AndroidManifest.xml中。

如果插件正在写入该文件,则应更新为写入正确的位置。

阅读cordova-android 7.0.0版本的发布博客文章


3
如果你的项目根目录下有一个名为'res'的文件夹,即使在plugin.xml中更新了路径(因为Eclipse项目检测),你仍然会遇到这个错误。 - Ryan Williams
@RyanWilliams如果你使用的是Cordova CLI 8,你不需要更改plugin.xml内部的路径,只需要更改在钩子或其他编写文件中的路径即可。任何创建res文件夹的东西都应该被修改。正如你所说,Cordova检查该文件夹以了解它是否为Android Studio项目或Eclipse项目,因此如果它是Android Studio项目但找到res文件夹,则会变得疯狂并产生奇怪的问题。 - jcesarmobile
这是 Cordova 中的一种错误。当插件使用 source-file 标签添加非源文件(例如图像)时,它们会被复制到根目录并创建一个 res 文件夹。该文件夹会使 Cordova 产生问题,并开始在旧路径中寻找文件,导致其他插件无法安装,不是当前存在问题的插件,而是下一个尝试安装的插件。 - jcesarmobile
那是用来写文件的,而不是用来创建文件的。文件已经改变位置了,但它仍然存在。你不应该担心这个问题。 - jcesarmobile
1
在 plugin.xml 文件中 - jcesarmobile
显示剩余6条评论

22
在cordova项目的config.xml文件中,在xml标签<platform name="android">下添加以下标签:
<resource-file src="platforms/android/app/src/main/AndroidManifest.xml" target="AndroidManifest.xml" />

3

对我来说,从7.0降级到6.4解决了问题。

cordova platform rm android
cordova platform add android@6.4
cordova build

2
我只是通过将AndroidManifest.xml从 "platforms\android\app\src\main\" 复制到 "platforms\android\" 来修复错误。

5
不,不要那样做。这会消除错误,但你并没有解决任何问题。 - jcesarmobile
@jcesarmobile:如果您能指导我解决这个问题就太好了。https://stackoverflow.com/questions/50017635/google-plus-plugin-and-push-notification-plugin-conflict-on-phonegap-build-buil - sqlchild

1
这对我很有帮助。
package.json 中添加 cordova-android 版本。
 "cordova-android": "~6.3.0"

然后添加平台。
cordova platform add android

0
问题似乎出现在您尝试同时构建发布和在本地运行应用程序时。我停止了本地主机上的应用程序,然后进行发布构建,问题得到解决。

0

我的问题是一个自定义插件在 platforms\android 中创建了 libs 文件夹。这使得 Cordova 认为我的项目是一个 Eclipse 项目,因此它在旧位置寻找 AndroidManifest。

如果您升级到 Cordova Android +7.0.0,请确保 platforms\android 不包含以下项目:

  • AndroidManifest.xml
  • libs
  • res

这个 链接 很有帮助。


0
  1. 首先确保插件支持cordova android 7.0.0+。
  2. 在platforms/android根目录中删除所有这些文件夹或文件:['AndroidManifest.xml','libs','res']。

Cordova使用这些文件来确定您的项目是否为eclipse项目。如果它们存在,则您的项目将被视为具有旧路径结构的eclipse项目。某些插件可能会在您的android文件夹中创建这些文件/文件夹。


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