无法使用清单占位符删除权限

时间:2017-07-18 14:42:55

标签: android android-gradle android-manifest

我正在尝试使用清单占位符来删除uses-permissionAndroidManifest.xml节点的发布版本而没有运气。

的build.gradle

buildTypes {
    release {
        manifestPlaceholders.excludeDebugPermissions = "remove"
    }
    debug {
        manifestPlaceholders.excludeDebugPermissions = "merge"
    }
}

的AndroidManifest.xml

<uses-permission
    android:name="android.permission.SYSTEM_ALERT_WINDOW"
    tools:node="${excludeDebugPermissions}" />

它会产生如下错误:

  

错误:任务':app:processDebugManifest'的执行失败。   没有枚举常量com.android.manifmerger.NodeOperationType。$ {EXCLUDE_DEBUG_PERMISSIONS}

但是在其他任何地方使用占位符都能正常工作(合并后的清单没问题,没有错误),例如。

<uses-permission
    android:name="${excludeDebugPermissions}"
    tools:node="remove" />

所以我认为tools:node属性不支持清单占位符,我可能会通过替换权限名称而不是节点标记(merge / remove来破解它),但如果可能的话,我宁愿避免使用它。

有任何建议吗?

3 个答案:

答案 0 :(得分:2)

我发现解决此问题的最简单,最干净的方法是创建一个仅发布的AndroidManifest文件(app/src/release/AndroidManifest.xml),其中包含以下内容以删除SYSTEM_ALERT_WINDOW权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:node="remove"/>
</manifest>

答案 1 :(得分:0)

在回复您对本地反应的评论时,我发现了这一点:https://github.com/facebook/react-native/issues/5886

解决方案是在您的构建类型中使用它,这与您当前的构建类型略有不同:

buildTypes {
    debug {
        manifestPlaceholders = [excludeSystemAlertWindowPermission: "false"]
    }
    release {
        manifestPlaceholders = [excludeSystemAlertWindowPermission: "true"]
    }
}

所以这将在你的清单中:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:remove="${excludeSystemAlertWindowPermission}"/>

答案 2 :(得分:0)

作为Android替代方法的替代方法,这是我的解决方案,允许针对我的应用清单的特定用途设置不同的权限。

例如,如果我在{中设置了自定义 USE_PERMISSION_BUILD_SERIAL 标志,则可以选择启用/禁用 Manifest.permission.READ_PHONE_STATE 权限。 {1}}如下:

build.gradle

接下来,我准备两个不同的清单文件ext { //to enable READ_PHONE_STATE permission to access Build.SERIAL used //for our bug reporting feature. //Since there is a privacy concern with Build.SERIAL, we can decide //to allow/disallow it right here! //If it is disabled, the Phone permission will not appear at all. //If it is enabled, the user will decide instead to allow the Phone //access during its permission request as usual USE_PERMISSION_BUILD_SERIAL = true // whatever the rest... } android { defaultConfig { buildConfigField("boolean", "USE_PERMISSION_BUILD_SERIAL", "${USE_PERMISSION_BUILD_SERIAL}") } sourceSets { main { if (USE_PERMISSION_BUILD_SERIAL) { manifest.srcFile 'src/main/AndroidManifestBuild.xml' } else { manifest.srcFile 'src/main/AndroidManifest.xml' } } } } AndroidManifestBuild.xml,并将它们存储在项目的AndroidManifest.xml文件夹下。

与普通的src/main不同,我将在AndroidManifest.xml文件中请求 Manifest.permission.READ_PHONE_STATE 权限,如下所示:

AndroidManifestBuild.xml

不用担心清单名称,因为Gradle会使用我们的Android应用程序的正确名称来构建最终清单文件。

使用Gradle的 buildConfigField()功能,我可以使用<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.app"> <!-- required for accessing android.os.Build.getSerial() in Android 9.0+ --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> </manifest> (将 USE_PERMISSION_BUILD_SERIAL 标志的状态存储在我的代码中)来准备必要的权限请求