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

news2024/11/15 9:00:30

        随着用户需求的不断增长,我们的 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工具,我们能够实时监控和分析构建过程,快速识别和解决性能瓶颈。除此之外,通过自定义插件和构建任务,我们灵活调整了构建流程,进一步提升了效率。这些措施不仅缩短了构建时间,还提高了开发效率和产品迭代速度,使开发团队能够更快速地响应市场需求和用户反馈,确保应用的高效交付和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2158039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM整合步骤

目录 一、Mybatis整合Spring 1、整合后的maven坐标 2、核心配置文件 3、pojo、mapper、service配置 4、单测 二、整合SpringMVC 1、引入springMVC的坐标并配置tomcat 2、核心配置文件 3、controller配置 4、启动项目并测试 SSM SpringMVC Spring Mybatis 整合顺序&#xff1…

Spring AOP - 注解方式实现

前文已经讨论了基于配置文件方式实现Spring AOP&#xff08;Spring AOP - 配置文件方式实现&#xff09;&#xff0c;本文采用注解的方式实现前文相同的功能。配置步骤如下&#xff1a; 1、项目增加aop依赖&#xff08;pom.xml) <dependency><groupId>org.springfr…

大数据:快速入门Scala+Flink

一、什么是Scala Scala 是一种多范式编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性。Scala 这个名字是“可扩展语言”&#xff08;Scalable Language&#xff09;的缩写&#xff0c;意味着它被设计为能够适应不同规模的项目&#xff0c;从小型脚本到大型分布式…

vue2 中使用 Tinymce 富文本编辑器详解

vue2.x使用Tinymce富文本 项目中Tinymce效果图安装依赖包/创建依赖文件创建skins文件夹汉化文件-zh_CN.js 封装组件Tinymce.vue组件中使用封装组件tinymce.vueTinymce 扩展插件集合 项目中Tinymce效果图 如果想先了解一下&#xff0c;可以浏览一博主整理的的TinyMCE中文文档&am…

【揭秘大脑与AI的鸿沟:电化学信号与非线性动态交互的奥秘】

目录 【揭秘大脑与AI的鸿沟:电化学信号与非线性动态交互的奥秘】 1. 信息传递的奇迹:电化学信号的奥秘 2. 非线性动态交互:大脑的智慧之源 3. 结构与功能的鸿沟:从并行分布到有限层次 结语:探索未知的边界 【揭秘大脑与AI的鸿沟:电化学信号与非线性动态交互的奥秘】…

【深度学习】【TensorRT】【C++】模型转化、环境搭建以及模型部署的详细教程

【深度学习】【TensorRT】【C】模型转化、环境搭建以及模型部署的详细教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【TensorRT】【C】模型转化、环境搭建以及模型部署的详细教程前言模型转换--pytorch转engineWindows平台搭…

