当前位置: 首页 > news >正文

鸿蒙开发工程师面试-架构篇

1. 假如让你负责鸿蒙App架构设计,你会关注哪些方面?

  • 分层架构设计

    • 将应用划分为产品定制层、基础特性层和公共能力层,以降低层间依赖性,提升代码可维护性。
    • 通过分层架构设计,进一步明确每层的职责和层间交互机制,为开发者提供清晰且结构化的开发框架。
  • 模块化设计

    • 将应用分解为多个功能模块,每个模块负责执行特定功能。
    • 提高代码的可理解性和可复用性,简化应用的扩展和维护,降低系统各部分间的耦合度。
  • 应用导航设计

    • 在应用划分为多功能模块后,通过Navigation导航设计实现业务模块间的解耦。
    • 轻松实现不同业务模块之间的页面跳转交互。

2. HarmonyOS应用的分层架构包括几个层次,各自主要存放什么?

产品定制层

  • 内容:专注于满足不同设备或使用场景的个性化需求,包括UI设计、资源和配置,以及特定场景的交互逻辑和功能特性。
  • 特点:功能模块独立运作,依赖基础特性层和公共能力层实现具体功能。作为应用入口,直接与用户互动,可灵活调整和扩展以满足各种使用场景。

基础特性层

  • 位置:位于公共能力层之上。
  • 内容:存放基础特性集合,如相对独立的功能UI和业务逻辑实现。
  • 特点:高内聚、低耦合、可定制,支持产品的灵活部署。为上层提供稳健且丰富的基础功能支持(UI组件、基础服务等),并依赖于公共能力层提供的通用功能和服务。

公共能力层

  • 内容:集中存放公共基础能力,如公共UI组件、数据管理、外部交互以及工具库等共享功能。
  • 作用:为上层的基础特性层和产品定制层提供稳定可靠的功能支持,确保整个应用的稳定性和可维护性。
  • 部署模型:Entry类型HAP代表应用入口点,Feature类型HAP包含特定功能模块,支持模块化适配和部署。

3. 你刚才所讲的HAP是什么,简单描述下?

HAP(Harmony Ability Package):是应用安装和运行的基本单元。由代码、资源、第三方库、配置文件等打包生成的模块包,主要分为entry和feature两种类型:

  • entry:应用的主模块,作为入口提供基础功能。
  • feature:应用的动态特性模块,作为能力扩展,可根据用户需求和设备类型选择性安装。

使用场景

  • 单HAP:适用于只包含UIAbility组件的简单应用,优先采用单个entry包开发,推荐“一个UIAbility+多个页面”的方式避免资源浪费。
  • 多HAP:适用于功能复杂、需使用ExtensionAbility组件的应用,采用entry包+多个feature包的方式开发,需注意避免库文件重复打包问题。

4. 如何实现多个模块或多个工程共享ArkUI组件、资源等相关代码?

HAR(Harmony Archive):作为静态共享包,可包含代码、C++库、资源和配置文件。通过HAR实现多个模块或工程间的ArkUI组件、资源等代码共享。

使用场景

  • 二方库:发布到OHPM私仓,供公司内部其他应用使用。
  • 三方库:发布到OHPM中心仓,供其他应用使用。

HSP(Harmony Shared Package):作是动态共享包,可以包含代码、C++库、资源和配置文件,通过HSP可以实现代码和资源的共享。HSP不支持独立发布,而是跟随其宿主应用的APP包一起发布,与宿主应用同进程,具有相同的包名和生命周期。

使用场景

  • 多个HAP/HSP共用的代码和资源放在同一个HSP中,可以提高代码、资源的可重用性和可维护性,同时编译打包时也只保留一份HSP代码和资源,能够有效控制应用包大小。。
  • HSP在运行时按需加载,有助于提升应用性能。
  • 同一个组织内部的多个应用之间,可以使用集成态HSP实现代码和资源的共享。

5. 谈谈你对模块化设计的看法?

