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

And*_*ost 10 android android-manifest android-gradle-plugin

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

的build.gradle

buildTypes {
    release {
        manifestPlaceholders.excludeDebugPermissions = "remove"
    }
    debug {
        manifestPlaceholders.excludeDebugPermissions = "merge"
    }
}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml中

<uses-permission
    android:name="android.permission.SYSTEM_ALERT_WINDOW"
    tools:node="${excludeDebugPermissions}" />
Run Code Online (Sandbox Code Playgroud)

它会产生如下错误:

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

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

<uses-permission
    android:name="${excludeDebugPermissions}"
    tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)

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

有什么建议吗?

Rob*_*sey 0

为了回应您关于 React Native 的评论,我发现了这个: https: //github.com/facebook/react-native/issues/5886

解决方案是在您的构建类型中包含此内容,这与您当前拥有的略有不同:

buildTypes {
    debug {
        manifestPlaceholders = [excludeSystemAlertWindowPermission: "false"]
    }
    release {
        manifestPlaceholders = [excludeSystemAlertWindowPermission: "true"]
    }
}
Run Code Online (Sandbox Code Playgroud)

所以这将出现在你的清单中:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:remove="${excludeSystemAlertWindowPermission}"/>
Run Code Online (Sandbox Code Playgroud)

  • 我已经看到这个问题了。提议的解决方案不起作用([此处确认](https://github.com/facebook/react-native/issues/5886#issuecomment-230569276)),我不明白为什么它可以作为[doc] (https://developer.android.com/studio/build/manifest-merge.html)明确表示“tools:remove”将“删除指定的属性”,并且它接受属性名称,而不是布尔值。 (3认同)