哈喽!我是小L,那个在鸿蒙开发里「玩配置文件」的女程序员~ 你知道吗?一个应用就像一场演出,包名是「唯一门票编号」,图标是「海报」,权限是「入场许可」。今天就来聊聊鸿蒙应用配置的核心要素,看如何通过config.json
和module.json5
让应用「合规又亮眼」~
一、包名(bundleName):应用的「唯一身份证」🆔
(一)命名规则
- 反向域名原则:
格式:com.[公司/组织名].[应用名]
✅ 正确示例:com.harmonyos.clock
、io.github.littleL.calendar
❌ 错误示例:com.example.MyApp
(含大写字母)、app.clock
(无前缀) 字符限制:
- 仅允许小写字母、数字、点号
- 长度≤255字符,不能以点号开头/结尾
(二)多Module场景
场景:主Module与HAP Module共存
// 主Module(entry)
{
"app": {
"bundleName": "com.example.main"
}
}
// 功能Module(feature)
{
"app": {
"bundleName": "com.example.feature.share" // 建议包含主包名前缀
}
}
二、图标与标签:应用的「视觉名片」🎨
(一)图标配置
格式与尺寸:
- 主图标:PNG格式,提供
48px
、72px
、96px
、144px
、192px
等多尺寸 适配不同设备:
- 手机/平板:使用
media_element
目录下的自适应图标 - 智能穿戴:提供圆形图标(如
1.0x
、2.0x
倍率)
- 手机/平板:使用
- 主图标:PNG格式,提供
配置示例:
{ "app": { "icon": { "src": "$media:icon", // 主图标路径 "adaptiveIcon": { "foreground": "$media:icon_foreground", // 前景图 "background": "$color:icon_bg" // 背景色 } } } }
(二)标签配置
多语言支持:
- 主标签:
"label": "$string:app_name"
字符串定义在
resources/base/strings/strings.json
:{ "app_name": "我的应用", "app_name_en": "My App" }
- 系统自动根据设备语言切换
- 主标签:
场景化标签:
{ "abilities": [ { "name": ".MainAbility", "label": { "phone": "$string:app_name", // 手机端标签 "tablet": "$string:app_name_tablet" // 平板端标签 } } ] }
三、版本声明:应用的「成长日志」📅
(一)双版本号机制
字段 | 作用 | 示例 |
---|---|---|
name | 显示给用户的版本号 | 1.0.0 |
code | 内部版本号(用于程序判断) | 100 |
(二)升级策略
强制升级:
在服务端对比用户code
与最新版本,若低于则提示升级if (currentVersionCode < latestVersionCode) { showUpdateDialog(); }
- 灰度发布:
通过code
控制灰度范围(如code % 100 < 20
表示20%用户可见)
四、设备类型配置:应用的「舞台准入名单」🎭
(一)支持的设备类型
{
"deviceType": [
"phone", // 手机
"tablet", // 平板
"wearable", // 智能穿戴
"tv", // 智慧屏
"car", // 车机
"smartVision" // 智能视觉设备
]
}
(二)差异化配置
场景:仅在手机和平板显示某组件
@Entry
@Component
struct MainPage {
build() {
if (DeviceType.isPhone() || DeviceType.isTablet()) {
Button('移动端专属功能');
}
}
}
五、权限配置:应用的「资源访问许可证」🔑
(一)权限分类
类型 | 示例权限 | 申请方式 |
---|---|---|
系统权限 | ohos.permission.CAMERA | 在config.json 声明 |
敏感权限 | ohos.permission.READ_CONTACTS | 需用户动态授权 |
自定义权限 | com.example.permission.MY_PERMISSION | 自定义声明+校验 |
(二)配置示例
系统权限申请:
{ "module": { "reqPermissions": [ { "name": "ohos.permission.READ_USER_STORAGE", "reason": "$string:permission_read_storage_desc", // 权限申请理由 "usedScene": { "ability": [".MainAbility"], // 涉及的Ability "when": "inUse" // 使用时申请 } } ] } }
动态权限请求:
import { Permissions } from '@ohos.security.permission'; // 申请相机权限 Permissions.requestPermissionsFromUser([Permissions.CAMERA]) .then((data) => { if (data[0].code === Permissions.Status.GRANTED) { startCamera(); } });
六、完整配置文件示例:module.json5
解析📄
{
"srcEntry": "ets/abilityStage/AppStage", // Stage模型入口
"module": {
"package": "com.example.myapp.entry", // Module包名(建议与主包名一致)
"name": ".MyApplication", // 应用类名
"deviceType": ["phone", "tablet"], // 支持设备
"abilities": [
{
"name": ".MainAbility", // Ability名称
"srcPath": "src/ets/abilities/MainAbility", // 代码路径
"icon": "$media:icon_ability", // Ability图标
"label": "$string:main_ability_label", // 标签
"launchType": "standard" // 启动模式
}
],
"reqPermissions": [
{
"name": "ohos.permission.LOCATION", // 定位权限
"usedScene": {
"ability": [".MapAbility"],
"when": "always" // 始终需要
}
}
]
},
"app": {
"bundleName": "com.example.myapp", // 应用唯一包名
"version": {
"name": "1.1.5",
"code": 115
},
"label": "$string:app_name",
"icon": "$media:app_icon"
}
}
七、避坑指南:配置中的「陷阱清单」⚠️
(一)包名冲突
后果:导致应用无法安装或覆盖旧版本
解决方案:
- 发布前使用
bundleName
生成工具(如反向域名生成器) - 多Module场景下确保子Module包名包含主包名前缀
(二)图标拉伸模糊
原因:未提供多尺寸图标,系统自动缩放
解决方案:
- 使用
Adaptive Icon
适配不同设备像素密度 - 在
resources
目录下按en-US/zh-CN
、device-type
分目录存放图标
(三)权限过度申请
风险:被应用市场拒绝上架或用户隐私投诉
最佳实践:
- 仅申请必要权限,遵循「最小够用」原则
- 敏感权限采用「动态申请+场景说明」模式
八、未来趋势:配置的「智能化演进」🤖
(一)自动权限适配
未来可能通过AI分析代码逻辑,自动生成所需权限列表,减少人工配置误差
(二)动态图标切换
支持根据时间、地点、用户习惯自动更换应用图标,例如:
{
"icon": {
"day": "$media:icon_day",
"night": "$media:icon_night"
}
}
(三)跨设备配置同步
在分布式场景中,自动同步多设备的配置参数,例如:
- 手机端配置字体大小,平板/智慧屏自动应用相同设置
总结:配置的「黄金法则」📌
应用合规性 =(包名唯一性 × 权限合理性)÷ 配置冗余度
- 包名:反向域名+全小写,杜绝冲突
- 图标:多尺寸+自适应,视觉统一
- 权限:最小必要+动态申请,守护隐私
- 版本:语义化命名+双版本号,清晰迭代
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。