React Native旧应用构建时Camera权限被自动添加至AndroidManifest问题排查
问题概述
我们维护的旧版React Native应用,未在主AndroidManifest.xml中显式声明CAMERA权限(依据react-native-image-picker库文档说明无需手动添加),但构建后发现该权限被自动插入到生成的manifest文件内,需定位其来源。
主工程AndroidManifest.xml(原文件)
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.tego"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.VIBRATE" /> <!-- If "android.permission.CAMERA" is added, explicit request is required for react-native-image-picker -->
构建后生成的AndroidManifest.xml(片段)
<uses-permission android:name="android.permission.VIBRATE" /> ... <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.USE_BIOMETRIC" /> <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- Required by older versions of Google Play services to create IID tokens --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
排查步骤
查看Manifest合并报告:Android构建时会自动合并所有依赖库的Manifest文件,权限大概率来自第三方依赖。执行以下命令生成合并详情报告:
./gradlew app:mergeDebugAndroidManifest --info报告中会明确标注每个权限的来源库,重点排查除
react-native-image-picker外的其他依赖(从构建后新增的USE_BIOMETRIC、C2DM_RECEIVE等权限来看,Google Play Services相关组件、生物识别库、推送服务库都是可疑对象)。校验react-native-image-picker实际配置:库文档描述可能与旧版本不符,直接检查
node_modules/react-native-image-picker/android/src/main/AndroidManifest.xml,确认该库是否内部声明了CAMERA权限。检查Gradle构建配置:部分构建插件或自定义Gradle脚本可能自动注入权限。查看项目根目录及app模块的
build.gradle文件,排查是否存在manifestPlaceholders、权限自动注入的配置,或引入了权限处理插件。分析依赖树:执行Gradle命令查看完整依赖关系,定位包含相机权限的依赖:
./gradlew app:dependencies重点查找名称含
camera的依赖项,或间接依赖相机库的组件。
临时移除权限方案
若确认应用无需CAMERA权限,可在主AndroidManifest.xml中通过tools:node="remove"强制移除:
<uses-permission android:name="android.permission.CAMERA" tools:node="remove" />
内容的提问来源于stack exchange,提问作者Marty