[C#]winform 使用opencvsharp实现玉米粒计数

【算法介绍】 这段代码是使用OpenCvSharp库&#xff08;OpenCV的C#封装&#xff09;对图像进行处理&#xff0c;主要流程包括图像的二值化、腐蚀操作、距离变换、轮廓检测&#xff0c;并在原图上标出检测到的轮廓位置及数量。下面是对代码的详细解读&#xff1a; 初始化&…

网络通信——路由器、交换机、集线器(HUB)

注意&#xff1a;传输层&#xff0c;应用层没有网路设备 一.路由器&#xff08;网络层设备&#xff09; 1.分割广播域 2.一个接口就是一个广播域 3.一般接口位4&#xff0c;8&#xff0c;12。 4.数据转发 &#xff08;由路由表转发数据&#xff09; 5.根据路由表来进行路径选…

基于微信小程序的美食外卖管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

面试速通宝典——1

1. 内存有哪几种类型&#xff1f; ‌‌‌‌  内存分为五个区&#xff0c;堆&#xff08;malloc&#xff09;、栈&#xff08;如局部变量、函数参数&#xff09;、程序代码区&#xff08;存放二进制代码&#xff09;、全局/静态存储区&#xff08;全局变量、static变量&#…

米壳AI:自媒体如何获取高清原画质!真8K视频是这样下载的!

作为一名新手自媒体博主&#xff0c;你是不是也在各种短视频平台上疯狂搜索保存外网视频的方法和软件呢&#xff1f;&#x1f603;然而&#xff0c;真正能下载真 4K 视频的却寥寥无几。 别苦恼啦&#xff01;今天我就来给大家分享一个小编亲测过后真实好用的工具 —— 米壳 AI。…

网页通知设计灵感:CSS 和 JS 的 8 大创意实现

文章目录 前言正文1.霓虹灯风格的通知系统2.垂直时间轴通知3.动画徽章通知4.项目式通知5.多种状态通知&#xff1a;成功、错误、警告6.信息、警告、提示组件7.扁平化风格通知8.社交媒体风格弹出通知 总结 前言 网页通知如今已成为电商、社交平台等网站的常见功能&#xff0c;它…

Pandas -----------------------基础知识(二)

dataframe读写数据操作 import pandas as pd# 准备数据(字典) data [[1, 张三, 1999-3-10, 18],[2, 李四, 2002-3-10, 15],[3, 王五, 1990-3-10, 33],[4, 隔壁老王, 1983-3-10, 40] ]df pd.DataFrame(data, columns[id, name, birthday, age]) df写到csv文件中 &#xff0c;…

SOLIDWORKS 2025 重点新功能大放送(壹)

SOLIDWORKS 2025涵盖全新以用户为中心的增强功能&#xff0c;致力实现更智能、更快速地与团队和外部合作伙伴协同工作。 小索是设计部负责人&#xff0c;SOLIDWORKS资深使用者&#xff0c;使用SOLIDWORKS软件多年&#xff0c;喜欢分享&#xff0c;正在体验SOLIDWORKS 2025版本…

tensorboard展示不同运行的曲线结果

运行tensorboard曲线如下&#xff1a; tensorboard --logdir .有时候&#xff0c;曲线图会展示多条曲线&#xff0c;以至于我们想分辨哪条线来自哪次训练都做不到了。如下图是设置smoothing-0.6的结果&#xff1a; smoothing可以在页面找到设置按钮&#xff0c;呼出设置侧边…

【算法笔记】二分查找 红蓝染色法

目录 二分查找 红蓝染色法&#xff08;感谢灵神&#xff09;闭区间[left, right]左闭右开区间[left, right)开区间(left, right)变式 二分查找 红蓝染色法&#xff08;感谢灵神&#xff09; 这里是灵神的教学视频&#xff1a;二分查找 红蓝染色法_哔哩哔哩_ bilibili 学了二分…

玩转RabbitMQ声明队列交换机、消息转换器

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

中兴交换机三层配置

中兴交换机三层配置 目的&#xff1a;将1-10端口划分到3001vlan&#xff0c;11-20端口划分到3002vlan中去 客户端客户端IPvlan网关主机A88.88.1.1203001192.168.1.254主机B192.168.100.1303002192.168.100.254 1、通过Console线登录设备 **********************************…

导出导入Oracle数据库使用黑框命令方式exp、imp【亲测】

下载工具 根据自己数据库的版本下载&#xff0c;以v19为例&#xff1a; 下载基础包Basic Package和工具包Tools Package 两个压缩包中的文件夹一样&#xff0c;但内容不一样&#xff0c;将两个压缩包中的文件解压合并到一起 https://www.oracle.com/database/technologies/inst…

TLV解码 - 华为OD统一考试(E卷)

2024华为OD机试&#xff08;E卷D卷C卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 TLV编码是按 [Tag Length Value] 格式进行编码的&#xff0c;一段码流中的信元用Tag标识&#xff0c;Tag在码流中唯一不重复&#xff0c;Length表示信元Value的长度&#xff…