哈喽!我是小L,那个在鸿蒙开发里「玩配置文件」的女程序员~ 你知道吗?一个应用就像一场演出,包名是「唯一门票编号」,图标是「海报」,权限是「入场许可」。今天就来聊聊鸿蒙应用配置的核心要素,看如何通过config.json
和module.json5
让应用「合规又亮眼」~
一、包名(bundleName):应用的「唯一身份证」🆔
(一)命名规则
-
反向域名原则 :
格式:
com.[公司/组织名].[应用名]
✅ 正确示例:
com.harmonyos.clock
、io.github.littleL.calendar
❌ 错误示例:
com.example.MyApp
(含大写字母)、app.clock
(无前缀) -
字符限制:
- 仅允许小写字母、数字、点号
- 长度≤255字符,不能以点号开头/结尾
(二)多Module场景
场景:主Module与HAP Module共存
json
// 主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格式,提供
-
配置示例:
json
{
"app": {
"icon": {
"src": "$media:icon", // 主图标路径
"adaptiveIcon": {
"foreground": "$media:icon_foreground", // 前景图
"background": "$color:icon_bg" // 背景色
}
}
}
}
(二)标签配置
-
多语言支持:
-
主标签:
"label": "$string:app_name"
-
字符串定义在
resources/base/strings/strings.json
:json{ "app_name": "我的应用", "app_name_en": "My App" }
-
系统自动根据设备语言切换
-
-
场景化标签:
json{ "abilities": [ { "name": ".MainAbility", "label": { "phone": "$string:app_name", // 手机端标签 "tablet": "$string:app_name_tablet" // 平板端标签 } } ] }
三、版本声明:应用的「成长日志」📅
(一)双版本号机制
字段 | 作用 | 示例 |
---|---|---|
name |
显示给用户的版本号 | 1.0.0 |
code |
内部版本号(用于程序判断) | 100 |
(二)升级策略
-
强制升级 :
在服务端对比用户
code
与最新版本,若低于则提示升级typescriptif (currentVersionCode < latestVersionCode) { showUpdateDialog(); }
-
灰度发布 :
通过
code
控制灰度范围(如code % 100 < 20
表示20%用户可见)
四、设备类型配置:应用的「舞台准入名单」🎭
(一)支持的设备类型
json
{
"deviceType": [
"phone", // 手机
"tablet", // 平板
"wearable", // 智能穿戴
"tv", // 智慧屏
"car", // 车机
"smartVision" // 智能视觉设备
]
}
(二)差异化配置
场景:仅在手机和平板显示某组件
typescript
@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 |
自定义声明+校验 |
(二)配置示例
- 系统权限申请:
json
{
"module": {
"reqPermissions": [
{
"name": "ohos.permission.READ_USER_STORAGE",
"reason": "$string:permission_read_storage_desc", // 权限申请理由
"usedScene": {
"ability": [".MainAbility"], // 涉及的Ability
"when": "inUse" // 使用时申请
}
}
]
}
}
- 动态权限请求:
typescript
import { Permissions } from '@ohos.security.permission';
// 申请相机权限
Permissions.requestPermissionsFromUser([Permissions.CAMERA])
.then((data) => {
if (data[0].code === Permissions.Status.GRANTED) {
startCamera();
}
});
六、完整配置文件示例:module.json5
解析📄
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分析代码逻辑,自动生成所需权限列表,减少人工配置误差
(二)动态图标切换
支持根据时间、地点、用户习惯自动更换应用图标,例如:
json
{
"icon": {
"day": "$media:icon_day",
"night": "$media:icon_night"
}
}
(三)跨设备配置同步
在分布式场景中,自动同步多设备的配置参数,例如:
- 手机端配置字体大小,平板/智慧屏自动应用相同设置
总结:配置的「黄金法则」📌
应用合规性 =(包名唯一性 × 权限合理性)÷ 配置冗余度
- 包名:反向域名+全小写,杜绝冲突
- 图标:多尺寸+自适应,视觉统一
- 权限:最小必要+动态申请,守护隐私
- 版本:语义化命名+双版本号,清晰迭代