模块化不仅是一个设计原则,更是一种深入开发实践的核心概念。它倡导将复杂的应用程序拆解为多个功能独立的模块,每个模块聚焦于特定的功能或特性。这种设计方式使得模块能够独立开发、编译、测试及部署,极大提高了开发效率和可维护性。同时,模块化设计也支持在不同设备和场景下灵活组合与调用模块,进一步增强了应用的灵活性和可扩展性。

应用开发者需基于自身技术架构的考量,选择适宜的工程模块化模型。值得注意的是,工程模块化模型并非一成不变,而应随着业务和技术架构的演进不断优化调整。在HarmonyOS中,开发者可根据具体需求,在HAP、HAR和HSP三种类型中灵活选择,以实现最佳的设计效果。

  • 对于具备独立运行和安装能力的模块,HAP包是首选,且通常以Feature类型的HAP形式存在于应用中。
  • 对于那些不具备独立特性或用户使用频率较低的模块,则适宜采用HSP按需加载模块的形式,以节省资源并提升应用性能。
  • 而对于需要跨工程共享的模块,HAR包则成为了不可或缺的选择,它能够通过OHPM仓实现资源的共享与复用。然而,由于HAR是静态共享库,在多HAP或按需加载场景下可能会存在物理上的多份拷贝问题,因此合理采用公共HSP模块壳,对于优化App Size至关重要。

6. 应用导航如何设计?

在应用设计中,导航设计是关乎用户体验的重要环节。HarmonyOS提供了强大的Navigation组件,作为路由导航的根视图容器,它通常作为Page页面的根容器使用。Navigation组件内部集成了标题栏、内容区和工具栏等元素,其中内容区可根据路由配置动态展示不同的导航内容或页面。

为实现业务模块间的解耦与高效管理,建议将路由功能抽取为独立的RouterModule模块,并以HAR包形式存在。RouterModule负责内部路由的管理,并对外提供RouterModule对象供其他模块调用。由于Entry.hap是应用的主入口,利用其特性将其作为业务模块的依赖注册中心,可有效简化模块间的依赖关系。在入口模块中,通过Navigation组件依赖其他业务模块,而业务模块则仅依赖RouterModule进行路由管理,从而实现了业务模块间的松耦合设计。

7. 面对应用并发设计,你会如何做?

面对应用并发设计挑战,需从多个维度进行综合考量与规划:

  1. 明确并发需求:首先需清晰界定应用的并发需求,识别出哪些任务为耗时操作、哪些为常驻任务、哪些需并发执行以及哪些需顺序执行等。

  2. 选择合适的并发模型:根据并发需求选择合适的并发模型。HarmonyOS提供了TaskPool和Worker两种并发模型:TaskPool适用于处理相对独立的耗时任务;Worker则适用于处理长耗时且并发量不大的常驻任务。

  3. 设计线程间通信机制:合理设计线程间通信机制,确保数据在不同线程间能够正确传递与同步。

  4. 设置任务优先级与调度策略:根据业务场景设置合理的任务优先级与调度策略,确保高优先级任务能够优先执行。HarmonyOS的TaskPool提供了多任务优先级调度机制,可灵活应用。

  5. 实现任务延时调度:对于需延时执行的任务,利用TaskPool的延时调度功能进行安排,以避免对应用启动耗时或其他重要任务造成干扰。

  6. 处理线程间模块共享问题:针对进程唯一的ArkTS实例等共享资源,可考虑在ArkTS子线程中初始化并完成后续操作,以避免阻塞主线程执行。

  7. 优化并发性能:持续优化并发性能,通过减少线程数量、优化通信机制及合理设置任务优先级等手段提升应用性能。

8. 鸿蒙中的应用切面编程都可以来干什么?

