【问题标题】:Cordova adds unwanted permission to AndroidManifest.xml when building from CLI从 CLI 构建时,Cordova 向 AndroidManifest.xml 添加了不需要的权限
【发布时间】:2014-09-23 05:39:28
【问题描述】:

我使用 CLI 构建我的 Cordova 应用程序,并添加了媒体插件。

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

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

【问题讨论】:

  • 媒体插件添加RECORD_AUDIO权限:github.com/apache/cordova-plugin-media/blob/…
  • 没错。正如我在原始帖子中指出的那样:)
  • 您需要 fork 插件(或在本地修改它)以从 plugin.xml 中删除权限(在上面的链接中)并确保您不进行任何需要此操作的调用许可。
  • 如果不想分叉,可以在本地下载插件/打补丁并从本地路径安装,或者直接打补丁/plugins文件夹下插件文件夹中的plugin.xml文件你的项目

标签: android cordova permissions command-line-interface


【解决方案1】:

在您的项目中,编辑文件 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>
...

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

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

【讨论】:

  • 我也是这么想的。但它仍然添加了四个权限。流程如下: 1. 创建应用并添加 Android 平台 2. 添加媒体插件 3. 从 AndroidManifest.xml 中删除权限 4. 从 plugins/org.apache.cordova.media/plugin.xml 中删除权限 5. 构建 6 . AndroidManifest.xml 现在再次包含权限。即使我从 cli 卸载媒体插件并从清单中删除权限,然后再次构建,权限也会被放回......
  • 我分叉了插件,从 github 上的 plugin.xml 中删除了权限并从那里安装。成功了。
【解决方案2】:

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

找到这些行并删除它们:

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

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

【讨论】:

  • 谢谢。我不知道这个文件还包含使用许可信息。下次我会试试的。
  • 最好的办法是分叉插件库
  • 我的plugins/android.json 中没有任何内容,但在platforms/android/android.json 下找到了此类内容(使用Ionic 2
【解决方案3】:

我已经尝试了上述建议(来自 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 );
    } );
} );

【讨论】:

  • 好主意,因为它是自动的。不过,代码示例似乎被破坏了!
  • 感谢您告诉我。我已经修复了代码示例。
  • 谢谢这解决了我的问题,但是:1)钩子目录现在已被弃用,所以我在 config.xml 中指定了钩子 2)我使用的是 VS2015 TACO,脚本最初因 ENOENT 而失败(尽管构建成功)因为平台目录位于项目根目录而不是 build\。解决此问题的方法是设置 rootdir='';在上面的示例中
【解决方案4】:

我在下面做了:

  1. 从以下 2 个文件中删除了权限条目:

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

  1. 在发布模式下重建了 apk。

它起作用了,删除的权限条目会在清单文件中返回。
已成功将 apk 上传到 Play 控制台。

【讨论】:

  • 我忘了android.json,它救了我!
  • 很高兴知道它很有用。
【解决方案5】:

Steve-e-b 的答案的克隆,适用于那些更熟悉 python 的人。它假定该文件将位于 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)

【讨论】:

    【解决方案6】:

    在尝试了几个建议都失败后;

    去了platforms\android\cordova并跑了

    >clean
    

    回到项目目录并(在 Windows 上)运行

    >findstr /s /M RECORD_AUDIO *.* > results.txt
    

    打开 results.txt 以查看具有权限的文件

    从所有列出的文件中删除了对权限的提及,但 AudioHandler.java 文件除外。

    做了一个构建,它工作。最后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-08
      • 2020-10-06
      • 1970-01-01
      • 2013-06-01
      • 2021-12-18
      • 2018-06-04
      • 2022-12-02
      • 1970-01-01
      相关资源
      最近更新 更多