【问题标题】:Add android:name="something" to AndroidManifest.xml "application" tag from Cordova plugin.xml从 Cordova plugin.xml 将 android:name="something" 添加到 AndroidManifest.xml "application" 标记
【发布时间】:2014-12-18 15:28:23
【问题描述】:

我决定打开新问题,因为已经发布的问题都没有一个好的答案。

我需要更新 AndroidManifest.xml “来自 plugin.xml”,以便 <application> 标记具有以下属性,以及它已经具有的属性:

android:name="mypackage"

怎么做?

谢谢

【问题讨论】:

  • 我不太明白你想要什么
  • 从cordova插件的plugin.xml文件中,您可以设置构建应用程序时写入AndroidManifest.xml中的活动、意图等。我还需要在 AndroidManifest 的 标记中编写一个附加属性,以便该标记变为类似于 我可以手动执行此操作并且它可以工作,但它可能是一种自动化方式通过plugin.xml文件?
  • @user2548436 那你后来找到解决办法了吗?
  • 我也在寻找这个解决方案。如果没有,我们可能不得不使用 元素告诉用户手动添加它。
  • 也在寻找这个解决方案

标签: android cordova android-manifest cordova-plugins


【解决方案1】:

我遇到了同样的问题,我使用了 Cordova 钩子来完成这项工作。

首先,编辑您的config.xml 文件以添加挂钩:

<platform name="android">
    <hook type="after_prepare" src="scripts/android_app_name.js" />
</platform>

创建一个名为scripts/android_app_name.js 的文件(将其设置为可执行文件),并在其中使用搜索/替换功能。它应该看起来像:

#!/usr/bin/env node

module.exports = function(context) {

  var fs = context.requireCordovaModule('fs'),
    path = context.requireCordovaModule('path');

  var platformRoot = path.join(context.opts.projectRoot, 'platforms/android');


  var manifestFile = path.join(platformRoot, 'AndroidManifest.xml');

  if (fs.existsSync(manifestFile)) {

    fs.readFile(manifestFile, 'utf8', function (err,data) {
      if (err) {
        throw new Error('Unable to find AndroidManifest.xml: ' + err);
      }

      var appClass = 'YOU_APP_CLASS';

      if (data.indexOf(appClass) == -1) {

        var result = data.replace(/<application/g, '<application android:name="' + appClass + '"');

        fs.writeFile(manifestFile, result, 'utf8', function (err) {
          if (err) throw new Error('Unable to write into AndroidManifest.xml: ' + err);
        })
      }
    });
  }


};

【讨论】:

  • 工作,除了我必须将after_prepare 更改为after_plugin_add。谢谢!
  • 不错!我也试图从 标记中删除 'android:smallScreens="true" ',但我无法正确设置 data.replace
  • 如果您需要使用命名空间(例如,android:xxx)引用元素/属性,我推荐使用 after_prepare 钩子在 AndroidManifest 中进行更改 - 请参阅针对 marcRDZ 答案的评论。最好按照 curtis 的建议使用某种形式的 json 编辑:[curtismlarson.com/blog/2018/10/03/edit-xml-node-js/],而不是模式替换。由于 Cordova 将在每次构建之前运行准备,因此模式替换方法必须对此进行强化,如果您可以先使用 json 简单地检查 xml 结构,这会容易得多。
【解决方案2】:

最简单和最新(cordova 8.1.2 版)的方法是使用edit-config 标签,如下所示:

    <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
        <application android:name="mypackage" />
    </edit-config>

您也可以以类似的方式编辑其他配置。

希望对您有所帮助!

【讨论】:

【解决方案3】:

确实,正如 jlreymendez 所说,正确的方法是这样的:

    <edit-config file="AndroidManifest.xml" target="/manifest/application" mode="merge">
      <application android:name="com.mypackage.MyApplication"/>
    </edit-config>

还要注意,如果您删除插件,修改将恢复,使用钩子技巧不会发生什么。

【讨论】:

  • 此解决方案是最好的解决方案,除非您有冲突。我到了只能使用--force 添加我的插件的地步,在此过程中从其他插件中删除了一些东西。
  • 如果您需要修改任何 android:xxxx 标签,这不起作用。尽管 edit-config 能够修改 AndroidManifest.xml 文件,但更改也会传播到生成的中间 config.xml 文件之一。此配置文件稍后在构建过程中重新加载,并且由于缺少针对 config.xml 根节点的 android 命名空间,构建将中止。我还没有找到将命名空间注入中间 config.xml 文件的方法。我建议改用 after_prepare 构建钩子。
  • 我看到了使用 edit-config 的问题,其中清单以意想不到的方式被更改。其他人也有:issues.apache.org/jira/browse/CB-13514 和 issues.apache.org/jira/browse/CB-13474
【解决方案4】:

我想我和你有同样的问题。我在 cordova 文档中找到了这个。

https://cordova.apache.org/docs/en/4.0.0/plugin_ref_spec.md.html

如果你搜索标题“config-file Element”你会发现一个例子:

<config-file target="AndroidManifest.xml" parent="/manifest/application">
    <activity android:name="com.foo.Foo" android:label="@string/app_name">
        <intent-filter>
        </intent-filter>
    </activity>
</config-file>

【讨论】:

  • config-file 标签仅用于将内容添加到文件中。尽管这很有意义,但他想编辑已经存在的内容,即AndroidManifest.xml 上的application 标签。也许标签edit-config 可能有用,但在我的情况下,我无法让它工作,因为我不想更改application 标签的孩子。
猜你喜欢
  • 1970-01-01
  • 2014-07-11
  • 2022-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多