如何将xmlnsXML名称空间添加到android manifest标头

问题描述

我使用的是离子骨架,

        <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
            <application android:allowBackup="false" tools:replace="android:allowBackup" />
            <application android:fullBackupOnly="false" />
        </edit-config>

以避免在Android应用中提供备份服务。

我在config.xml添加了此内容,它会自动添加到清单中,但是需要在清单中手动添加xmlns: tools="http://schemas.android.com/tools",否则构建会失败并抛出错误

The prefix "tools" for attribute "tools: replace" associated with an element type "application" is not bound.

有什么方法可以将配置文件中的xmlns自动添加到Android清单?

解决方法

您可以使用钩子脚本添加名称空间。例如,在您的Cordova项目中创建hooks/add_tools_namespace.js

#!/usr/bin/env node

const fs = require('fs'),path = require('path');

module.exports = function (context) {
    const toolsAttribute = "xmlns:tools=\"http://schemas.android.com/tools\"";
    const manifestOpen = "<manifest";

    const manifestPath = path.join(context.opts.projectRoot,'platforms/android/app/src/main/AndroidManifest.xml');
    let manifest = fs.readFileSync(manifestPath).toString();

    if(manifest.indexOf(toolsAttribute) == -1) {
        manifest = manifest.replace(manifestOpen,manifestOpen + " " + toolsAttribute + " ");
        fs.writeFileSync(manifestPath,manifest,'utf8');
    }
};

然后从您的config.xml中引用它:

<platform name="android">
    ...
    <hook type="after_prepare" src="hooks/add_tools_namespace.js" />
</platform>