首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

HarmonyOS( Beta5版)鸿蒙开发:应用操作系统IPC通信使用指导

  • 25-03-03 06:43
  • 2207
  • 11483
blog.csdn.net

背景

应用使用操作系统提供的IPC(Inter-Process Communication,进程间通信)机制进行跨进程通信是通用场景, 当前系统基于Binder驱动封装了一套IPC机制,提供了应用和系统服务间的跨进程通信能力。

IPC机制方便了进程之间的交互和通信,但是,不合理的使用IPC通信会对应用性能造成影响。

在应用主线程中进行IPC通信,消息的发送和接收需要等待对方进程的响应,这会对应用主线程造成阻塞。如果操作耗时较长或者频率较高,产生的时延会引起页面卡顿、丢帧。

进行IPC通信时需要进程上下文切换,从一个进程或线程切换到另一个进程或线程,会造成CPU时间片的浪费,从而降低应用性能。

为了保持数据的一致性和正确性,需要使用进程同步和互斥机制,在进程之间进行协调。每个进程在对资源操作前都尝试加锁,操作结束解锁,产生了锁的获取和释放等额外开销。

所以,在一些对性能要求高的场景:多人在线游戏、视频编辑、实时通信和视频等,IPC通信是一个重要优化点。

优化思路

在应用开发过程中,合理使用IPC通信是确保应用性能和用户体验的关键因素。然而,不合理的IPC通信可能会导致性能问题。因此,可以从以下几个方面进行优化。

本地缓存数据:合理使用本地缓存,将常用的数据存储在本地,而不是每次都通过IPC请求。这可以减少不必要的通信次数。确保缓存数据的有效期和更新策略是合理的,以防止缓存数据过期或不一致。

批处理请求:将多个IPC请求合并成一个批处理请求,从而减少通信的次数。这对于频繁的小数据请求尤其有用。例如,在获取多个设置项时,可以一次性请求所有设置项而不是分别请求每个设置项。

异步处理:对于不需要立即响应的IPC请求,可以将它们设置为异步处理,以免阻塞主线程。例如,后台数据同步可以在后台线程中进行,而不会影响用户界面的响应。

减少不必要的数据传输:确保只传输应用所需的数据,避免传输不必要的信息。

场景示例 1

当前应用程序模块需要进行耗时计算,由应用程序进程和执行计算任务进程间进行IPC通信。

问题:前台发送计算任务请求后,一直处于获取计算结果状态,界面卡死无法进行其他操作。

分析:通过耗时分析工具Time Profiler观察到,在页面跳转过程中,ArkTS Callstack泳道存在大量的函数调用栈,总耗时达3.4s,阻塞了UI绘制渲染。 

img

提出方案

1.可以先读取应用中的缓存数据,如果已经存在相同任务的计算结果,那么就不依赖于IPC通信进行获取数据。

2.单次大数据耗时IPC通信,改为多次小数据异步IPC通信。

方案实施:

通过读取缓存目录下的缓存数据,进行数据对比

  1. // 获取缓存数据
  2. getCacheData(key: string) {
  3. try {
  4. let context = getContext(this) as common.UIAbilityContext;
  5. let cacheFilePath = context.cacheDir + '/ComputeResult.txt'; // 应用沙箱缓存目录
  6. let computeResult = JSON.parse(fs.readTextSync(cacheFilePath));
  7. // 是否存在已有耗时任务
  8. if (computeResult[key] === undefined) {
  9. return undefined
  10. }
  11. return computeResult[key]
  12. } catch (e) {
  13. console.error('getCacheData failed' + JSON.parse(e));
  14. }
  15. }

通过获取到缓存数据结果,决定是否发送IPC通信请求

  1. if (this.getCacheData(this.taskId)) {
  2. // 获取缓存数据
  3. this.result = this.getCacheData(this.taskId);
  4. } else {
  5. // 写入数据
  6. data.writeStringArray(sendData);
  7. // 发送IPC通信请求
  8. await ReceivedData.sendMessageRequest(REQUEST_CODE, data, reply, option);
  9. }

大数据IPC通信改为小数据批量IPC通信

  1. if (this.getCacheData(this.taskId)) {
  2. this.result = this.getCacheData(this.taskId);
  3. } else {
  4. let chunkSize = 10;
  5. for (let i = 0;i < sendData.length; i += chunkSize) {
  6. let chunk = sendData.slice(i, i + chunkSize);
  7. // 写入数据
  8. data.writeStringArray(chunk);
  9. await ReceivedData.sendMessageRequest(REQUEST_CODE, data, reply, option);
  10. }
  11. }

运行效果:

应用读取缓存后,运行时效果如下泳道图所示:

img

在ArkTS Callstack泳道中,可以看出当前的进程中没有大量的computed耗时任务,而是直接调用getCacheData获取缓存数据,减少了应用IPC通信次数。

拆分大数据后,运行时效果如下泳道图所示:

img

在ArkTS Callstack泳道中,当前应用进程的computed耗时任务由3.4s变为227ms,性能优化明显。

场景示例 2

问题:应用包含Page A和Page B两个页面,Page B的主体视图是Tabs组件,Tabs组件内包含首页、WiFi列表页等数个页签,默认展示首页页签。从Page A跳转到Page B时,页面加载时间较长。

分析:通过耗时分析工具Time Profiler对页面跳转过程进行录制并分析,观察ArkTS Callstack泳道发现该过程频繁调用getScanInfoList方法,产生阻塞。

img

提出方案:通过查阅接口文档,getScanInfoList功能为获取当前扫描到的热点列表,是同步接口,会阻塞主线程。考虑到Page B的首页页签并不展示热点列表,只有在用户切换到WiFi页签时才需要展示,该扫描操作在页面跳转过程中是不必要的。因此,将该功能放在切换WiFi列表页签的处理逻辑中。

方案实施:

将Page B中aboutToAppear生命周期函数中获取热点列表的方法ipcTask移除。在Page B的Tabs组件WiFi页签中自定义组件WiFiItem,用于展示WiFi列表,将该ipcTask移动到WiFiItem组件的aboutToAppear生命周期函数中。

  1. aboutToAppear() {
  2. this.ipcTask();
  3. }
  4. ipcTask() {
  5. let count = 0;
  6. while (count < 100) {
  7. let data = wifiManager.getScanInfoList();
  8. count++;
  9. }
  10. }

img

调整位置后,Page A到Page B的跳转过程耗时明显缩短,提升了用户体验。

总结

合理使用IPC通信对于优化应用程序性能至关重要。通过场景分析、逻辑优化和合理的权衡,可以确保IPC通信不成为应用性能的瓶颈,从而提供更出色的用户体验。

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:


 鸿蒙(HarmonyOS NEXT)最新学习路线

​

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频学习教程+学习PDF文档

HarmonyOS Next 最新全套视频教程

  纯血版鸿蒙全套学习文档(面试、文档、全套视频等)              

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux42834 人正在系统学习中
鸿蒙NEXT全套学习资料
微信名片
注:本文转载自blog.csdn.net的让开,我要吃人了的文章"https://blog.csdn.net/weixin_55362248/article/details/141681211"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top