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

时间:2014-07-31 10:05:52

标签: android cordova permissions command-line-interface

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

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

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

6 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:6)

让插件不再重新添加不必要的权限编辑平台/ android / android.json。

找到这些行并将其删除:

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

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

答案 2 :(得分:4)

我已尝试过上述建议(来自QuickFix和leuk98743),但清单文件不断重新生成。 所以我创建了一个钩子来在构建期间修改清单文件。

  1. 将以下内容添加到项目的文件中: hooks/after_prepare/030_remove_permissions.js
  2. 如果您使用的是Linux,请将该文件设为可执行文件。
  3. 修改文件以设置要删除的权限。我的示例中列出了3个,但您应该根据需要添加/删除。
  4. #!/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 );
        } );
    } );
    

答案 3 :(得分:1)

我已经完成以下操作:

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

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

  1. 以发布模式重建apk。

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

答案 4 :(得分:0)

尝试多次建议失败后

转到平台\ android \ cordova并运行

>clean

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

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

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

删除了除AudioHandler.java文件之外列出的所有文件的权限。

构建是否有效。最后。

答案 5 :(得分:0)

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)