在HarmonyOS中,应用切面编程(AOP)是一种强大的编程范式,它允许开发者在不修改源代码的情况下,为应用中的方法增加额外的行为。切面编程可应用于多个场景,包括但不限于:

  • 参数校验:在方法执行前插入参数校验逻辑,确保输入参数的合法性。
  • 日志记录:在方法执行前后记录日志,便于追踪方法执行情况及进行问题排查。
  • 性能统计:统计方法的调用次数和执行时间,为性能分析和优化提供依据。
  • 异常处理:对方法返回值进行校验,并在不符合预期时抛出异常或进行其他处理。
  • 成员变量监测:在方法执行时监测成员变量状态,确保数据完整性和准确性。
  • 方法替换:在特定情况下替换原方法实现,以适应业务变更或性能优化需求。
  • 应用跳转监控:在应用跳转时,感知到目标应用的包名,实现对目标应用的识别和监控,以确保跳转操作的安全性和准确性。例如,通过插桩操作可以获得Want参数的bundleName属性,从而实现对目标方法的监控和定制。

相关文章:

鸿蒙开发工程师面试-架构篇

1. 假如让你负责鸿蒙App架构设计,你会关注哪些方面? 分层架构设计: 将应用划分为产品定制层、基础特性层和公共能力层,以降低层间依赖性,提升代码可维护性。通过分层架构设计,进一步明确每层的职责和层间交…...

【Redis】持久化

对于Redis中间件来说,一般是作为内存型数据库或者缓存出现的。但是由于其数据是在内存中,因此当Redis所在的主机宕机之后,数据就会消失,再次重启之后,没有任何数据。这对于生产环境来说,是属于P0级别的灾难…...

港股指数实时行情API接口

港股 指数 实时 行情 API接口 # Restful API https://tsanghi.com/api/fin/index/HKG/realtime?token{token}&ticker{ticker}指定指数代码,获取该指数的实时行情(开、高、低、收、量)。 更新周期:实时。 请求方式&#xff1a…...

Qt5开发实战_图形_QPen

Qpen是Qt框架中的一个类,用于定义绘制线条的属性,包括颜色、宽度、样式、端点样式和连接样式。 具体属性(设置颜色和设置宽度直接pass从样式开始): 设置样式: pen的样式主要有以下几种: 分别是:直线样式…...

linux进程周边知识——内核对硬件的管理——计算机世界的管理

前言:本节主要讲解内核也就是操作系统对于硬件的管理, 本节内容同样为进程的周边知识。 主要是关于软件方面, 和我的上一篇——冯诺依曼体系结构可以说是兄弟文章, 这篇文章主要是关于硬件方面。 两篇文章都是为学习进程做准备。但…...

同声传译语音合成接口,分段预合成实现丝滑的衔接效果

背景: 在使用微信官方语音合成插件的时候遇到一个问题,textToSpeech这个api的内容限制在官网的文档上明明是1000个字节,也就是说能保证333个中文字符应该是没有问题的,但是也不知道为什么我这里仅仅传了150个中文字符就报错了&…...

数据结构——单链表详解(超详细)(1)

前言: 小编在近日学习了单链表的知识,为了加强记忆,于是诞生了这一篇文章,单链表是数据结构比较重要的知识,读者朋友们一定要去好好的学习!这个可以说是比顺序表更好用的线性表,下面废话不多说&…...

在 Linux 上使用 lspci 命令查看 PCI 总线硬件设备信息

lspci 命令用于显示 Linux 系统上的设备和驱动程序 当在个人电脑或服务器上运行 Linux 时,有时需要识别该系统中的硬件。lspci 命令用于显示连接到 PCI 总线的所有设备,从而满足上述需求。该命令由 pciutils 包提供,可用于各种基于 Linux 和…...

python数据可视化(6)——绘制散点图

课程学习来源:b站up:【蚂蚁学python】 【课程链接:【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接:【链接】】 Python绘制散点图查看BMI与保险费的关系 散点图: 用两组数据构成多个坐标点,考察…...

【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)

