Skip to content

10_Engineering/01 - Hvigor 构建系统 ​

1. Hvigor 概述 ​

Hvigor 是 HarmonyOS NEXT 专用的开源构建工具,基于 Gradle 设计思路但完全重写,采用 TypeScript 编写,与 DevEco Studio 深度集成。它是 ArkTS/ArkUI 应用构建的核心基础设施。

1.1 Hvigor 与 Gradle 的对比 ​

维度HvigorGradle (Android)
语言TypeScriptKotlin/Groovy
配置格式hvigorfile.ts(TypeScript 脚本)build.gradle.kts
插件体系OpenHarmony PluginGradle Plugin
增量构建基于 ArkTS/ArkUI 源码变更检测基于文件哈希
跨平台支持原生支持多设备(手机/折叠/平板/车机)通过插件扩展
类型安全✅ TypeScript 强类型⚠️ Kotlin DSL 部分支持
与 DevEco 集成原生无缝集成需要 Android Studio 插件
并行构建支持多模块并行支持

1.2 为什么选择 Hvigor ​

  • ArkTS/ArkUI 原生支持:无需额外配置即可编译 ArkTS 代码和编译 ArkUI 声明式语法
  • TypeScript 构建脚本:与项目技术栈一致,开发者可用 IDE 自动补全
  • 增量编译优化:针对 ArkUI 组件渲染树的变更检测更精确
  • 零配置起步:DevEco Studio 脚手架自动生成正确配置

2. 构建工具链架构 ​

┌─────────────────────────────────────────────┐
│              DevEco Studio                   │
├─────────────────────────────────────────────┤
│  hvigorw (wrapper) → hvigor (core)          │
├─────────────────────────────────────────────┤
│  hvigor-node (Node.js 运行时)               │
├──────────────────┬──────────────────────────┤
│  ArkTS Compiler   │  ArkUI Compiler          │
│  (arkc)           │  (arkui-builder)         │
├──────────────────┴──────────────────────────┤
│  hvigor-plugin (插件体系)                    │
├─────────────────────────────────────────────┤
│  hvigor-config (配置解析)                    │
└─────────────────────────────────────────────┘

2.1 核心组件 ​

组件说明
hvigorw构建脚本包装器(类似 gradlew),确保版本一致
hvigor-core构建引擎核心,解析配置、管理任务依赖
hvigor-nodeNode.js 运行时,支持异步 I/O 和 TypeScript 执行
arkcArkTS 编译器(Ark TypeScript Compiler)
arkui-builderArkUI 编译器,将声明式语法编译为底层渲染树节点
hvigor-plugin插件机制,扩展构建能力

3. hvigorfile.ts 构建脚本 ​

3.1 项目根目录 hvigorfile.ts ​

typescript
import { appTasks } from '@ohos/hvigor-ohos-plugin';
import { AppEntry, HspEntry, HarEntry } from '@ohos/hvigor-ohos-plugin';

export default {
  system: appTasks,
  plugins: [
    AppEntry,    // APP 模块插件
    HspEntry,    // HSP 模块插件
    HarEntry,    // HAR 模块插件
  ],
}

3.2 模块级 hvigorfile.ts ​

typescript
import { ohosApp, ohosHar, ohosHsp } from '@ohos/hvigor-ohos-plugin';

export default {
  system: ohosApp,  // 模块类型:ohosApp / ohosHar / ohosHsp
  plugins: [
    ohosApp()       // 自动配置 ohosApp 构建流程
  ],
}

3.3 自定义 Hvigor 任务 ​

typescript
import { ohosApp, OhosAppContext } from '@ohos/hvigor-ohos-plugin';

export default {
  system: ohosApp,
  plugins: [ohosApp()],
}

// 自定义任务:在构建后生成文档
export function onPrepare(context: OhosAppContext) {
  console.log('构建准备阶段:清理缓存');
  context.hvigor.getTask('clean')?.dependsOn('preClean');
}

export function onComplete(context: OhosAppContext) {
  console.log('构建完成!产物位置:', context.outputs.bundle);
}

3.4 自定义 Hvigor 任务(高级用法) ​

typescript
import { ohosApp, OhosAppContext, TaskContext } from '@ohos/hvigor-ohos-plugin';
import { createTask } from '@ohos/hvigor';

// 定义自定义任务
const minifyArkTS = createTask('minifyArkTS', async (ctx: TaskContext) => {
  const { logger } = ctx;
  logger.info('开始 ArkTS 代码压缩...');

  // 读取 ArkTS 源文件
  const sourceDir = ctx.context.getBuildPath('ArkTSSource');
  const outputDir = ctx.context.getBuildPath('ArkTSOutput');

  // 执行压缩(调用 arkc 的压缩模式)
  await ctx.hvigor.execute('arkc', ['--minify', '--sourcemap',
    '--inputDir', sourceDir, '--outputDir', outputDir]);

  logger.info('ArkTS 压缩完成');
});

export function onPrepare(context: OhosAppContext) {
  // 将自定义任务插入到构建流程中
  context.hvigor.getTask('compileArkTS')?.dependsOn(minifyArkTS);
}

4. 构建流程详解 ​

4.1 完整构建生命周期 ​

Clean → PreBuild → Resolve → Compile → Package → Sign → Bundle
 │       │         │          │         │        │       │
 清理    资源预    依赖解析   ArkTS/   HAR/HSP  签名   生成
 旧产物   处理      依赖树    ArkUI    HAP 打包  APK    .app
                              编译              Bundle

