必须显式设置 permissions 为空数组或精准声明所需权限,禁用无关模块,android 13+ 需在 androidmanifest.xml 中用 tools:node="remove" 移除自动注入权限,并排查第三方插件。

manifest.json 的 permissions 数组必须显式清空或精准控制
UniApp 云端打包会自动注入一批默认权限(比如 android.permission.READ_EXTERNAL_STORAGE、android.permission.INTERNET),哪怕你没在 manifest.json 里写任何权限,这些也会出现。想取消自动添加,第一步就是主动接管 permissions 字段——不能留空对象或忽略它,必须用数组形式明确声明你需要哪些。
常见错误是只删了可视化勾选项,但没改源码;或者写了 {"permissions": {}} 这种对象格式,HBuilderX 会直接忽略,仍走默认策略。
- 正确做法:在
manifest.json根级或app-plus.distribute.android下,设置"permissions": [](空数组)或只填你真正需要的权限,如["android.permission.INTERNET"] - 注意:Android 13+(targetSdkVersion ≥ 33)下,
READ_MEDIA_IMAGES和READ_MEDIA_VIDEO可能被框架或插件自动注入,仅靠空数组不一定生效,需配合后续步骤 - 改完必须「重新云打包」或「发行 → 原生App-本地打包」,热更新或仅保存不生效
检查并清理 app-plus.modules 中隐式依赖的模块
很多权限不是你手动加的,而是某个功能模块(如相册、相机、扫码)自带的。即使你没调用 uni.chooseImage,只要 app-plus.modules 里启用了 Album 或 Camera,打包时就会连带注入 READ_MEDIA_IMAGES 等权限。
- 打开
manifest.json源码视图,搜索"modules",逐个核对启用的模块是否真实使用 - 禁用不用的模块:比如删掉
"Album": {}、"Camera": {}、"Barcode": {} - 特别注意第三方原生插件(
nativeplugins/目录下),它们的plugin.json或AndroidManifest.xml可能硬编码了权限,插件文档里常有“需以下权限”说明
Android 平台需手动干预 AndroidManifest.xml(尤其 targetSdkVersion ≥ 33)
当项目设置了 targetSdkVersion 为 33 或更高,且你又没在代码里访问媒体文件,但权限仍自动出现——大概率是 HBuilderX 构建流程或底层 SDK 强制注入。这时得在原生层做“反向移除”。
- 在
nativeResources/Android/src/main/AndroidManifest.xml中添加 tools 命名空间(如果还没加):xmlns:tools="http://schemas.android.com/tools" - 在
<manifest></manifest>标签下插入两行强制移除语句:<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" tools:node="remove"></uses-permission><uses-permission android:name="android.permission.READ_MEDIA_VIDEO" tools:node="remove"></uses-permission>
- 确保该文件存在且路径准确;离线打包时此文件才生效,云打包不读取此路径
- 若用云打包,可在「发行 → 原生App-云端打包」页面勾选「自定义权限」,手动取消勾选对应权限项
排查插件和 SDK 的被动注入行为
权限消失不了,八成是某个插件在背后偷偷加的。尤其是图像压缩、OCR、分享、统计类插件,它们的 Android 实现常依赖媒体权限。
- 临时移除所有
nativeplugins/下的插件,干净打包一次,确认权限是否消失 - 逐个加回,每次打包验证,定位到具体插件
- 查该插件文档或源码中的
AndroidManifest.xml片段,看是否有<uses-permission></uses-permission>声明;部分插件提供配置项(如"mediaPermission": false)可关闭权限注入 - 某些老插件未适配 Android 13,会同时声明
READ_EXTERNAL_STORAGE和READ_MEDIA_IMAGES,导致双重残留
uni.chooseImage 在 Android 13+ 设备上,没有 READ_MEDIA_IMAGES 就会静默失败,连错误回调都不触发。所以删之前,务必确认你的业务逻辑是否绕开了系统相册 API,比如改用 input type="file" 或 WebView 内部选择器。











