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 中的相关配置项,而详细的说明可以参考官方文档:自定义编译指导

相关推荐
拉轰小郑郑18 小时前
鸿蒙ArkTS中Object类型与类型断言的理解
华为·harmonyos·arkts·openharmony·object·类型断言
2601_9495936518 小时前
基础入门 React Native 鸿蒙跨平台开发:Animated 动画按钮组件 鸿蒙实战
react native·react.js·harmonyos
菜鸟小芯18 小时前
【开源鸿蒙跨平台开发先锋训练营】DAY8~DAY13 底部选项卡&推荐功能实现
flutter·harmonyos
星辰徐哥18 小时前
鸿蒙APP开发从入门到精通:页面路由与组件跳转
华为·harmonyos
爱吃大芒果18 小时前
Flutter for OpenHarmony 实战: mango_shop 资源文件管理与鸿蒙适配
javascript·flutter·harmonyos
大雷神20 小时前
HarmonyOS智慧农业管理应用开发教程--高高种地--第20篇:天气服务与气象数据
harmonyos
爱吃大芒果20 小时前
Flutter for OpenHarmony 适配:mango_shop 页面布局的鸿蒙多设备屏幕适配方案
flutter·华为·harmonyos
前端不太难20 小时前
没有文档模型,HarmonyOS PC 应用会发生什么?
华为·状态模式·harmonyos
2601_9495936520 小时前
高级进阶 React Native 鸿蒙跨平台开发:LinearGradient 玻璃拟态卡片
react native·react.js·harmonyos
摘星编程20 小时前
在OpenHarmony上用React Native:TopTab顶部标签页
react native·react.js·harmonyos