从cordova插件中的AndroidManifest中的“application”标签添加属性

时间:2015-06-24 10:29:52

标签: android cordova plugins android-manifest cordova-plugins

我为Cordova创建了一个插件,我想编辑AndroidManifest以在“application”标签中添加一个属性。我知道config-file要添加新标记,但我找不到是否可以更新现有标记。

例如,我有这个AndroidManifest:

<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="1" android:versionName="0.0.1" package="com.test.testCordova" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="CordovaApp" android:theme="@android:style/Theme.Black.NoTitleBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" />
</manifest>

我希望在android:isGame=true代码中添加<application>

如果我不能从plugin.xml执行此操作,我将创建一个钩子来自行编辑AndroidManifest,但我希望没有必要。

3 个答案:

答案 0 :(得分:6)

我结束了做plugin hook我不知道存在的事情。插件挂钩是插件中定义的挂钩,可以在添加或删除插件之前或之后调用(当您运行cordova插件cli命令或cordova将插件添加到具有cordova platform add命令的平台时)。

我不想使用钩子,因为我认为钩子必须放在config.xml中,并且无法与插件链接。

这里我在plugin.xml文件的平台android部分添加了这一行(我的要求与OP有点不同,但样本可能无论如何都有帮助):

    <platform name="android">   
        <hook type="before_plugin_install" src="scripts/androidBeforeInstall.js" />
...
    </platform>

然后我编写了androidBeforeInstall.js钩子脚本:

module.exports = function(ctx) {
    var fs = ctx.requireCordovaModule('fs'),
        path = ctx.requireCordovaModule('path'),
        xml = ctx.requireCordovaModule('cordova-common').xmlHelpers;

    var manifestPath = path.join(ctx.opts.projectRoot, 'platforms/android/AndroidManifest.xml');
    var doc = xml.parseElementtreeSync(manifestPath);
    if (doc.getroot().tag !== 'manifest') {
        throw new Error(manifestPath + ' has incorrect root node name (expected "manifest")');
    }

    //adds the tools namespace to the root node
    doc.getroot().attrib['xmlns:tools'] = 'http://schemas.android.com/tools';
    //add tools:replace in the application node
    doc.getroot().find('./application').attrib['tools:replace'] = 'android:label';

    //write the manifest file
    fs.writeFileSync(manifestPath, doc.write({indent: 4}), 'utf-8');

};

这比在plugin.xml中添加配置文件行要复杂一些,但是一旦你有了良好的语法,它就会非常强大。

修改

由于某些原因只有 before_plugin_install 中的钩子,AndroidManifest.xml在平台添加期间被正确更新,但在platdorm add结束时恢复为默认状态。

由于我无法弄清楚原因,我在plugin.xml中添加了以下行,因此脚本也在平台添加结束时启动(plugin.xml中定义的luckilly钩子不仅可以运行添加或删除插件。)

<hook type="after_platform_add" src="scripts/androidBeforeInstall.js" />

答案 1 :(得分:0)

对于cordova version 8.1.2文件的最新AndroidManifest.xml路径,已更改

下面是我的操作方式,并且工作正常。 同样,您也可以更新AndroidManifest.xml的任何其他配置。

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

您完成了!

答案 2 :(得分:0)

如果您使用的是cordova-custom-config,则可能需要向config.xml中添加一个新的custom-preference

<platform name="android">

  <!-- ... other settings ... -->

  <custom-preference name="android-manifest/application/@android:isGame" value="true" />

</platform>