应用签名生成 4 个文件,构建配置只用到其中 3 个
起因
第一次给应用配签名,我以为点一下"自动生成"就完事了。
配完打开构建配置一看,多出一堆文件:四个后缀各不相同的证书类文件,还有一个目录。而配置文件里只引用了其中三个。
这篇文章把这套东西拆开讲清楚:哪个文件是干什么的,为什么生成了四个却只用三个,以及配签名时最容易卡住的地方。
一、先看结果:四个文件,一个目录
打开自动生成签名后,产物会落在用户目录下的 .ohos\config 里。我这边看到的是:
.ohos\config\
├── default_MyApplication_....cer 证书
├── default_MyApplication_....csr 证书请求
├── default_MyApplication_....p12 密钥库
├── default_MyApplication_....p7b Profile
└── material\ 素材目录
四个文件,后缀都不重复。名字里那串长字符是自动生成的唯一标识,同一个账号下不同工程的标识不同,所以你的文件名和我的不会一样。
注意这个差异:工程名带在文件名里。 也就是说,如果你改了工程名或者换了包名,之前生成的这批文件不会跟着改名,需要重新生成。
二、四个文件分别是干什么的
按签名链路的顺序说,这样容易记住。
.p12 是密钥库。 里面装着你的私钥,这是整个签名体系的根。构建时会用它来对安装包做签名。
.csr 是证书请求。 它是用私钥生成的一段请求信息,用途是"向证书颁发机构申请一张证书"。这个文件只在申请证书那一步用一次,申请完就没有后续用途了。
.cer 是证书。 它证明"这个公钥确实属于这个开发者",由申请流程签发生成。构建时会把它一起打进安装包。
.p7b 是 Profile。 它把证书、包名、授权能力这几样东西绑在一起。安装包最终能不能被设备接受,很大程度看这个文件。它也是唯一一个和"具体哪个应用"绑定的文件,另外三个是开发者身份层面的东西。
三、构建配置只引用三个
打开 build-profile.json5,看 signingConfigs 那一段,实际引用的是这些:
certpath 指向 .cer
storeFile 指向 .p12
profile 指向 .p7b
keyAlias debugKey
signAlg SHA256withECDSA
keyPassword 一串密文
storePassword 一串密文
三个文件路径,都在这里。.csr 不在。
这不是遗漏,是设计。.csr 的任务在申请证书那一刻就完成了,构建阶段不需要它。
所以如果你在某份教程里看到有人让你手动指定 .csr 路径,那大概是搞混了流程。
四、密码字段存的不是你的密码
这是我当时最困惑的一处。
build-profile.json5 里的 storePassword 和 keyPassword,值是两串很长的十六进制字符串。它不是明文密码,也不是你自己填的那个密码。
自动生成签名时,DevEco 会自己生成一对密码并加密存储,你从头到尾都不需要知道它们是什么。所以你也不必去"记住密码"。
但这件事有个副作用:你不能直接改配置文件来换密码。 想换,得重新走一次签名配置,让它重新生成。
如果你的团队需要把签名配置共享给其他人或 CI,正确的做法不是拷这两个字段,而是用环境变量或者专门的凭据管理,把那串密文当机密对待。
五、配签名最容易卡住的地方
我第一次配的时候,报错是这样的:
缺少设备导致无法新建 profile 文件,请先通过 IP 或 USB 连接设备。
原因:自动生成 Profile 需要一个已经连接中的设备。 没有设备,它不知道你的应用要装到哪种设备上,也无法确定设备类型,于是建不了 Profile。
解法是把顺序反过来:先启动模拟器或连上真机,等设备就绪,再回来配签名。
判断设备有没有连上,可以用 SDK 工具链里的 hdc(在 sdk/default/openharmony/toolchains/ 目录下):
hdc list targets
返回一个地址(形如 127.0.0.1:5555)就说明已经连上;返回空就是还没有设备。
顺带说,那个报错对话框自己还给了一条退路:
如果是在模拟器上安装 HAP 包,可以跳过签名这一步骤。
也就是说纯本地调试场景下,签名不是硬门槛。但要往真机装、要打包分发,就必须配。
六、一个容易漏的建工程选项
配好签名之后如果还报设备类型相关的错,回头看去建工程那一步。
新建工程时有个「设备类型」勾选组,默认只勾了 Phone。
如果你的目标设备是平板、折叠屏、2in1 或车机,这里必须补勾。 设备类型会写进模块配置,没勾的类型在安装时可能被拦下来。
这一步在建工程时就该做完。 等项目都写完了再回头改,虽然能改,但会多绕一圈。
七、换机器之后怎么办
签名产物默认放在用户目录下,不在工程里。这带来一个后果:
把工程拷到另一台机器,签名配置会失效,因为那台机器上没有对应的证书文件。
正确做法是团队共用一份签名配置,或者每台机器各自生成一份。不要直接把整个 .ohos 目录提交到代码仓库,那里面有私钥。
如果确实需要用固定签名(比如分发测试包),就把那几个文件放在团队约定的位置,通过环境变量引用,而不是写死在 build-profile.json5 的绝对路径里。
几处和常见理解不一样的地方
- 自动签名会生成四个文件:
.cer证书、.csr证书请求、.p12密钥库、.p7bProfile - 构建配置只引用三个,
.csr不参与构建,它只在申请证书时用一次 - 配置里的密码字段不是明文,是自动生成的加密串,你不需要知道内容,也改不了
- 配签名要先有设备,否则报「缺少设备导致无法新建 profile 文件」
- 新建工程时设备类型默认只勾 Phone,目标设备是平板或折叠屏要补勾
- 签名产物在用户目录不在工程里,换机器会失效,别把
.ohos提交到仓库
配签名之前,先做两件事:启动一台设备并确认 hdc list targets 能看到它,以及检查工程的设备类型是否勾全。这两件事做好,剩下的就是点一个勾选框。
补充说明:本篇没有配图。所有结论来自本机的实际配置过程与生成后的文件核对;涉及路径与文件名的部分以本机实测为准。不同工程、不同账号下生成的文件名会不一样,这一点在文中已说明。运行期差异可能随版本变化,遇到不一致时以本机实测为准。
本系列其他文章
- 我把 HarmonyOS 的折叠屏 API 翻了一遍:10 个折叠状态,你大概只处理了 3 个
- 我读了 HarmonyOS 的断点声明:有 5 个档位,高度断点算的其实是宽高比
- 画中画起不来的三种原因:设备支持、设置开关、窗口可见是三件事
- 悬浮窗有 6 个状态,第 5 个叫"在悬浮球里"
- 窗口舞台的两套生命周期枚举:4 个成员同名,其中 2 个的值不一样
- 打点 API 分两代:API 8 的老三件套,API 19 的新五件套
- 线程优先级有三个枚举,HIGH 在其中两个里是 0,在另一个里是 2
- 泄漏监测的阈值分前后台:前台默认 5,后台默认 1
- V1 写 aboutToAppear(),V2 写 @ComponentAppear:同一个生命周期的两种写法
- 没有真机测多设备适配:模拟器要改四个路径,有三件事它做不到
- 日志级别从 3 开始,两个设级别的方法对 debug 应用还都不生效
- hiAppEvent 干两件事:你主动写事件,系统自动抓六类故障
更多推荐


所有评论(0)