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

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属性,从而实现对目标方法的监控和定制。

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

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

相关文章

【IOS】React Native之HelloWorld

RN搭建开发环境 rvm 安装3.2.2 brew install node18 brew install watchman# 使用nrm工具切换淘宝源 npx nrm use taobao# 如果之后需要切换回官方源可使用 npx nrm use npmnpm install -g yarnbrew install cocoapodsnpm uninstall -g react-native-cli react-native-communi…

<数据集>表情识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:2504张 标注数量(xml文件个数):2504 标注数量(txt文件个数):2504 标注类别数:7 标注类别名称:[Neutral, Happy, Angry, Fear, Sad, surprised, Disguist] 序号类别名…

小白学webgl合集-import.meta.url 和 new URL() bug

为什么使用 import.meta.url 和 new URL() 动态路径解析: 在 ESM(ECMAScript Modules)环境中,import.meta.url 提供了当前模块的完整 URL。结合 new URL(),你可以基于这个 URL 动态解析其他资源的路径。这样可以确保路…

开始Linux之路(暑假提升)

人生得一知己足矣,斯世当以同怀视之。——鲁迅 Linux操作系统简单操作指令 1、ls指令2、pwd命令3、cd指令4、mkdir指令(重要)5、whoami命令6、创建一个普通用户7、重新认识指令8、which指令9、alias命令10、touch指令11、rmdir指令 及 rm指令(重要)12、man指令(重要…

Transformer——多头注意力机制(Pytorch)

1. 原理图 2. 代码 import torch import torch.nn as nnclass Multi_Head_Self_Attention(nn.Module):def __init__(self, embed_size, heads):super(Multi_Head_Self_Attention, self).__init__()self.embed_size embed_sizeself.heads headsself.head_dim embed_size //…

【VSCode】设置背景图片

1.下载background插件:拓展程序→background→install安装→设置: 2.点击在 settings.json 中编辑: 3.将settings.json文件中所有代码注释,添加以下代码: {// 是否开启背景图显示"background.enabled": t…

【Linux杂货铺】1.环境变量

1.环境变量基本概念 环境变量( environment variables )一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写 C / C +代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪…

【Go系列】 Go语言数据结构

承上启下 在上一次的思维碰撞中,我们的小试牛刀是一段温馨的代码小练习——将“Hello World”这个熟悉的问候,替换成了我们自己的名字。是的,你没听错,就是这么简单!以我为例,我将“Hello World”轻轻一变&…

算法训练 | 图论Part8 | 拓扑排序、dijkstra(朴素版)

目录 117. 软件构建 拓扑排序法 47. 参加科学大会 dijkstra法 117. 软件构建 题目链接&#xff1a;117. 软件构建 文章讲解&#xff1a;代码随想录 拓扑排序法 代码一&#xff1a;拓扑排序 #include <iostream> #include <vector> #include <queue> …

什么是Web3D?国内有哪些公司可以做?

Web3D 是一种基于网页的三维立体虚拟现实技术。利用计算机图形学、图像处理、人机交互等技术&#xff0c;将现实世界中的物体、场景或概念以三维立体的方式呈现在网页里。Web3D 技术可以让用户在任何时间、任何地点&#xff0c;通过互联网与虚拟世界进行互动&#xff0c;获得身…

模型剪枝介绍

Ref&#xff1a;https://www.cnblogs.com/the-art-of-ai/p/17500399.html 1、背景介绍 深度学习模型在图像识别、自然语言处理、语音识别等领域取得了显著的成果&#xff0c;但是这些模型往往需要大量的计算资源和存储空间。尤其是在移动设备和嵌入式系统等资源受限的环境下&a…

昇思25天学习打卡营第1天|初步了解

1在昇思平台上申请过相关资源之后&#xff0c;将示例代码粘贴到输入框内。可以在下图中创建一个新的文档。 2不过初次运行的时候会遇到一个问题&#xff0c;点击运行的时候会出现新的输入框&#xff0c;而不是直接运行。遇到此问题等待就可以了&#xff0c;或者稍微等一下再运…

【JVM】对象的生命周期一 | 对象的创建与存储

Java | 对象的生命周期1-对象的创建与存储 文章目录 前言对象的创建过程内存空间的分配方式方式1 | 指针碰撞方式2 | 空闲列表 线程安全问题 | 避免空间冲突的方式方式1 | 同步处理&#xff08;加锁)方式2 | 本地线程分配缓存 对象的内存布局Part1 | 对象头Mark Word类型指针 P…

内网安全:域内信息探测

1.域内基本信息收集 2.NET命令详解 3.内网主要使用的域收集方法 4.查找域控制器的方法 5.查询域内用户的基本信息 6.定位域管 7.powershell命令和定位敏感信息 1.域内基本信息收集&#xff1a; 四种情况&#xff1a; 1.本地用户&#xff1a;user 2.本地管理员用户&#x…

solidity实战练习1

//SPDX-License-Identifier:MIT pragma solidity ^0.8.24; contract PiggyBank{constructor()payable{emit Deposit(msg.value);//触发事件1//意味着在部署合约的时候&#xff0c;可以向合约发送以太币&#xff08;不是通过调用函数&#xff0c;而是直接在部署合约时发送&#…

C++ STL for_each的用法和实现

目录 一&#xff1a;功能 二&#xff1a;用法 三&#xff1a;实现 一&#xff1a;功能 遍历元素 二&#xff1a;用法 //C 11 #include <vector> #include <algorithm> #include <iostream> #include <format>struct StatsFn {int cnt 0;int sum…

外泌体相关基因肝癌临床模型预测——2-3分纯生信文章复现——4.预后相关外泌体基因确定之生存曲线(4)

内容如下: 1.外泌体和肝癌TCGA数据下载 2.数据格式整理 3.差异表达基因筛选 4.预后相关外泌体基因确定 5.拷贝数变异及突变图谱 6.外泌体基因功能注释 7.LASSO回归筛选外泌体预后模型 8.预后模型验证 9.预后模型鲁棒性分析 10.独立预后因素分析及与临床的相关性分析…

【算法】二叉树算法基本概念及实现

目录 一、二叉树的基本概念 二、二叉树的性质 三、二叉树的算法实现 四、二叉树的应用 C# 实现 Python 实现 二叉树算法是计算机科学中常用的一种数据结构算法,主要用于处理具有层级关系的数据。以下是对二叉树算法的详细介绍: 一、二叉树的基本概念 定义:二叉树是n…

【机器翻译】基于术语词典干预的机器翻译挑战赛

赛题链接&#xff1a;https://challenge.xfyun.cn/topic/info?typemachine-translation-2024 赛题解读 安装库 spacy 1.查看本地spacy版本 pip show spacy我安装3.6.0 pip install en_core_web_sm-3.6.0.tar.gzen_core_web_sm下载链接&#xff1a;https://github.com/ex…

[Linux]对Linux中的命令的本质

上回我们讲了Linux的指令&#xff0c;本篇是一个短篇&#xff0c;主要是对命令本质的讲解。 我们知道命令一般都是直接使用的 而可执行程序需要加上当前的路径 &#xff08;这个mytest是我们上上回写的&#xff0c;作用实际是打印Hello world!&#xff09; 我们很直观的可以发…