manifest.json中残留空模块配置(如"Push":{})会触发“未添加xxx模块”警告,需手动在源码视图中删除对应键值对;已实际使用的模块(如含<video>标签或API调用)即使配置为空对象也必须保留;本地离线打包还需同步处理Android权限、SDK引用及初始化逻辑。
打包时弹出“未添加xxx模块”提示,但你根本没用这个功能——大概率是manifest.json里留了空的模块声明。比如之前勾选过Push、VideoPlayer或Bluetooth,后来删了代码却没清理配置,"modules": {"Push": {}, "VideoPlayer": {}}这种空对象会被打包系统当成“需要但缺失”的模块处理。
别只在HBuilderX图形界面取消勾选,那只是改了UI状态,不一定会同步删除manifest.json源码。必须手动进「源码视图」删干净:
manifest.json → 切换到「源码视图」标签页"app-plus" → "modules"对象"Push": {}、"Bluetooth": {}
不是所有模块都能靠“删配置”解决。像Camera、VideoPlayer、Geolocation这类模块,只要项目里用了对应HTML标签(如<video>、<camera>)或API(如uni.chooseImage),就必须在modules里保留非空配置。此时空对象{"Camera":{}}反而是合法写法,删掉才会报错。
关键看是否实际使用:没用就删;用了就留,哪怕只留一个空{}。
如果用的是本地离线打包(非云端),光改manifest.json不够。比如Bluetooth模块,还必须在原生Android工程里:
AndroidManifest.xml中补全android.permission.BLUETOOTH_SCAN等权限libs目录下有对应版本的蓝牙SDK aar包MainApplication.java是否注册了蓝牙模块初始化逻辑云端打包自动处理这些,本地打包得自己兜底——否则删了manifest.json里的Bluetooth也还是会报错,因为原生层根本没加载模块。
真正容易被忽略的是:图形界面勾选/取消操作和源码实际内容不同步。每次改完模块配置,务必切到源码视图确认键值对是否真的存在或消失,而不是依赖UI反馈。