​​​​​​​ 目录 一、引言 二、自动语音识别(automatic-speech-recognition) 2.1 概述 2.2 技术原理 2.2.1 whisper模型 2.2.2 Wav2vec 2.0模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数​​​​​​​ 2.3.2 pipeline对象使用参数…...

Mysql-错误处理: Found option without preceding group in config file

1、问题描述 安装MYSQL时,在cmd中“初始化”数据库时,输入命令: mysqld --initialize --consolecmd报错: D:\mysql-5.7.36-winx64\bin>mysql --initialize --console mysql: [ERROR] Found option without preceding group …...

[iOS]内存分区

[iOS]内存分区 文章目录 [iOS]内存分区五大分区栈区堆区全局区常量区代码区验证内存使用注意事项总结 函数栈堆栈溢出栈的作用 参考博客 在iOS中,内存主要分为栈区、堆区、全局区、常量区、代码区五大区域 还记得OC是C的超类 所以C的内存分区也是一样的 iOS系统中&a…...

sklearn基础教程:掌握机器学习入门的钥匙

sklearn基础教程:掌握机器学习入门的钥匙 在数据科学和机器学习的广阔领域中,scikit-learn(简称sklearn)无疑是最受欢迎且功能强大的库之一。它提供了简单而高效的数据挖掘和数据分析工具,让研究人员、数据科学家以及…...

【unity实战】使用unity制作一个红点系统

前言 注意,本文是本人的学习笔记记录,这里先记录基本的代码,后面用到了再回来进行实现和整理 素材 https://assetstore.unity.com/packages/2d/gui/icons/2d-simple-ui-pack-218050 框架: RedPointSystem.cs using System.…...

开发指南046-机构树控件

为了简化编程&#xff0c;平台封装了很多前端组件。机构树就是常用的组件之一。 基本用法&#xff1a; import QlmOrgTree from /qlmcomponents/tree/QlmOrgTree <QlmOrgTree></QlmOrgTree> 功能&#xff1a; 根据权限和控制参数显示机构树。机构树数据来源于核…...

SpringBatch文件读写ItemWriter,ItemReader使用详解

SpringBatch文件读写ItemWriter&#xff0c;ItemReader使用详解 1. ItemReaders 和 ItemWriters1.1. ItemReader1.2. ItemWriter1.3. ItemProcessor 2.FlatFileItemReader 和 FlatFileItemWriter2.1.平面文件2.1.1. FieldSet 2.2. FlatFileItemReader2.3. FlatFileItemWriter 3…...

如何评估AI模型:评估指标的分类、方法及案例解析

如何评估AI模型&#xff1a;评估指标的分类、方法及案例解析 引言第一部分&#xff1a;评估指标的分类第二部分&#xff1a;评估指标的数学基础第三部分&#xff1a;评估指标的选择与应用第四部分&#xff1a;评估指标的局限性第五部分&#xff1a;案例研究第六部分&#xff1a…...

程序员学CFA——经济学(七)

经济学&#xff08;七&#xff09; 汇率外汇市场外汇市场的功能外汇市场的参与者卖方买方 汇率的计算汇率报价基础货币与计价货币直接报价与间接报价外汇报价习惯 名义汇率和实际汇率货币的升值与贬值交叉汇率计算即期汇率与远期汇率即期汇率与远期汇率的概念远期升水/贴水远期…...

imx335帧率改到10fps的方法

验证: imx335.c驱动默认的帧率是30fps,要将 IMX335 的帧率更改为 10fps,需要调整与帧率相关的参数。FPS(frames per second,每秒帧数)通常由 sensor 的曝光时间(exposure time)和垂直总时间(VTS,Vertical Total Size)共同决定。VTS 定义了 sensor 完成一帧图像采集…...

Large Language Model系列之二:Transformers和预训练语言模型

Large Language Model系列之二&#xff1a;Transformers和预训练语言模型 1 Transformer模型 Transformer模型是一种基于自注意力机制的深度学习模型&#xff0c;它最初由Vaswani等人在2017年的论文《Attention Is All You Need》中提出&#xff0c;主要用于机器翻译任务。随…...

