使用Expo开发React Native时,AndroidManifest莫名添加READ_EXTERNAL_STORAGE权限
解决Expo React Native项目中自动添加READ_EXTERNAL_STORAGE权限的问题
1. 定位权限来源的系统方法
用Gradle日志精准定位
先执行expo prebuild生成原生Android项目文件,进入项目根目录下的android文件夹,运行:
./gradlew app:mergeDebugAndroidManifest --info
在输出的日志里搜索android.permission.READ_EXTERNAL_STORAGE,日志会明确标注该权限来自哪个依赖库的Manifest文件,比如:
Merging permission from node_modules/react-native-ui-lib/android/src/main/AndroidManifest.xml
排查可疑依赖
- 查看项目依赖树:npm用户执行
npm ls,yarn用户执行yarn list,筛选出涉及文件存储、媒体操作的库(比如UI组件库、统计SDK)。 - 直接检查库的Manifest:进入
node_modules/[目标库名]/android/src/main/,打开AndroidManifest.xml,搜索是否包含该权限。
2. 阻止权限被添加的方法
通过Expo配置移除(推荐)
在app.config.js或app.json的expo.android.permissions中,用-权限名的语法移除不需要的权限:
{ "expo": { "android": { "permissions": [ // 保留业务需要的权限,例如 "android.permission.INTERNET", // 移除自动添加的存储权限 "-android.permission.READ_EXTERNAL_STORAGE" ] } } }
重新构建项目,Expo会自动处理Manifest合并,剔除该权限。
手动修改AndroidManifest.xml(预构建后)
预构建完成后,打开android/app/src/main/AndroidManifest.xml,先在根标签引入tools命名空间,再添加移除权限的配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <!-- 其他原有配置 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" /> </manifest>
tools:node="remove"会强制在Manifest合并阶段删除该权限。
Gradle配置层面排除
在android/app/build.gradle的defaultConfig块中添加Manifest占位符:
defaultConfig { // 其他配置项 manifestPlaceholders = [ excludeReadExternalStorage: "true" ] }
然后在AndroidManifest.xml中配合使用:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="${excludeReadExternalStorage == 'true' ? 'remove' : 'merge'}" />
内容的提问来源于stack exchange,提问作者Nataly Firstova
相关产品推荐
相关产品推荐

