harmonyOS 原来构建还有这么多弯弯绕绕

        随着用户需求的不断增长,我们的 APP 已发展成功能丰富的超级APP,这也导致打包构建变得非常耗时,可能需要数小时,严重影响开发效率和产品迭代。通过采用模块化设计、增量构建、并行处理、缓存机制、优化依赖管理,以及云构建服务等策略,不仅能大幅缩短构建时间,还能提升整体开发效率,更加高效的交付业务。

1. Hvigor 高性能构建

        Hvigor作为编译构建任务流工具,它支持并行编译、增量编译等特性, 增量构建是一种通过利用缓存只构建发生变化的部分的方法,可以加快构建速度并减少资源消耗和不必要的重复编译工作,实现对代码变更的快速响应,提升构建效率。

启用增量构建: 增量构建是hvigor执行任务的一种优化,只对发生变化的部分进行编译,而不是整个项目。如果在两次执行任务工程中,执行任务的输入和输出没有更改,hvigor会跳过该任务的执行。

# 启用增量构建 hvigorw <task> --incremental

# 关闭增量构建 hvigorw <task> --no-incremental

◦并行编译:大部分工程都包含了多个子工程,其中一些子工程是相互独立的,也就是说,它们之间没有状态共享。在大多数情况下,通过并行构建可以有效地减少多个子工程的整体构建时间。默认情况下,hvigor会开启并行执行

# 启用并行执行 hvigorw <task> --parallel
# 关闭并行执行 hvigorw <task> --no-parallel

◦启动守护进程:将进程常驻在内存中,一方面避免了Node进程重复启动、减少了加载js文件的耗时,另一方面可以复用构建过程中的增量缓存、减少增量缓存信息的读取与落盘操作。重复构建同一项目时,守护进程可以将构建时间缩短。多次构建时,守护进程只会将hvigor一次性加载到内存中,而不是每一次构建。

# 启用守护进程 hvigorw <task> --daemon
# 关闭守护进程 hvigorw <task> --no-daemon

根据业务场景,合理配置增量/并行编译、开启守护进程,可以降低约 60% 的构建耗时

2. 模块化编译构建

为了提升HarmonyOS应用的开发效率和开发者体验,DevEco Studio引入了模块化编译方式,以优化传统的JSBundle化编译方案。以往的方案会为每个入口页面打包成一个独立的bundle包,不支持运行时共享,因此每当修改单个模块文件时,需要进行整包重新编译。这不仅增加了编译时间,也导致HAP包体积增大,影响开发效率。

模块化编译通过以下方式解决这些问题:

◦独立编译:模块之间相互独立编译,避免了不必要的整包重编译,从而显著加快了编译速度。

◦动态共享包(HSP):支持将多个模块的通用能力和资源提取为动态共享包,供其他模块或应用使用,减少了包体积。

◦原生ES Module规则:采用原生ES Module规则构建源码,解决了Bundle编译打包模式带来的问题,使资源文件可以以独立模块形式进行编译。

        通过这些优化,开发者在修改单个模块代码时,无需整包编译,减少了编译的代码量,加快了增量编译速度,从而提升了整体开发效率和体验。需要注意的是,模块化设计的复杂性可能增加管理成本,因此开发者需要平衡好模块化的粒度。

3. 降低应用包体积

◦配置so压缩选项减小应用包大小,在DevEco Studio中修改应用模块配置文件(如 module.json5 )中的 compressNativeLibs 字段,将其值设置为true。这样在打包应用时,so库文件将以压缩形式被打包到包中,从而减小应用包的大小

◦通过修改应用模块配置文件module.json5 中的compressNativeLibs字段为true来压缩原生库,从而进一步减少应用体积

◦使用压缩工具减小图片和音频文件的大小,并使用SVG等矢量格式代替位图图标。此外,删除项目中未被引用的资源文件也是优化资源文件的有效方法

◦共享代码和资源:通过HSP(Harmony Shared Package)共享代码和资源,避免重复,进一步优化应用的资源管理

