从CLI构建时,Cordova会向AndroidManifest.xml添加不需要的权限

mrb*_*bay 6 permissions android command-line-interface cordova

我使用CLI来构建我的Cordova应用程序,并添加了Media插件.

'cordova build'会自动将android.permission.RECORD_AUDIO添加到我的AndroidManifest.xml中,即使我没有使用该权限.

那么我该如何删除它?每次我构建发布时,权限都会添加到apk中.

Qui*_*Fix 9

在你的项目中,编辑文件plugins/org.apache.cordova.media/plugin.xml你会看到android特定的配置

   <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="Media" >
                <param name="android-package" value="org.apache.cordova.media.AudioHandler"/>
            </feature>
        </config-file>

        <config-file target="AndroidManifest.xml" parent="/*">
            <uses-permission android:name="android.permission.RECORD_AUDIO" />
            <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        </config-file>
...
Run Code Online (Sandbox Code Playgroud)

删除这样的行,<uses-permission android:name="android.permission.RECORD_AUDIO" />每次构建时都不会添加权限.

由于权限已经添加到AndroidManifest.xml,您必须手动删除它,然后它不会在下次构建时返回.


小智 6

为了防止插件重新添加不必要的权限编辑平台/ android/android.json.

找到这些行并删除它们:

{
    "xml": "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
    "count": 1
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个"脏"的解决方案.添加/更新插件后,您可能需要重复此操作.


小智 5

我尝试了上述建议(来自QuickFix和leuk98743),但清单文件一直在重新生成。因此,我创建了一个挂钩来在构建过程中修改清单文件。

  1. 将以下内容添加到项目中的文件中: hooks/after_prepare/030_remove_permissions.js
  2. 如果您使用的是Linux,请将该文件设为可执行文件。
  3. 修改文件以设置要删除的权限。在我的示例中列出了3个,但是您应该适当地添加/删除。
#!/usr/bin/env node
//
// This hook removes specific permissions from the AndroidManifest.xml
// The AndroidManifest is re-generated during the prepare stage,
// so this must be run on the "after_prepare" hook.
//


// Configure the permissions to be forcefully removed.
// NOTE: These permissions will be removed regardless of how many plugins
//       require the permission. You can check the permission is only required
//       by the plugin you *think* needs it, by looking at the "count" shown in
//       your /plugins/android.json file.
//       If the count is more than 1, you should search through
//       the /plugins/&lt;plugin-name&gt;/plugin.xml files for &lt;uses-permission&gt; tags.

var permissionsToRemove = [ "RECORD_AUDIO", "MODIFY_AUDIO_SETTINGS", "READ_PHONE_STATE" ];


var fs = require('fs');
var path = require('path');
var rootdir = process.argv[2];
var manifestFile = path.join(rootdir, "platforms/android/AndroidManifest.xml");

fs.readFile( manifestFile, "utf8", function( err, data )
{
    if (err)
        return console.log( err );

    var result = data;
    for (var i=0; i<permissionsToRemove.length; i++)
        result = result.replace( "&lt;uses-permission android:name=\"android.permission." + permissionsToRemove[i] + "\" /&gt;", "" );

    fs.writeFile( manifestFile, result, "utf8", function( err )
    {
        if (err)
            return console.log( err );
    } );
} );
Run Code Online (Sandbox Code Playgroud)