HarmonyOS NEXT系列之定制化构建制品

定制化构建制品

〇、前言

上一周,为了让自己开发的工具 EasyRouter,在 ohpm 中心仓中获得满分,所以针对评分规则添加了带 example 目录的 v1.1.0 版本,然而,等到审核成功并上架后,却发现仍旧没有拿到满分,而后我在 ohpm 中心仓上找一个已经获得满分的、其他人制作的工具,查看对应的源码工程,发现 example 目录必须在 src 目录同级,才能被扫描和识别。

那么问题来了,默认情况下,编译 har 包都只会将 src 目录编译进制品中,而 src 目录同级的其他目录是不会被打包的,如果想要一起打包进去,该如何操作呢?以及推而广之,输出 har 包制品时,能不能根据需要进行定制呢?下面就让我向大家分享,如何实现定制化构建制品

一、鸿蒙工程的编译配置文件

对于使用过 make 工具管理 C/C++ 项目的人来说,一定清楚 makefile.txt在make工具中的作用:控制编译 ,而在鸿蒙工程中,也有起到控制编译作用的文件,即 build-profile.json5 文件,而该文件与 makefile.txt 存在不同的地方,只不过是区分模块级和项目级。

1、默认内容

在 DevEco Studio 中创建的项目或模块,会自动创建 build-profile.json5 文件,并且默认具有如下配置项:

json 复制代码
{
  "apiType": "stageMode",
  "buildOption": {
  },
  "buildOptionSet": [
    {
      "name": "release",
      "arkOptions": {
        "obfuscation": {
          "ruleOptions": {
            "enable": false,
            "files": [
              "./obfuscation-rules.txt"
            ]
          },
          "consumerFiles": [
            "./consumer-rules.txt"
          ]
        }
      },
    },
  ],
  "targets": [
    {
      "name": "default"
    },
    {
      "name": "ohosTest"
    }
  ]
}

如果你此前从未仔细阅读过相关官方文档,可能会认为 build-profile.json5 文件完整内容就是这样的,然而,实际上以上不过是保障项目正常运行所必须的基础配置罢了。

2、完整内容

build-profile.json5 文件作为控制编译过程的配置文件,完整内容涵盖丰富:

txt 复制代码
apiType
targets
└── name
└── runtimeOS
└── config
    └── distroFilter / distributionFilter
        └── apiVersion
            └── policy
            └── value
        └── screenShape
            └── policy
            └── value
        └── screenWindow
            └── policy
            └── value
        └── screenDensity
            └── policy
            └── value
        └── countryCode
            └── policy
            └── value
    └── deviceType
    └── buildOption
    └── atomicService
        └── preloads
            └── moduleName
└── source
    └── abilities
        └── name
        └── pages
        └── res
        └── icon
        └── label
        └── launchType
    └── pages
    └── sourceRoots
└── resource
    └── directories
└── output
    └── artifactName
showInServiceCenter
buildOption
buildOptionSet
└── name
└── debuggable
└── generateSharedTgz
└── copyFrom
└── resOptions
    └── compression
        └── media
            └── enable
        └── filters
            └── method
                └── type
                └── blocks
            └── files
                └── path
                └── size
                └── resolution
            └── exclude
                └── path
                └── size
                └── resolution
    └── resCompileThreads
    └── copyCodeResource
        └── enable
        └── includes
        └── excludes
    └── ignoreResourcePattern
    └── excludeHarRes
    └── includeAppScopeRes
└── externalNativeOptions
    └── path
    └── abiFilters
    └── arguments
    └── cppFlags
    └── cFlags
    └── targets
└── sourceOption
    └── workers
└── nativeLib
    └── filter
        └── excludes
        └── pickFirsts
        └── pickLasts
        └── enableOverride
        └── select
            └── package
            └── version
            └── includePattern
            └── excludePattern
            └── include
            └── exclude
    └── debugSymbol
        └── strip
        └── exclude
    └── headerPath
    └── collectAllLibs
    └── excludeFromHar
    └── excludeSoFromInterfaceHar
    └── librariesInfo
        └── name
        └── linkLibraries
