
鸿蒙-hvigor定制构建 原创
目录
前言
之前需要发版时都是在开发机上修改一下相关配置,比如签名文件、三方SDK参数等,然后打包上传到应用商店。略显繁琐,也担心某次打包会有漏改错改的配置。现在使用jenkins搭建了构建流水线,希望可以根据传入的参数不同,替换配置文件中的字段。翻看文档后发现可以在hvigorfile.ts
中接收部分编译配置。
BuildProfile
该类和 Android 项目中的 BuildConfig类很像,也是在编译构建时生成的。我们可以通过该类在运行时获取编译构建参数,也可以在build-profile.json5
中通过buildProfileFields增加自定义字段,从而在运行时获取自定义的参数。
实践
项目代码已经迭代了将近10年,有些功能的添加没有办法做到完美向下兼容,只能在请求参数中添加当前应用版本号,服务端根据版本号来判断需要下发哪些数据。但鸿蒙版本是刚开发开发,在一个版本内无法完成全部功能,需要分版本按紧急程度开发,因此版本号也不能直接和 Android、iOS 对齐,也是从 1.0.0 版本开始发版。所以无法在请求参数中直接传递应用版本号。因此我们将当前适配的版本号写入到BuildProfile.ets
文件中,方便各个业务调用。
我们在项目根目录下的build-profile.json5
文件中添加如下内容就可以将自定义的字段写入到该文件中.
自定义参数可以在buildOption
、buildOptionSet
、targets
节点下的arkOptions
子节点中通过增加buildProfileFields
字段实现,自定义参数通过key-value
键值对的方式配置,其中value
取值仅支持number
、string
、boolean
类型。
当然,该配置也可以在模块下的build-profile.json5
中配置。优先级如下:
模块级target > 模块级buildOptionSet > 模块级buildOption > 工程级product > 工程级buildModeSet
这里我们添加了version_to_servier
字段来表示当前应用适配到了哪个版本。
正常情况下,我们运行代码就可以在${moduleName} / build / ${productName} / generated / profile / ${targetName}
目录下生成BuildProfile.ets
文件。
也可以在命令行执行hvigorw GenerateBuildProfile
。
也可以选中需要编译的模块,在菜单栏选择Build > Generate Build Profile ${moduleName}
。
也可以在菜单栏选择Build > Build Hap(s)/APP(s) > Build Hap(s)”或“Build > Build Hap(s)/APP(s) > Build APP(s)
。
使用时可以这么用
替换模块module.json5字段的值
我们使用了某三方SDK,需要在模块下module.json5
文件中添加对应的id
为了区分测试环境和生产环境,xxx_APPID
配置了不一样的值,我们期望是打包时通过命令行参数来修改这个值,避免认为配置出现错误。
实践
使用命令行hvigorw
打包时除了buildMode
、debuggable
等参数外,还支持--config properties.key=value
进行自定义参数。并且在模块下、工程下的hvigorfile.ts
中都可以接收到该参数。
这里我们定义了布尔类型的online
参数来表示是否为发版包,当模块下的hvigorfile.ts
文件中根据该字段的值来区分配置的参数。
具体代码如下,在模块下的hvigorfile.ts
文件中:
在打包构建时只需要执行
就可以直接替换为生产环境的配置了。因为平时开发都是直接点 IDE 中的 run 进行调试,不会传入该参数,也就不会影响文件中原本配置的值。
打包签名
上面也提到自定义的参数也可以在工程下的hvigorfile.ts
接收到该参数,上面BuildProfile
中也提到在工程下的build-profile.json5
添加了自定义字段online
。我们同样可以根据命令行参数替换掉。同时也将配置的测试签名文件删除,只构建产物,随后再使用命令行进行签名。
代码如下,在工程根目录下的hvigorfile.ts
文件中
打包的时候,由于上架需要 app 文件,所以我们需要打 release 模式的 app 文件。测试时需要打release 模式的hap 文件:
这样我们就将BuildProfile
文件中的online
值改为传入的值,同时也清除了签名文件配置。
这里需要注意的是,如果执行的是assembleApp
,则产物是在项目根目录build/outputs/${productName}/xxx-default-unsigned.app
。如果执行的是assembleHap
,则会在${moduleName}/build/${productName}/outputs/${productName}/entry-default-unsigned.hap
.
下面我们对产物进行签名。
我们可以把打包签名的流程写在文件(build.sh)中,每次去执行这个文件就好了
打包时,如果需要打测试包,则执行 build.sh --debug
,如果要打发版包,则执行build.sh --release