◦启用混淆, HarmonyOS NEXT支持多种代码混淆工具,主要通过Gradle构建工具进行配置。在工程应用目录的gradle文件中设置minifyEnabled为true即可开启混淆。此外,HarmonyOS NEXT还支持ArkTS、TS和JS文件的混淆。在模块级的 build.gradle 文件中的 buildTypes 部分添加以下代码,确保在发布版本中启用混淆具体配置方法如下:

   buildTypes {
       release {
           minifyEnabled true
           proguardFiles getDefaultProguardFile('proguard-android-optimize.txt '), 'proguard-rules.pro'
       }
   }

4. 优化库管理加速构建

为了进一步优化长时间的构建我们还可以通过采用动态共享包(HSP)和静态共享包(HAR)的策略提升构建效率。动态共享包(HSP) 通过按需加载减少了不必要的编译时间,而静态共享包(HAR)在模块间实现了高效的资源共享。这些方法在实际项目中表现也足够出色,能够有效优化构建流程。

选择合适的共享包类型

▪当需要在应用内部进行代码和资源共享时,建议使用HSP。它可以包含代码、C++库、资源和配置文件,但不支持独立发布,需随宿主应用一起发布。HSP通过按需加载,减少不必要的编译时间,提高构建效率。

▪当共享包作为应用模块的依赖项被引用时,应选择HAR。它同样可以包含代码、C++库、资源和配置文件,适合用于通用组件的共享。HAR通过高效资源共享,优化了模块间的依赖管理,进一步缩短构建周期。

多任务窗口与依赖管理

▪在多任务窗口场景中,HSP通过与宿主应用同进程运行,实现了更高效的资源管理和调用。这种方式不仅减少了资源加载的延迟,还优化了内存使用,使应用在多任务环境下更流畅地运行。此外,按需加载的特性进一步提升了应用启动速度。

▪HAR在跨多个应用或模块的资源共享中表现出色。其模块化设计允许独立发布和管理,确保资源在不同应用间的高效共享。这种方法减少了重复资源的存在,降低了整体包体积,并简化了依赖管理,适合频繁更新和维护的复杂项目。通过优化资源的重用和依赖关系,提高构建效率。

懒加载技术的应用

▪懒加载技术(如LazyForEach),是一种按需加载数据或资源的策略。通过按需加载数据或资源,懒加载避免了在构建初期加载所有内容,从而减少了构建时间和资源消耗。这种方法有效降低了编译时的负担,使得构建过程更加高效。此外,懒加载减少了不必要的库加载,优化了依赖管理,进一步缩短了构建周期。

5. 性能可视化检验成果

使用Build Analyzer工具会在每次构建应用时默认生成一份报告,可以记录任务执行耗时、线程、ArkTS编译中的各环节的细分耗时情况等信息,开发者可以通过这些数据分析排查构建过程中的性能问题。

◦通过命令行生成构建分析

hvigorw assembleHap --analyze=normal --config properties.hvigor.analyzeHtml=true

◦通过hvigor-config.json5配置中properties.hvigor.analyzeHtml字段生成构建可视化html文件

"properties": { "hvigor.analyzeHtml": true // 生成构建可视化html文件 }

构建任务时间图谱,构建任务展示按照各个任务总时长占比,以相对长度进行展示。可以对时间块进行缩小放大,查看具体的任务名称及耗时信息。

6. 不止于此

通过一系列优化策略,我们显著提升了超级APP的构建效率。首先,通过模块化设计,将应用拆分为多个独立模块,减少了构建时的耦合,并提高了并行处理能力。其次,利用Hvigor的增量和并行编译特性,仅对代码变更部分进行编译,大幅缩短了构建时间。缓存机制的合理配置减少了重复数据加载,优化了资源访问速度。同时,压缩和混淆代码、优化图片和音频文件、删除未使用资源等措施有效减小了应用包体积。共享代码与懒加载技术进一步优化了资源管理。借助Build Analyzer工具,我们能够实时监控和分析构建过程,快速识别和解决性能瓶颈。除此之外,通过自定义插件和构建任务,我们灵活调整了构建流程,进一步提升了效率。这些措施不仅缩短了构建时间,还提高了开发效率和产品迭代速度,使开发团队能够更快速地响应市场需求和用户反馈,确保应用的高效交付和稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值