manifest.json 中 app-plus.distribute.android.package 字段是修改 uni-app android 包名的唯一权威位置,必须为非空、全小写、符合 java 命名规范的字符串,改后需同步云端或重新生成本地打包资源。

manifest.json 里改 package 字段才是唯一权威位置
uni-app 的 Android 包名不是运行时生成的,也不是靠代码读取或猜出来的,它在打包前就已固化。最可靠、唯一有效的修改位置就是 manifest.json 文件里的 app-plus.distribute.android.package 字段。旧版项目可能把包名写在根级 package 或 appid 下,但这些已被弃用,云打包和本地打包都不认。
打开 manifest.json → 切换到「源码视图」→ 搜索 package 或 android,定位到类似这样的结构:
{"app-plus":{"distribute":{"android":{"package":"com.example.myapp"}}}}
把 "com.example.myapp" 替换成你自己的包名(如 com.yourcompany.app),注意必须全小写、不能含下划线或大写字母、符合 Java 包命名规范。
- 改完后,HBuilderX 界面里的“Android 设置”页显示的包名只是 UI 映射,不保证同步,别信它
- 如果用云打包,必须点右上角「同步云端」按钮,否则改了 JSON 也白搭
- 本地打包则需重新生成打包资源(右键项目 → 发行 → 原生App-本地打包 → 生成本地打包App资源)
云打包失败?先检查 manifest.json 里 package 是否为空
云打包时如果右下角打包按钮无反应,或提示“配置错误”,大概率是 manifest.json 中 app-plus.distribute.android.package 字段为空或缺失。HBuilderX 对这个字段校验很严格,空值会导致静默失败。
常见错误写法:
-
"package": ""(空字符串) -
"package": null(JSON 语法错误) - 整个
android对象被删掉,只剩distribute: {}
正确写法必须是完整路径 + 非空字符串:
"app-plus": {
"distribute": {
"android": {
"package": "com.yourcompany.app"
}
}
}
另外,正式版和测试版要区分包名,比如正式版用 com.yourcompany.app,测试版用 com.yourcompany.app.beta —— 否则安装会提示“已存在同名应用”,根本装不上。
真机上怎么验证包名是否生效?别用 plus.runtime.appid 盲试
想确认当前安装的 APK 包名是不是你设的那个,最直接的方式是用 ADB 查:
adb shell pm list packages | grep yourcompany
或者进手机「设置 → 应用管理 → 找到你的 App → 点击「存储」或「应用信息」→ 查看「包名」字段。
有人想用 plus.runtime.appid 动态读,但要注意:
- 必须加条件编译:
// #ifdef APP-PLUS,否则 H5 或小程序环境会报plus is not defined - 只在真机上有效,模拟器基本不返回正确值
- 它返回的是系统实际安装的包名,和
manifest.json一致;但如果用了某些厂商 ROM 或自定义启动 Activity,极少数情况会异常
别依赖它做逻辑判断,仅作调试验证用。
本地打包还要手动改 build.gradle?不用,除非你动过 unpackage
正常流程下,uni-app 本地打包会根据 manifest.json 自动生成 unpackage/android/build.gradle 和 AndroidManifest.xml,其中 applicationId 就来自 package 字段。只要没手动编辑过 unpackage 目录下的文件,就不用碰 build.gradle。
但如果你之前改过 unpackage/android/ 里的内容(比如手改过 applicationId),那下次打包前必须清掉整个 unpackage 目录,再重新生成本地打包资源,否则旧值会残留,导致包名不一致。
顺带提醒:签名不影响包名,但包名一旦发布就不能改——改了就是全新应用,用户数据不继承、推送证书要重配、应用市场得重新上架。











