鸿蒙开发工程师面试-架构篇
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. 面对应用并发设计,你会如何做?
面对应用并发设计挑战,需从多个维度进行综合考量与规划:
-
明确并发需求:首先需清晰界定应用的并发需求,识别出哪些任务为耗时操作、哪些为常驻任务、哪些需并发执行以及哪些需顺序执行等。
-
选择合适的并发模型:根据并发需求选择合适的并发模型。HarmonyOS提供了TaskPool和Worker两种并发模型:TaskPool适用于处理相对独立的耗时任务;Worker则适用于处理长耗时且并发量不大的常驻任务。
-
设计线程间通信机制:合理设计线程间通信机制,确保数据在不同线程间能够正确传递与同步。
-
设置任务优先级与调度策略:根据业务场景设置合理的任务优先级与调度策略,确保高优先级任务能够优先执行。HarmonyOS的TaskPool提供了多任务优先级调度机制,可灵活应用。
-
实现任务延时调度:对于需延时执行的任务,利用TaskPool的延时调度功能进行安排,以避免对应用启动耗时或其他重要任务造成干扰。
-
处理线程间模块共享问题:针对进程唯一的ArkTS实例等共享资源,可考虑在ArkTS子线程中初始化并完成后续操作,以避免阻塞主线程执行。
-
优化并发性能:持续优化并发性能,通过减少线程数量、优化通信机制及合理设置任务优先级等手段提升应用性能。
8. 鸿蒙中的应用切面编程都可以来干什么?
在HarmonyOS中,应用切面编程(AOP)是一种强大的编程范式,它允许开发者在不修改源代码的情况下,为应用中的方法增加额外的行为。切面编程可应用于多个场景,包括但不限于:
- 参数校验:在方法执行前插入参数校验逻辑,确保输入参数的合法性。
- 日志记录:在方法执行前后记录日志,便于追踪方法执行情况及进行问题排查。
- 性能统计:统计方法的调用次数和执行时间,为性能分析和优化提供依据。
- 异常处理:对方法返回值进行校验,并在不符合预期时抛出异常或进行其他处理。
- 成员变量监测:在方法执行时监测成员变量状态,确保数据完整性和准确性。
- 方法替换:在特定情况下替换原方法实现,以适应业务变更或性能优化需求。
- 应用跳转监控:在应用跳转时,感知到目标应用的包名,实现对目标应用的识别和监控,以确保跳转操作的安全性和准确性。例如,通过插桩操作可以获得Want参数的bundleName属性,从而实现对目标方法的监控和定制。
-