我正在尝试使用清单占位符来删除uses-permission
中AndroidManifest.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
来破解它),但如果可能的话,我宁愿避免使用它。
有任何建议吗?
答案 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 标志的状态存储在我的代码中)来准备必要的权限请求