java后端项目启动失败,解决端口被占用问题

报错信息&#xff1a; Web server failed to start . Port 8020 was already in use. 1、查看端口号 netstat -ano | findstr 端口号 2、终止进程 taskkill /F /PID 进程ID 举例&#xff1a;关闭8020端口...

PostgreSQL安装/卸载(CentOS、Windows)

说明&#xff1a;PostgreSQL与MySQL一样&#xff0c;是一款开源免费的数据库技术&#xff0c;官方口号&#xff1a;The World’s Most Advanced Open Source Relational Database.&#xff08;世界上最先进的开源关系数据库&#xff09;&#xff0c;本文介绍如何在Windows、Cen…...

OutOfMemoryError异常OOM排查

目录 参考工具MAT(Memory Analyzer)一、产生原因二、测试堆溢出 java.lang.OutOfMemoryError: Java heap space测试代码运行手动导出dump文件mat排查打开dump文件查看Leak Suspects(泄露疑点)参考 【JVM】八、OOM异常的模拟 MAT工具分析Dump文件(大对象定位) 用arthas排…...

【Python】Arcpy将excel点生成shp文件

根据excel点经纬度数据&#xff0c;生成shp&#xff0c;参考博主的代码&#xff0c;进行了修改&#xff0c;在属性表中保留excel中的数据。 参考资料&#xff1a;http://t.csdnimg.cn/OleyT 注意修改以下两句中的数字。 latitude float(row[1]) longitude float(row[2])imp…...

torch之从.datasets.CIFAR10解压出训练与测试图片 (附带网盘链接)

前言 从官网上下载的是长这个样子的 想看图片&#xff0c;咋办咧&#xff0c;看下面代码 import torch import torchvision import numpy as np import os import cv2 batch_size 50transform_predict torchvision.transforms.Compose([torchvision.transforms.ToTensor(),…...

什么ISP?什么是IAP?

做单片机开发的工程师经常会听到两个词&#xff1a;ISP和IAP&#xff0c;但新手往往对这两个概念不是很清楚&#xff0c;今天就来和大家聊聊什么是ISP&#xff0c;什么是IAP&#xff1f; 一、ISP ISP的全称是&#xff1a;In System Programming&#xff0c;即在系统编程&…...

外卖霸王餐系统怎么快速盈利赚钱?

微客云外卖霸王餐系统&#xff0c;作为近年来外卖行业中的一股新兴力量&#xff0c;以其独特的商业模式和营销策略&#xff0c;迅速吸引了大量消费者的目光。该系统通过提供显著的折扣和返利&#xff0c;让顾客能够以极低的价格甚至免费享受到美味的外卖&#xff0c;同时&#…...

Linux环境下安装Nodejs

Linux环境下安装Nodejs 下载地址&#xff1a;https://nodejs.org/zh-cn/download/package-manager 一、使用压缩包自定义安装 上述链接下载好对应版本的软件包后&#xff0c;我存放到 /evn/nodejs 目录下&#xff08;根据自己实际情况设置&#xff09; 设置软链接 sudo ln…...

【Rust】字符串String类型学习

什么是String Rust的核心语言中只有一个String类型&#xff0c;那就是String slice,str通常被当作是&str的借用。String类型是通过标准库提供的&#xff0c;而不是直接编码到核心语言中&#xff0c;它是一个可增长的、可变的、utf-8编码的类型。str和String都是utf-8编码的…...

先验概率 后验概率 最大似然估计 自编码器AE

先验概率 先验概率&#xff1a;由因求果中的因 作用&#xff1a;后验概率是比较难以计算的&#xff0c;我们通常使用贝叶斯公式由先验概率计算后验概率。 贝叶斯公式&#xff1a;P(B|A)P(A|B)P(B)/P(A)&#xff0c;其中P(B|A)为后验概率&#xff0c;P(A|B)为先验概率。 后验…...