└── napiLibFilterOption
    └── excludes
    └── pickFirsts
    └── pickLasts
    └── enableOverride
└── arkOptions
    └── runtimeOnly
        └── sources
        └── packages
        └── excludePackages
    └── types  
    └── obfuscation
        └── ruleOptions
            └── enable
            └── files
        └── consumerFiles
    └── buildProfileFields
    └── integratedHsp
    └── transformLib
    └── branchElimination
    └── byteCodeHar
    └── bundledDependencies
    └── packSourceMap
    └── autoLazyImport
    └── reExportCheckMode
    └── skipOhModulesLint
    └── apPath
    └── hostPGO
└── packingOptions
    └── asset
        └── include
        └── exclude
└── removePermissions
    └── name
buildModeBinder
└── buildModeName
└── mappings
    └── targetName
    └── buildOptionName
entryModules

原则上,就是需要控制编译过程中的什么东西,就相对应的加上什么配置。

3、认识默认配置项

在学会控制编译时,将 src 之外的目录一起打包之前,先对默认生成的配置项进行认识和了解。

build-profile.json5 文件的默认内容,主要包括三大方面:API 类型、编译混淆规则和制品输出目录。

3.1、apiType

build-profile.json5 文件中,一级字段的头一个就是 apiType,而它起到控制 API模型的作用,当前,鸿蒙工程API模型主要有 stageMode 和 faMode 两种,所以,apiType 的合法值也就是这两种。

模块级 build-profile.json5 文件中的 apiType 的值,要与项目级的保持一致。

3.2、targets

targets 配置项的功能,其实很好理解,就是控制制品的最终输出情况 ,比如生成的 har 包名称

这里主要利用到 targets 元素对象的 output 字段。

3.3、buildOptionSet

这个配置项,主要起到控制是否进行混淆编译的作用,默认只对 release 制品有配置规则。

二、自定义编译

1、目录包括

首先,看一下在进行自定义编译的时候,如何控制目录包括。

在 buildOption 配置对象里面,有一个 packingOptions 配置项:

这个配置项,正是我们实现目录包括所需要的,例如:

json 复制代码
"buildOption": {
  "packingOptions": {
    "asset": {
      "include": ["./example/*"]
    }
  }
}

就可以实现 src 目录同级的 example 目录一并打包进制品中:

而 buildOption 的其他字段的作用,分别如下:

而 arkOptions 在实现跨模块路由功能的介绍中,已经使用过 runtimeOnly 配置。

对编译过程进行控制,基本上就是利用 buildOption 中的相关配置项,而详细的说明可以参考官方文档:自定义编译指导

相关推荐
前端不太难38 分钟前
HarmonyOS 游戏里,Ability 是如何被重建的
游戏·状态模式·harmonyos
lbb 小魔仙1 小时前
【HarmonyOS实战】React Native 鸿蒙版实战:Calendar 日历组件完全指南
react native·react.js·harmonyos
一只大侠的侠1 小时前
Flutter开源鸿蒙跨平台训练营 Day 3
flutter·开源·harmonyos
盐焗西兰花1 小时前
鸿蒙学习实战之路-Reader Kit自定义字体最佳实践
学习·华为·harmonyos
_waylau2 小时前
鸿蒙架构师修炼之道-架构师的职责是什么?
开发语言·华为·harmonyos·鸿蒙
一只大侠的侠2 小时前
【Harmonyos】Flutter开源鸿蒙跨平台训练营 Day 2 鸿蒙跨平台开发环境搭建与工程实践
flutter·开源·harmonyos
小镇敲码人5 小时前
华为CANN框架中HCCL仓库的全面解析:分布式通信的引擎
分布式·华为
王码码20355 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
坚果派·白晓明6 小时前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
小镇敲码人6 小时前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann