cordova - 删除不必要的权限

时间:2014-08-12 13:44:15

标签: android cordova android-permissions

我需要在游戏中播放声音,所以我将org.apache.cordova.media插件添加到我的应用程序中。现在,platforms / android / AndroidManifest.xml包含两个我不需要的条目:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

如果删除这些行,则会重新生成此文件并再次添加权限。删除这些权限的正确方法是什么?我使用apache cordova 3.5.0

6 个答案:

答案 0 :(得分:12)

您必须打开plugins/android.json,找到该文件中的部分

"AndroidManifest.xml": {
     "parents": {
         "/*": [
......
{
      "xml": "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" />",
       "count": 1
},
......
{
      "xml": "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
       "count": 1
},
......
],

并删除这些文件。删除这些行后,请确保android.json仍然是有效的JSON文件。 另请注意count属性,该属性指示有多少插件使用权限。如果您的值超过1,您应该找到哪些其他插件可以使用该权限。此外,我不确定Cordova插件是否在没有适当权限的情况下经过测试可行,因此您在从该文件中删除权限时可以自行测试。

如果您将系统置于损坏状态,您始终可以删除平台和插件文件夹的所有内容,并通过运行

重新创建项目
cordova create ...
cordova platform add ...
cordova plugin add ...

答案 1 :(得分:12)

在项目的根目录中创建一个文件,并将其重命名为 remove_permissions.js ,然后将以下代码放入其中:

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

var fs = require('fs');
var path = require('path');
var rootdir = "";
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( "<uses-permission android:name=\"android.permission." + permissionsToRemove[i] + "\" />", "" );

    fs.writeFile( manifestFile, result, "utf8", function( err )
    {
        if (err)
            return console.log( err );
    } );
} );

打开 config.xml 并在Android部分添加下面的行:

<platform name="android">
...
     <hook type="after_prepare" src="remove_permissions.js"/>
...
</platform>

现在重建APK文件。

答案 2 :(得分:1)

@codevision的响应中的方法曾经为我工作,但在最近(我不知道截止的)版本的cordova-android平台上,我发现权限仍然存在合并到APK中的最终AndroidManifest.xml。

原因是Merge Multiple Manifest Files构建步骤导致从各种插件依赖项(包括.aar文件)声明的权限潜入最终的AndroidManifest.xml。

对我来说有用的是创建一个修改platforms/android/AndroidManifest.xml的后准备脚本,如下所示:

  1. 将以下命名空间声明添加到顶级<manifest>标记xmlns:tools="http://schemas.android.com/tools"
  2. (仔细阅读)确保您想要的所有权限都存在,但请使用属性tools:node="remove"标记,例如:
  3. <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" tools:node="remove">

    这可以防止任何依赖项将其MODIFY_AUDIO_SETTINGS权限隐藏到最终的APK中。

答案 3 :(得分:0)

我尝试了上面的答案,但清单文件不断重新生成。 我通过创建一个“after_prepare”钩子解决了这个问题,该钩子在构建过程中修改了清单文件。

代码发布在this thread

答案 4 :(得分:0)

我认为删除不必要的插件的最佳方法

phonegap plugin remove cordova-plugin-media-capture

答案 5 :(得分:0)

@SaeedHosseinPoor 的答案有效,但脚本有点脆弱,因为它不使用 XML 解析器。这是一个替代的钩子脚本。在 Node 15、Cordova 10、cordova-android 9 上测试。

  1. 使用此内容创建 scripts/remove_permissions.js
const fs = require('fs/promises')
const xml2js = require('xml2js')

const REMOVE_PERMISSIONS = [
  'android.permission.INTERNET',
  'android.permission.ACCESS_NETWORK_STATE',
]

module.exports = async function(context) {
  const root = context.opts.projectRoot
  const manifestPath = root + '/platforms/android/app/src/main/AndroidManifest.xml'
  const manifestXml = await fs.readFile(manifestPath)
  const manifest = await xml2js.parseStringPromise(manifestXml)
  const usesPermissions = manifest.manifest['uses-permission']
  if (Array.isArray(usesPermissions)) {
    manifest.manifest['uses-permission'] = usesPermissions.filter(usesPermission => {
      const attrs = usesPermission.$ || {}
      const name = attrs['android:name'] // Assuming xmlns:android has been set as usual...
      if (REMOVE_PERMISSIONS.includes(name)) {
        console.log(`Removing permission "${name}" from AndroidManifest.xml`)
        return false
      } else {
        return true
      }
    })
  }
  const newManifest = (new xml2js.Builder()).buildObject(manifest)
  await fs.writeFile(manifestPath, newManifest)
}
  1. 运行 npm add --save-dev xml2js

  2. 将钩子添加到 config.xml

  <platform name="android">
    ...
    <hook type="after_prepare" src="scripts/remove_permissions.js"/>
  </platform>