鸿蒙面试题——面试题整理5
一 面试题汇总(红书)
- 组件化开发原理,鸿蒙组件化实现思路
- 音视频开发,鸿蒙实现播放器的Ui部分+底层部分
- 了解过鸿蒙的Napi吗?如果我需要编译三方库如何链接?
- 鸿蒙如何实现自定义Canvas?底层如何进行Ui的渲染 flutter skia
- 鸿蒙网络请求如何实现的,线上的APM 如何做流量的监控?
- 说一下@State 、@Link 、@Builder、@Provide和@Consume的区别?
二 面试题解答(仅供参考)
2.1 组件化开发原理,鸿蒙组件化实现思路
组件化开发是一种软件设计和架构的方法,它将整个系统划分为独立的组件,每个组件都能够独立开发、测试和维护。在鸿蒙OS中,组件化开发被广泛应用,以提高系统的灵活性、可维护性和可扩展性。下面是组件化开发的一般原理以及在鸿蒙OS中的实现思路:
组件化开发原理:
- 独立性: 每个组件都是独立的单元,包含自己的业务逻辑、界面和资源。组件之间的耦合尽量减少,使得每个组件可以独立开发和测试。
- 模块化: 每个组件应该是一个可重用的模块,具有清晰的接口和功能。这有助于提高代码的复用性,减少重复开发。
- 通信机制: 组件之间需要一种有效的通信机制,以实现信息的传递和共享。这可以通过事件、消息队列等方式来实现。
- 动态加载: 组件可以根据需要进行动态加载和卸载,而不影响系统的其他部分。这有助于提高系统的灵活性和扩展性。
鸿蒙组件化实现思路:
- 分布式能力组件: 鸿蒙OS引入了分布式能力组件的概念,通过能力组件可以在不同设备上共享和调用特定的能力。这使得组件可以更加灵活地分布在不同设备上,实现跨设备的协同工作。
- 分布式软总线: 鸿蒙OS使用分布式软总线技术,实现了设备之间的通信。组件可以通过软总线进行消息传递,实现跨设备的信息共享和协同工作。
- 多端协同开发: 鸿蒙OS支持多端协同开发,开发者可以一次编写,多端适配。这使得组件可以更容易地适配不同设备的屏幕尺寸和分辨率,提供一致的用户体验。
- 分布式文件系统: 鸿蒙OS的分布式文件系统支持文件的共享和管理。组件可以通过文件系统实现跨设备的文件读写和共享。
- HarmonyOS IDE: 使用HarmonyOS IDE(DevEco Studio)进行组件化开发,可以更方便地创建、管理和调试组件。IDE提供了丰富的工具和资源,支持组件之间的依赖关系管理。
- HarmonyOS基础服务: 鸿蒙OS提供一系列基础服务,如分布式数据管理、分布式安全等,这些服务为组件提供了基础设施支持。
总体而言,鸿蒙OS通过引入分布式能力、软总线技术、多端协同开发等特性,为组件化开发提供了丰富的支持,使得组件能够更好地适应分布式环境,实现跨设备的协同工作。
2.2 音视频开发,鸿蒙实现播放器的Ui部分+底层部分
在鸿蒙OS中实现音视频播放器涉及到两个主要部分:UI部分和底层部分。以下是简要的步骤和思路:
1. 音视频播放器的UI部分:
布局设计:
使用鸿蒙的UI框架进行布局设计,可以使用XML语言或代码方式创建播放器界面。定义播放器界面包括播放/暂停按钮、进度条、音量控制、全屏切换等控件。
事件处理:
通过鸿蒙的事件处理机制,为播放器UI部分添加相应的事件监听器,以处理用户操作,例如点击播放按钮、拖动进度条等。处理这些事件触发底层播放器的相应操作。
界面适配:
考虑多端协同开发的特性,确保播放器UI在不同设备上的适配性。可以使用HarmonyOS的统一布局语言和多端适配特性来简化界面的设计和适配。
2. 音视频播放器的底层部分:
选择媒体框架:
选择适用于鸿蒙OS的音视频播放媒体框架,例如使用HarmonyOS提供的媒体框架或者集成第三方的媒体库。确保所选框架兼容鸿蒙OS的环境。
播放控制:
通过底层代码实现音视频的播放控制,包括加载媒体、播放、暂停、停止、快进、快退等操作。可以使用媒体框架提供的API来管理媒体资源和播放状态。
实现播放器管理:
设计一个播放器管理类,负责管理多个播放器实例,处理播放器的状态切换、资源释放等操作。这有助于确保同时播放多个媒体文件时的有效管理。
处理音视频流:
根据选择的媒体框架,实现处理音视频流的功能。可能需要解码、渲染、缓冲等操作,具体实现会依赖于所选的媒体框架。
错误处理和异常情况:
添加适当的错误处理和异常情况处理,确保用户获得良好的用户体验。这可能包括网络错误、媒体格式不支持等异常情况的处理。
硬件加速:
考虑利用鸿蒙OS提供的硬件加速特性,以提高音视频播放的性能和效率。通过底层代码调用相关硬件加速接口,优化播放体验。
注意事项:
- 权限处理: 确保应用在播放音视频时具有必要的权限,如访问存储、网络等权限。
- 性能优化: 进行性能优化,特别是在资源受限的设备上,以确保播放器的流畅性和响应性。
- 测试和调试: 使用鸿蒙OS提供的开发者工具进行测试和调试,确保播放器在不同设备上正常运行。
- 用户体验: 设计良好的用户交互,提供友好的界面,确保用户能够轻松使用播放器功能。
总体而言,通过合理的UI设计和底层开发,可以在鸿蒙OS上实现功能强大的音视频播放器。
2.3 了解过鸿蒙的Napi吗?如果我需要编译三方库如何链接?
鸿蒙OS引入了NAPI(Native Application Programming Interface)支持,允许开发者使用C/C++等原生语言编写应用程序的部分模块。这提供了更大的灵活性,特别是在涉及性能优化、底层硬件交互等方面。
如果你需要编译第三方库并链接到鸿蒙应用中,可以按照以下步骤进行:
- 交叉编译: 首先,确保你的第三方库支持鸿蒙OS的架构。如果不支持,你可能需要进行交叉编译,生成适用于鸿蒙OS的二进制文件。这可能需要使用鸿蒙OS提供的工具链。
- 创建NAPI模块: 将第三方库的功能封装成一个NAPI模块。NAPI模块是一个动态库,用于通过JavaScript进行调用。在NAPI模块中,你可以使用C/C++语言编写和第三方库交互的代码。
- CMake构建: 使用CMake等构建工具创建一个构建系统,用于构建NAPI模块和鸿蒙应用。这样你可以确保正确地链接第三方库,并生成可在鸿蒙系统上运行的二进制文件。
- 配置构建文件: 在鸿蒙应用的构建文件(例如,config.json)中,确保添加了对NAPI模块的依赖。这通常包括引入相应的动态库文件等配置。
- 应用集成: 在鸿蒙应用中通过JavaScript代码调用NAPI模块,以使用第三方库的功能。确保在调用时正确处理错误和资源释放。
具体的步骤可能会根据使用的第三方库和鸿蒙OS的版本而有所不同。建议查阅鸿蒙OS的官方文档和相应版本的开发者指南,以获取详细的指导和最新的信息。
2.4 鸿蒙如何实现自定义Canvas?底层如何进行Ui的渲染 flutter skia
HarmonyOS的UI系统采用的是自研的分布式UI框架(Distributed UI Framework),而与Flutter或Skia不同。在HarmonyOS中,渲染是由系统底层负责的,而不是像Flutter一样使用Skia进行自定义绘制。因此,自定义Canvas的实现方式与Flutter或Skia略有不同。
在HarmonyOS中,自定义绘制通常通过创建自定义的组件来实现。以下是一个简单的步骤,介绍如何在HarmonyOS中实现自定义绘制:
- 声明MiniCanvasAttribute 画布属性(入宽、高、背景色、抗锯齿等)
- 定义Icanvas绘制内容
onDraw?: (canvas: ICanvas) => void = undefined;
,绘制直线、圆等 - 自定义绘制组件,在build方法中,使用Canvas实现绘制,并将上述属性填入
2.5 鸿蒙网络请求如何实现的,线上的APM 如何做流量的监控?
网络请求
鸿蒙的网络请求分为:Http请求、WebSocket连接、Socket连接,本文以Http数据请求为例
1 | HTTP数据请求功能主要由http模块提供。 |
request接口开发步骤
- 从@ohos.net.http.d.ts中导入http命名空间。
- 调用createHttp()方法,创建一个HttpRequest对象。
- 调用该对象的on()方法,订阅http响应头事件,此接口会比request请求先返回。可以根据业务需要订阅此消息。
- 调用该对象的request()方法,传入http请求的url地址和可选参数,发起网络请求。
- 按照实际业务需要,解析返回结果。
- 调用该对象的off()方法,取消订阅http响应头事件。
- 当该请求使用完毕时,调用destroy()方法主动销毁。
对于线上的APM(Application Performance Management),流量监控通常涉及以下几个方面:
- 性能监控: APM工具可以监控应用性能,包括网络请求的响应时间、耗时等。这有助于识别性能瓶颈,并进行优化。
- 错误监控: APM可以捕获应用中的异常和错误信息,包括网络请求的异常。这对于追踪和解决线上问题非常重要。
- 事务追踪: APM工具可以追踪应用中的事务,包括网络请求的发起和结束。这有助于全面了解应用的运行状态。
- 资源利用率监控: APM可以监控应用的资源利用率,包括网络流量的使用情况。这对于控制和优化应用的资源消耗非常有帮助。
在鸿蒙OS上,你可以考虑使用华为提供的APM工具(例如华为应用分析服务),或者集成第三方的APM解决方案。这些工具通常提供了图形化的仪表盘和报告,方便开发者实时监控和分析应用的性能和流量情况。在使用这些工具时,你需要根据具体的需求和业务场景进行配置和集成。
2.6 说一下@State 、@Link 、@Builder、@Provide和@Consume的区别?
在鸿蒙OS的分布式开发中,@State
、@Link
、@Builder
、@Provide
和@Consume
是用于定义和管理分布式组件生命周期、状态、链接以及能力组件的注解。以下是它们的主要区别:
- @State:
- 作用: 用于定义分布式组件的状态。
- 用法: 将
@State
注解应用于组件的字段,用于表示该字段是组件的状态。
- 用法: 将
@Link:
- 作用: 用于定义组件之间的链接关系。
- 用法: 将
@Link
注解应用于组件的字段,用于表示组件之间的链接关系。
@Builder:
- 作用: 用于定义组件的构建器。
- 用法: 将
@Builder
注解应用于构建组件的方法,用于定义组件的构建过程。
@Provide:
- 作用: 用于提供能力组件。
- 用法: 将
@Provide
注解应用于组件的方法,用于指示该方法提供某个能力组件。
@Consume:
- 作用: 用于消费能力组件。
- 用法: 将
@Consume
注解应用于组件的方法,用于指示该方法消费某个能力组件。
总体而言,这些注解在鸿蒙OS的分布式开发中用于定义和管理组件之间的状态、链接关系、构建过程,以及提供和消费能力组件的相关操作。在使用时,需要根据实际需求和业务逻辑来合理应用这些注解。
三 参考
- 掘金—首发:鸿蒙面试真题分享