CLI构建Cordova应用时,AndroidManifest.xml会添加不必要的权限

7
我使用CLI构建我的Cordova应用程序,并添加了Media插件。
即使我不使用该权限,'cordova build'也会自动将android.permission.RECORD_AUDIO添加到我的AndroidManifest.xml中。
那么我该如何删除它?每次发布构建时,该权限都会添加到apk中。

媒体插件添加了RECORD_AUDIO权限:https://github.com/apache/cordova-plugin-media/blob/142f72b15f4a150b0f0167eb51ee0ecc610403ac/plugin.xml#L52 - Lee Crossley
没错。就像我在原始帖子中所指出的那样 :) - mrbay
你需要分叉插件(或在本地修改)以从plugin.xml中删除权限(链接中的行),并确保您不进行任何需要此权限的调用。 - Lee Crossley
如果您不想分叉,可以在本地下载插件/修补并从本地路径安装,或直接在项目/plugins文件夹中的插件文件夹中修补插件.xml文件。 - QuickFix
6个回答

9
在你的项目中,编辑文件 plugins/org.apache.cordova.media/plugin.xml,你会看到针对安卓的特定配置。
   <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>
...

移除这一行代码:<uses-permission android:name="android.permission.RECORD_AUDIO" />,这样权限就不会在每次构建时被添加。

由于该权限已经被添加到AndroidManifest.xml中,你需要手动将其移除,然后它就不会在下次构建时再出现了。


1
我也曾这样想过。但它仍然添加了四个权限。流程如下:
  1. 创建应用并添加Android平台
  2. 添加媒体插件
  3. 从AndroidManifest.xml中删除权限
  4. 从plugins/org.apache.cordova.media/plugin.xml中删除权限
  5. 构建
  6. AndroidManifest.xml现在再次包含权限。
即使我从cli卸载媒体插件并从清单中删除权限,然后再次构建,权限也会被重新放回...
- mrbay
我fork了这个插件,从github上删除了plugin.xml中的权限,并从那里安装。这样就解决了问题。 - mrbay
@mrbay,我尝试了你说的方法,fork插件,但没有成功。你是怎么做到的?还有其他想法吗? - Inês Borges

6

为了防止插件重新添加不必要的权限,请编辑platforms/android/android.json文件。

找到以下行并将其删除:

{
    "xml": "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
    "count": 1
}

请注意,这是一种“粗略”的解决方法。在添加/更新插件后,您可能需要重复此操作。

谢谢。我不知道这个文件也包含了 uses-permission 信息。下次我会尝试一下。 - mrbay
最好的方法是fork插件存储库。 - Paranoid Android
我的 plugins/android.json 中什么也没有,但在 platforms/android/android.json 下找到了这样的内容(使用 Ionic 2)。 - Ricky Levi

6

我尝试了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 );
    } );
} );

不错的想法,因为它是自动化的。代码示例似乎已经被搞砸了! - Joel Malone
谢谢您告诉我,我已经修复了代码示例。 - Steve-e-b
1
谢谢,这解决了我的问题,但是:1)钩子目录现在已被弃用,因此我在config.xml中指定了钩子。2)我正在使用VS2015 TACO,最初脚本失败并显示ENOENT(尽管构建成功),因为平台目录在项目根目录而不是build\。解决方法是在上面的示例中设置rootdir=''; - MStoner

1

对于那些更喜欢使用Python的人,这是Steve-e-b答案的一个克隆。它假设文件将位于类似于hooks/after_prepare/123_remove_permissions.py的位置,并且可执行。

#!/usr/bin/env python
import os

script_dir = os.path.dirname(os.path.abspath(__file__))
project_dir = os.path.abspath(os.path.join(script_dir, '../..'))

bad_permissions = [
    'WRITE_EXTERNAL_STORAGE',
    'RECORD_AUDIO',
    'MODIFY_AUDIO_SETTINGS',
]

android_manifest = os.path.join(project_dir, 'platforms/android/app/src/main/AndroidManifest.xml')

with open(android_manifest, 'r') as fr:
    lines = fr.readlines()

new_lines = [line for line in lines if not [perm for perm in bad_permissions if perm in line]]

with open(android_manifest, 'w') as fw:
    fw.writelines(new_lines)

1
我已经完成以下操作:
  1. 从以下两个文件中删除了权限条目:

myapp\platforms\android\app\src\main\AndroidManifest.xml myapp\platforms\android\android.json

  1. 以发布模式重新构建了apk。

它起作用了,权限条目未在清单文件中重新出现。
成功上传apk到Play控制台。


我忘了android.json,那救了我! - Grego
很高兴知道它有用。 - Manohar Reddy Poreddy

0

在尝试了几个建议后仍然没有成功;

前往 platforms\android\cordova 并运行

>clean

回到项目目录并(在Windows上)运行
>findstr /s /M RECORD_AUDIO *.* > results.txt

打开 results.txt 查看其中包含权限的文件。

在列出的所有文件中除 AudioHandler.java 文件外,删除有关权限的提及。

进行构建,它奏效了。终于解决了。


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