4.2 各阶段详细说明 ​

阶段说明关键产物
clean清理上一轮构建产物无
preBuild资源预编译(res 目录处理)resources.bin
resolve解析 module.json5、依赖、配置依赖拓扑
compileArkTS编译 ArkTS 源码.bc(字节码)
compileArkUI编译 ArkUI 组件渲染节点树
compileJS编译 JS 桥接层.js 桥接代码
packageHar打包 HAR 模块.har
packageHsp打包 HSP 模块.hsp
sign代码签名(需要签名证书)签名信息
bundle生成 .app 包.app

4.3 构建命令 ​

bash
# 全量构建
hvigorw assembleApp --mode=DEBUG

# Debug 模式构建
hvigorw assembleDebug

# Release 模式构建
hvigorw assembleRelease

# 仅编译,不打包
hvigorw compileApp

# 清理构建产物
hvigorw clean

# 查看构建依赖图
hvigorw dependencies

# 指定设备构建
hvigorw assembleDebug --device=emulator-1

5. Hvigor 插件开发 ​

5.1 插件开发示例 ​

typescript
// my-custom-plugin.ts
import { HvigorPlugin, HvigorContext, TaskContext, OhosAppContext } from '@ohos/hvigor-ohos-plugin';

interface PluginConfig {
  /** 是否启用代码压缩 */
  minify: boolean;
  /** 是否生成源码映射 */
  sourceMap: boolean;
}

export class CustomMinifyPlugin implements HvigorPlugin {
  name = 'custom-minify';

  apply(context: HvigorContext, config: PluginConfig): void {
    const { logger } = context;

    // 在 ArkTS 编译后插入压缩任务
    const minifyTask = context.hvigor.createTask('customMinify', async (taskCtx: TaskContext) => {
      logger.info('自定义压缩插件执行中...');

      // 读取编译产物
      const artifactPath = taskCtx.context.getBuildPath('ArkTSOutput');

      // 执行压缩逻辑
      if (config.minify) {
        await this.minify(artifactPath);
      }

      // 生成 source map
      if (config.sourceMap) {
        await this.generateSourceMap(artifactPath);
      }

      logger.info('自定义压缩插件执行完成');
    });

    // 插入到编译任务之后
    const compileTask = context.hvigor.getTask('compileArkTS');
    compileTask?.dependsOn(minifyTask);
  }

  private async minify(dir: string): Promise<void> {
    // 实际压缩实现
  }

  private async generateSourceMap(dir: string): Promise<void> {
    // 实际 source map 生成
  }
}

// 导出插件实例
export default {
  name: 'custom-minify',
  apply: (ctx: HvigorContext) => {
    return new CustomMinifyPlugin().apply(ctx, { minify: true, sourceMap: false });
  },
};

5.2 在项目中安装自定义插件 ​

typescript
// hvigorfile.ts
import { ohosApp } from '@ohos/hvigor-ohos-plugin';
import customMinify from './plugins/custom-minify';

export default {
  system: ohosApp,
  plugins: [
    ohosApp(),
    customMinify,
  ],
}

6. 构建性能优化 ​

6.1 优化策略 ​

策略效果说明
增量编译3-5x只编译变更的 ArkTS 文件
并行构建2-3x多模块同时编译
缓存复用10-50x重用上次构建的不变产物
依赖降级渐进避免重复下载相同依赖

6.2 hvigorconfig.json 配置 ​

json
{
  "hvigor": {
    "incremental": true,
    "parallel": true,
    "cache": {
      "enabled": true,
      "maxSize": "2GB",
      "ttl": "7d"
    },
    "daemon": true,
    "daemonMaxIdleTime": 3600,
    "logging": {
      "level": "info",
      "console": true,
      "file": true
    }
  }
}

7. 面试高频考点 ​

Q1: Hvigor 和 Gradle 的核心区别是什么? ​

回答要点:

  • Hvigor 基于 TypeScript,Gradle 基于 Kotlin/Groovy
  • Hvigor 为 ArkTS/ArkUI 深度优化,Gradle 通用构建
  • Hvigor 的增量编译针对 ArkUI 渲染树做精确检测
  • Hvigor 与 DevEco Studio 原生集成,Gradle 需要插件

Q2: 如何实现自定义构建任务? ​

回答要点:

  • 通过 onPrepare / onComplete 钩子
  • 使用 createTask 创建自定义任务
  • 用 dependsOn 插入到构建流程链
  • 插件需实现 HvigorPlugin 接口

Q3: Hvigor 的增量编译原理? ​

回答要点:

  • ArkTS 层:文件 hash 对比,增量重新编译
  • ArkUI 层:组件树变更检测(diff 算法)
  • 资源层:资源文件 hash 对比
  • 产物缓存:不变产物复用,减少重复工作

Q4: 如何优化构建速度? ​

回答要点:

  • 启用缓存(hvigorconfig.json)
  • 开启并行构建(parallel: true)
  • 减少模块依赖(避免循环依赖)
  • 使用 HSP 代替 HAR 减少重复编译
  • 排除不必要的资源扫描

8. Android 对比 ​

概念Android (Gradle)HarmonyOS (Hvigor)
构建配置build.gradle.ktshvigorfile.ts + build-profile.json5
构建脚本语言Kotlin DSLTypeScript
构建包装器gradlewhvigorw
插件命名空间id 'com.android.application'ohosApp()
产物格式.apk / .aab.app
增量编译Build Cache文件 hash + ArkUI diff