鸿蒙 ArkTS / HarmonyOS 面试题
本题库共收录 56 道面试题(基础 9 / 进阶 25 / 深入 14 / 架构 8)。 本文件收录鸿蒙(HarmonyOS)前端开发相关面试题,目标题量 80 道。 题型覆盖:概念题、代码分析题、手写代码题、场景设计题、系统设计题、框架原理题、性能优化题、工程化题、综合开放题。 难度覆盖:基础、进阶、深入、架构。 每道题除标准参考答案外,另附口头回答版,便于面试时快速组织语言。
目录
基础题(8 道)
FB-46-CO-B-001:HarmonyOS 的系统架构是怎样的?它相比传统移动操作系统有哪些核心特性?
题型:概念题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:HarmonyOS、系统架构、分布式、微内核、全场景 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请简述 HarmonyOS 的整体系统架构,并说明它相比 Android / iOS 等传统移动操作系统的核心特性。
参考答案:
HarmonyOS 采用“1+8+N”全场景战略,系统架构自上而下大致分为四层:
- 应用层(Applications):系统应用、第三方应用、原子化服务(Atomic Service)、卡片(Form/Widget)。
- 应用框架层(Application Framework):Ability 框架、ArkUI、用户程序框架、多模输入等。
- 系统服务层(System Service):分布式任务调度、图形、多媒体、安全、AI、资源管理等。
- 内核层(Kernel):支持多内核设计,包括鸿蒙微内核(HarmonyOS Microkernel)、Linux 内核、LiteOS 等,按设备能力弹性选择。
相比 Android / iOS 的核心特性:
| 维度 | HarmonyOS | Android / iOS |
|---|---|---|
| 内核 | 多内核、微内核能力 | Linux / BSD |
| 应用形态 | 应用 + 原子化服务 + 卡片 | 以传统应用为主 |
| 跨设备 | 分布式软总线,多设备协同原生支持 | 依赖云端或蓝牙/Wi-Fi 手动配对 |
| 开发语言 | ArkTS、C/C++、JavaScript | Kotlin/Java、Swift/Obj-C |
| UI 范式 | ArkUI 声明式 | 命令式为主 |
| 一次开发 | 多端部署(手机、平板、车机、穿戴、IoT) | 需单独适配 |
最佳实践:
- 面向 HarmonyOS 开发时应优先拥抱声明式 ArkUI 与 Stage 模型。
- 设计 UI 时要考虑多端一致性,使用响应式布局与栅格系统。
评分维度:
- 能说出四层架构或关键分层(30%)
- 能对比分布式、原子化服务、多内核等核心特性(40%)
- 能说明一次开发多端部署的优势(30%)
常见错误:
- 把 HarmonyOS 简单等同于“安卓换皮”。
- 只讲手机开发,忽略 IoT / 车机 / 穿戴等多设备场景。
- 混淆 OpenHarmony 与 HarmonyOS(商用版)。
延伸追问:
- OpenHarmony 和 HarmonyOS 有什么关系和区别?
- 微内核和宏内核在安全性、性能上的取舍是什么?
相关题目:
参考资源:
口头回答版:
HarmonyOS 架构从上到下分应用层、应用框架层、系统服务层和内核层。它最大的特点是全场景分布式,手机、平板、车机、手表、IoT 设备能原生协同;应用形态除了传统 App,还有原子化服务和卡片;开发上主推 ArkTS + ArkUI 声明式 UI,一次开发可以部署到多端。它和安卓、iOS 最大的区别就是分布式软总线和多设备协同是系统级能力,而不是靠应用自己实现。
FB-46-CO-B-002:ArkTS 是什么?它与 TypeScript 有什么关系和区别?
题型:概念题 难度:🟢 基础 岗位层级:初级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:ArkTS、TypeScript、鸿蒙、静态类型、声明式 UI 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请解释 ArkTS 的定位,并说明它与 TypeScript 的关系和主要区别。
参考答案:
ArkTS 是 HarmonyOS 主推的应用开发语言,由华为基于 TypeScript 扩展而来,专为声明式 UI 和状态管理做了增强,并与 ArkUI 框架深度集成。
关系:
- ArkTS 是 TypeScript 的超集(Superset),保留了 TS 的类型系统、接口、泛型等能力。
- 在 ArkTS 中可以使用绝大部分 TypeScript 语法,但为了保证高性能与确定性,强制使用静态类型,并裁剪了部分动态特性。
主要区别:
| 维度 | TypeScript | ArkTS |
|---|---|---|
| 类型约束 | 可选静态类型 | 强制静态类型 |
| 动态特性 | 支持 any、动态属性访问 | 限制 any,限制动态属性 |
| 运行环境 | 浏览器 / Node.js | ArkCompiler / 鸿蒙运行态 |
| UI 绑定 | 依赖 React / Vue 等框架 | 原生支持 ArkUI 声明式与状态装饰器 |
| 并发模型 | 依赖事件循环 / Worker | 支持 TaskPool / Worker / Sendable |
| 编译器 | tsc / babel 等 | ArkCompiler 静态编译 AOT |
典型限制:
- 避免使用
any,应使用显式类型或联合类型。 - 对象属性应在声明时确定,避免运行时动态增删。
- 箭头函数和普通函数在装饰器状态绑定中需注意
this指向。
最佳实践:
- 为所有变量、函数参数、返回值显式声明类型。
- 使用
interface或class描述业务模型。 - 状态变量必须结合 ArkTS 装饰器(如
@State)使用。
评分维度:
- 能说明 ArkTS 基于 TypeScript 扩展(30%)
- 能说出强制静态类型、AOT 编译、与 ArkUI 集成等差异(40%)
- 能指出开发时应避免
any、动态属性等限制(30%)
常见错误:
- 认为 ArkTS 与 TypeScript 完全等价。
- 写 ArkTS 时大量使用
any,导致编译告警或运行时异常。 - 把浏览器 / Node.js 的运行时习惯照搬到 ArkTS。
延伸追问:
- ArkTS 的状态装饰器和普通 TypeScript 类属性有什么区别?
- 为什么 ArkTS 要限制动态属性访问?
相关题目:
参考资源:
口头回答版:
ArkTS 是华为基于 TypeScript 扩展出来的鸿蒙应用开发语言,它是 TS 的超集,但做了针对鸿蒙的增强。最大的区别是 ArkTS 强制静态类型,限制了 any 和动态属性访问,保证能被 ArkCompiler 静态编译和高效运行。同时它原生支持 ArkUI 的声明式 UI 和状态装饰器,写 UI 非常像 SwiftUI 或 Flutter。
FB-46-CO-B-003:什么是 Ability?HarmonyOS 中的 Ability 有哪些分类?
题型:概念题 难度:🟢 基础 岗位层级:初级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:Ability、UIAbility、ExtensionAbility、HarmonyOS、生命周期 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请解释 HarmonyOS 中 Ability 的概念,并列举主要的 Ability 类型及其作用。
参考答案:
Ability 是 HarmonyOS 应用的基本组成单元,表示应用能够对外提供的一种能力。每个 Ability 对应一个独立的功能入口,可以拥有自己的生命周期的实例。
主要分类:
| Ability 类型 | 作用 | 典型场景 |
|---|---|---|
| UIAbility | 包含用户界面的 Ability | 页面、主入口 |
| ExtensionAbility | 无界面的扩展能力基类 | 服务、后台扩展 |
| ServiceExtensionAbility | 后台运行服务 | 音乐播放、定位、下载 |
| FormExtensionAbility | 提供卡片服务 | 桌面卡片、负一屏卡片 |
| DataShareExtensionAbility | 数据共享 | 跨应用数据读写 |
| InputMethodExtensionAbility | 输入法 | 自定义输入法 |
| BackupExtensionAbility | 备份恢复 | 应用数据备份 |
核心概念:
- UIAbility:类似 Android 的 Activity,承载界面,有
onCreate、onForeground、onBackground、onDestroy等生命周期。 - ExtensionAbility:通常没有独立界面,运行在后台,为系统或其他应用提供能力。
- 一个应用可以包含多个 Ability,通过
module.json5中的abilities数组声明。
示例 module.json5 片段:
{
"module": {
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"description": "$string:EntryAbility_desc",
"icon": "$media:icon",
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:start_window_background"
}
]
}
}最佳实践:
- 界面能力使用 UIAbility,后台服务使用 ServiceExtensionAbility。
- 不要把所有功能都塞进 UIAbility,按能力拆分 Ability 有助于多设备协同。
评分维度:
- 能解释 Ability 是应用能力单元(30%)
- 能列举 UIAbility、ServiceExtensionAbility、FormExtensionAbility 等(40%)
- 能在 module.json5 中识别 Ability 配置(30%)
常见错误:
- 把 Ability 等同于 Android 的 Activity 或 Service,忽略其“能力”抽象。
- 混淆 UIAbility 和 ExtensionAbility 的使用场景。
- 在 UIAbility 中执行长时间后台任务。
延伸追问:
- UIAbility 的生命周期和页面的生命周期有什么关系?
- 多个 Ability 之间如何跳转和传参?
相关题目:
参考资源:
口头回答版:
Ability 是鸿蒙应用的基本能力单元,每个 Ability 代表一个功能入口。最常见的是 UIAbility,带界面的,类似安卓的 Activity;还有 ExtensionAbility 系列,比如 ServiceExtensionAbility 做后台服务、FormExtensionAbility 做桌面卡片、DataShareExtensionAbility 做数据共享。它们都在 module.json5 里声明。
FB-46-CO-B-004:什么是 ArkUI?它的声明式 UI 有什么特点?
题型:概念题 难度:🟢 基础 岗位层级:初级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:ArkUI、声明式 UI、ArkTS、组件、状态驱动 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请介绍 ArkUI 是什么,并说明 HarmonyOS 声明式 UI 的开发方式与传统命令式 UI 的区别。
参考答案:
ArkUI 是 HarmonyOS 提供的声明式 UI 开发框架,开发者使用 ArkTS(或 JS)描述界面“应该长什么样”,由框架负责把状态映射到视图,自动完成创建、更新、销毁。
声明式 UI 与命令式 UI 对比:
| 维度 | 命令式 UI(Android / iOS 传统) | 声明式 UI(ArkUI / SwiftUI / Flutter) |
|---|---|---|
| 开发方式 | 手动创建、更新、销毁视图 | 描述状态与视图的映射关系 |
| 状态变更 | 手动 findViewById 修改 | 状态驱动自动刷新 |
| 代码组织 | 代码与视图分离 | UI 结构即代码 |
| 可读性 | 需要阅读多处才能理解界面 | 结构清晰,所见即所得 |
| 跨设备适配 | 需要多套布局 | 响应式声明式布局更自然 |
ArkUI 基础示例:
@Entry
@Component
struct Index {
@State message: string = 'Hello HarmonyOS';
build() {
Column({ space: 12 }) {
Text(this.message)
.fontSize(24)
.fontColor(Color.Blue);
Button('点击切换')
.onClick(() => {
this.message = 'Hello ArkUI';
});
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center);
}
}核心概念:
@Entry:页面入口装饰器,标记可被路由跳转的页面。@Component:自定义组件装饰器。build():构建 UI 的方法。@State:组件内部状态,变化会自动触发 UI 刷新。
最佳实践:
- 用状态驱动 UI,避免直接操作组件实例。
- 合理拆分
@Component,提高复用性和可维护性。 - 复杂布局使用
Row、Column、Flex、Grid、List等容器。
评分维度:
- 能解释 ArkUI 是声明式 UI 框架(30%)
- 能对比声明式与命令式 UI 的区别(40%)
- 能写出基础 ArkUI 组件结构(30%)
常见错误:
- 在 ArkUI 中通过
findComponentById手动改 UI。 build()中写复杂业务逻辑。- 忽略
@State等装饰器,导致状态变化不刷新。
延伸追问:
- 声明式 UI 的性能优势在哪里?
- ArkUI 的状态更新机制是怎样的?
相关题目:
参考资源:
口头回答版:
ArkUI 是鸿蒙的声明式 UI 开发框架。声明式 UI 就是你只描述界面“应该长什么样”,状态变了框架自动帮你刷新,不用像传统安卓那样手动 findViewById 去改。写法和 Flutter、SwiftUI 很像,用 @Entry 表示页面入口,@Component 表示自定义组件,build 方法里用 Column、Text、Button 这些组件拼界面,状态用 @State 管理。
FB-46-CO-B-005:Stage 模型与 FA 模型有什么区别?为什么推荐 Stage 模型?
题型:概念题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:Stage 模型、FA 模型、Ability、HarmonyOS、生命周期 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请对比 HarmonyOS 中的 Stage 模型与 FA 模型,并说明为什么现在推荐 Stage 模型。
参考答案:
Stage 模型和 FA(Feature Ability)模型是 HarmonyOS 不同时期的应用模型:
| 维度 | FA 模型 | Stage 模型 |
|---|---|---|
| 设计目标 | 早期兼容传统应用 | 面向全场景分布式 |
| Ability | PageAbility / ServiceAbility / DataAbility | UIAbility / ExtensionAbility |
| 生命周期 | 较为简单,依赖 AMS | 更完整,支持前后台、多实例 |
| 进程模型 | 多 Ability 可能共享进程 | 更清晰,UIAbility 与 ExtensionAbility 分离 |
| 存储 | 私有文件、数据库分散 | 统一的应用级 Context |
| 并发 | 较弱 | 支持 TaskPool、Worker、Sendable |
| 官方推荐 | 已停止演进,不推荐使用 | 当前主推 |
为什么推荐 Stage 模型:
- 面向分布式:Stage 模型为跨设备流转、接续(Continuation)原生设计。
- 生命周期更完善:能更好管理应用在前台、后台、销毁等状态。
- 内存和功耗更优:进程与 Ability 职责清晰,后台能力受限,降低功耗。
- 工程结构统一:
AbilityStage作为 Ability 的舞台,统一管理生命周期。
关键类:
AbilityStage:Ability 的舞台,每个 HAP 有一个EntryAbilityStage或自定义 AbilityStage。UIAbility:Stage 模型中的界面能力,继承自Ability。WindowStage:管理窗口生命周期,与 UIAbility 关联。
代码示例:自定义 AbilityStage
import { AbilityStage, Want } from '@kit.AbilityKit';
export default class EntryAbilityStage extends AbilityStage {
onCreate(): void {
console.info('EntryAbilityStage onCreate');
}
onAcceptWant(want: Want): string {
return 'EntryAbilityStage';
}
}最佳实践:
- 新项目全部使用 Stage 模型。
- 存量 FA 项目应按官方迁移指南升级到 Stage 模型。
评分维度:
- 能说明 FA 模型与 Stage 模型的核心差异(40%)
- 能解释 Stage 模型面向分布式和全场景的优势(30%)
- 能指出 AbilityStage、UIAbility、WindowStage 等关键概念(30%)
常见错误:
- 认为 FA 模型和 Stage 模型可以随意混用。
- 把 PageAbility 与 UIAbility 简单等同。
- 忽略 AbilityStage 在生命周期管理中的作用。
延伸追问:
- AbilityStage 的生命周期在什么时机触发?
- Stage 模型下如何管理应用级全局状态?
相关题目:
参考资源:
口头回答版:
FA 模型是鸿蒙早期的应用模型,类似 PageAbility、ServiceAbility;Stage 模型是现在主推的,面向全场景分布式。Stage 模型用 UIAbility 承载界面,用 ExtensionAbility 做后台扩展,还有一个 AbilityStage 统一管生命周期。推荐 Stage 模型是因为它生命周期更完善、更适合跨设备流转、内存和功耗管理也更好。新项目都应该用 Stage 模型。
FB-46-CO-B-006:请简述鸿蒙应用(UIAbility)的生命周期。
题型:概念题 难度:🟢 基础 岗位层级:初级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:UIAbility、生命周期、Stage 模型、前台、后台 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请描述 HarmonyOS Stage 模型下 UIAbility 的主要生命周期回调,并说明每个阶段适合做什么。
参考答案:
UIAbility 生命周期主要回调:
| 回调 | 触发时机 | 适合做的事 |
|---|---|---|
onCreate() | Ability 创建时 | 初始化资源、恢复状态 |
onWindowStageCreate() | 窗口舞台创建时 | 设置主页面 windowStage.loadContent() |
onForeground() | 进入前台时 | 恢复动画、刷新数据、注册传感器等 |
onBackground() | 退到后台时 | 暂停播放、保存临时状态、释放前台资源 |
onWindowStageDestroy() | 窗口舞台销毁时 | 释放 UI 相关资源 |
onDestroy() | Ability 销毁时 | 释放全部资源、取消订阅、停止服务 |
生命周期流转:
onCreate
↓
onWindowStageCreate → loadContent 设置主页面
↓
onForeground ←→ onBackground
↓
onWindowStageDestroy
↓
onDestroy示例代码:
import { UIAbility, Want, AbilityConstant } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
console.info('EntryAbility onCreate');
}
onWindowStageCreate(windowStage: window.WindowStage): void {
console.info('EntryAbility onWindowStageCreate');
windowStage.loadContent('pages/Index', (err) => {
if (err.code) {
console.error('loadContent failed');
return;
}
console.info('loadContent success');
});
}
onForeground(): void {
console.info('EntryAbility onForeground');
}
onBackground(): void {
console.info('EntryAbility onBackground');
}
onWindowStageDestroy(): void {
console.info('EntryAbility onWindowStageDestroy');
}
onDestroy(): void {
console.info('EntryAbility onDestroy');
}
}最佳实践:
- 在
onCreate初始化,在onForeground恢复,在onBackground暂停。 - 不要在
onCreate中做耗时操作,避免启动慢。 onWindowStageCreate中必须调用loadContent加载主页面。
评分维度:
- 能按顺序说出主要生命周期回调(40%)
- 能说明每个回调适合做什么(40%)
- 能在代码中指出 loadContent 的位置(20%)
常见错误:
- 把
onCreate当成页面显示时机,在里面对 DOM 做操作。 - 混淆
onBackground和onDestroy,未正确释放资源。 - 在生命周期中执行耗时同步操作。
延伸追问:
- UIAbility 生命周期和 Page 页面生命周期有什么关系?
- 后台 Ability 被系统回收时如何保存状态?
相关题目:
参考资源:
口头回答版:
UIAbility 的生命周期主要有 onCreate、onWindowStageCreate、onForeground、onBackground、onWindowStageDestroy、onDestroy。onCreate 初始化,onWindowStageCreate 里要 loadContent 加载主页面,onForeground 是到前台,onBackground 是到后台,onDestroy 是销毁。适合在 onForeground 恢复数据、在 onBackground 暂停播放或保存临时状态。
FB-46-CO-B-007:鸿蒙应用的包结构是怎样的?HAP、HSP、HAR 分别是什么?
题型:概念题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:HAP、HSP、HAR、包结构、模块化、HarmonyOS 出现频率:中频 预计回答时长:3-5 分钟
题目描述: 请说明 HarmonyOS 应用的包结构,以及 HAP、HSP、HAR 三种包类型的区别和用途。
参考答案:
HarmonyOS 应用包结构:
App Pack (.app)
└── entry.hap # 主模块,必须存在
└── feature.hap # 特性模块,可选
└── library.hsp # 动态共享模块,可选(HSP)
└── resources.index # 资源索引| 包类型 | 全称 | 用途 | 是否独立运行 |
|---|---|---|---|
| HAP | HarmonyOS Ability Package | 应用主模块或特性模块 | 可独立运行(Entry HAP) |
| HSP | Harmony Shared Package | 动态共享包,多个 HAP 共享 | 不可独立运行 |
| HAR | Harmony Archive | 静态共享包,编译时打包进 HAP | 不可独立运行 |
详细说明:
- Entry HAP:应用入口,每个应用至少有一个,可独立安装运行。
- Feature HAP:应用特性模块,按需动态下载(类似 Android App Bundle 的 dynamic feature)。
- HSP:运行时可以共享的模块,适合多个 HAP 复用同一份代码和资源,减少包体积。
- HAR:静态库,编译期合并到引用方 HAP 中,适合组件库、工具库封装。
工程结构示例:
MyApplication
├── entry/ # Entry HAP
│ ├── src/main/ets/
│ ├── src/main/resources/
│ └── module.json5
├── feature_cart/ # Feature HAP
│ └── ...
├── library_common/ # HAR 静态共享包
│ └── ...
└── build-profile.json5配置文件:
module.json5:声明 HAP 的 Ability、权限、依赖等。build-profile.json5:模块编译配置,可声明 HSP/HAR 依赖。
最佳实践:
- 公共 UI 组件、工具函数封装为 HAR。
- 多个 HAP 共享的代码和资源使用 HSP,避免重复打包。
- 按业务拆分 Feature HAP,实现按需下载。
评分维度:
- 能区分 HAP、HSP、HAR 的概念(40%)
- 能说明 Entry HAP 与 Feature HAP 的区别(30%)
- 能给出何时使用 HAR、何时使用 HSP 的建议(30%)
常见错误:
- 把 HAP 和 APK 完全等同,忽略 Feature HAP 的按需加载。
- 所有公共代码都用 HAR,导致多 HAP 体积膨胀。
- 混淆 HSP 和 HAR 的加载时机。
延伸追问:
- Feature HAP 如何实现按需下载?
- HSP 中的资源如何在多个 HAP 间共享?
相关题目:
参考资源:
口头回答版:
鸿蒙应用最终打包成 .app,里面包含 HAP。HAP 是鸿蒙 Ability 包,Entry HAP 是入口,Feature HAP 是可选特性模块。HSP 是动态共享包,多个 HAP 运行时可以共享;HAR 是静态共享包,编译期打包进 HAP。一般公共组件库用 HAR,多个 HAP 共享的代码用 HSP 来减包体积。
FB-46-CO-B-008:鸿蒙的权限管理有哪些类型?如何声明和申请权限?
题型:概念题 难度:🟢 基础 岗位层级:初级 / 高级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:权限管理、ACL、用户授权、module.json5、HarmonyOS 出现频率:高频 预计回答时长:3-5 分钟
题目描述: 请说明 HarmonyOS 权限管理的基本类型,并介绍如何在配置文件中声明权限以及如何向用户申请运行时权限。
参考答案:
HarmonyOS 权限按授权方式分为三类:
| 类型 | 授权时机 | 典型权限 | 说明 |
|---|---|---|---|
| system_grant | 安装时自动授予 | 网络访问、Wi-Fi 状态 | 用户无需感知 |
| user_grant | 运行时弹窗申请 | 相机、麦克风、位置、通讯录 | 需用户同意 |
| ACL(Access Control List) | 特殊能力,需签名/审核 | 读取系统日志、某些系统 API | 需申请对应证书 |
权限声明:
- 在
module.json5的requestPermissions中声明。
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.INTERNET",
"reason": "$string:internet_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "always"
}
},
{
"name": "ohos.permission.CAMERA",
"reason": "$string:camera_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
}
}运行时申请 user_grant 权限示例:
import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit';
async function requestCameraPermission(): Promise<void> {
const permissions: Permissions[] = ['ohos.permission.CAMERA'];
const atManager = abilityAccessCtrl.createAtManager();
const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissions);
if (grantStatus.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
console.info('Camera permission granted');
} else {
console.warn('Camera permission denied');
}
}最佳实践:
- 只申请业务必需权限,遵循最小权限原则。
user_grant权限需要在用户触发相关功能时再申请,不要启动时批量弹窗。- 用户拒绝后应友好引导,不要直接崩溃。
评分维度:
- 能区分 system_grant、user_grant、ACL 三类权限(40%)
- 能在 module.json5 中正确声明权限(30%)
- 能写出运行时申请权限的代码(30%)
常见错误:
- 只声明权限而不在运行时申请 user_grant 权限。
- 把 user_grant 权限当成 system_grant 使用。
- 用户拒绝后不做兜底处理。
延伸追问:
- 用户选择“禁止后不再询问”该如何处理?
- ACL 权限和普通权限在发布审核上有什么区别?
相关题目:
参考资源:
口头回答版:
鸿蒙权限分三类:system_grant 是安装时自动给的,比如网络;user_grant 是运行时弹窗申请的,比如相机、位置、麦克风;ACL 是更高级的系统能力,需要特殊签名或审核。权限要在 module.json5 的 requestPermissions 里声明,user_grant 还要在代码里调用 requestPermissionsFromUser 向用户申请。要遵循最小权限原则,不要一上来就申请一堆权限。
进阶题(8 道)
FB-46-CO-A-009:什么是 HarmonyOS 的分布式能力?分布式软总线如何工作?
题型:概念题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:分布式、软总线、Distributed、跨设备、HarmonyOS 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请解释 HarmonyOS 的分布式能力,重点说明分布式软总线(Distributed Soft Bus)的作用和工作原理。
参考答案:
HarmonyOS 的分布式能力让多个运行鸿蒙系统的设备在逻辑上形成“超级终端”,应用可以跨设备调用硬件、共享数据、迁移任务,而无需关心底层网络细节。
核心分布式能力:
| 能力 | 说明 |
|---|---|
| 分布式软总线 | 设备间自发现、自组网、高速传输的基础通道 |
| 分布式数据管理 | 跨设备数据库、文件、偏好设置共享 |
| 分布式任务调度 | 跨设备启动 Ability、迁移任务 |
| 分布式硬件 | 调用附近设备的相机、屏幕、麦克风、传感器等 |
| 分布式安全 | 设备互信认证、统一身份与权限管理 |
分布式软总线工作原理:
- 设备发现:通过蓝牙、Wi-Fi、NFC、有线等协议发现附近鸿蒙设备。
- 设备认证:基于华为账号或本地 PIN 码建立信任关系。
- 自组网:自动选择最优链路(P2P、WLAN、软总线协议)建立虚拟总线。
- 透明传输:上层应用通过统一 API 发送消息、传输数据,软总线负责路由和 QoS。
- 设备管理:设备上线、离线、网络切换时自动重连。
开发者使用方式:
import { distributedDeviceManager } from '@kit.DistributedServiceKit';
// 获取设备管理器实例
const dmInstance = distributedDeviceManager.createDeviceManager('bundleName');
// 获取可信设备列表
const deviceList = dmInstance.getAvailableDeviceListSync();
deviceList.forEach(device => {
console.info(`deviceId=${device.deviceId}, deviceName=${device.deviceName}`);
});最佳实践:
- 使用
continuationManager做任务迁移。 - 跨设备传输敏感数据时要启用加密。
- 网络状态变化时做好降级处理。
评分维度:
- 能解释分布式软总线的自发现、自组网、透明传输(40%)
- 能列举至少 3 项分布式能力(30%)
- 能说明分布式场景下的安全与降级考虑(30%)
常见错误:
- 认为分布式能力只是“同一 Wi-Fi 下传文件”。
- 忽略设备认证和权限控制。
- 把分布式等同于简单的 WebSocket / MQTT。
延伸追问:
- 跨设备启动 Ability 需要哪些条件和权限?
- 分布式数据同步的冲突如何解决?
相关题目:
参考资源:
口头回答版:
HarmonyOS 的分布式能力让多台鸿蒙设备像一个超级终端一样协同工作。核心是分布式软总线,它负责设备的发现、认证、组网和透明传输,上层应用不需要关心设备之间具体怎么连的。基于软总线可以做跨设备启动 Ability、共享数据、调用其他设备的硬件。对开发者来说,主要是通过 DistributedServiceKit 提供的 API 去发现设备、迁移任务、同步数据。
FB-46-CO-A-010:什么是原子化服务(Atomic Service)?它与传统应用有什么区别?
题型:概念题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:原子化服务、Atomic Service、免安装、卡片、HarmonyOS 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请解释 HarmonyOS 中的原子化服务,并对比它与传统安装型应用的区别、适用场景和开发要点。
参考答案:
原子化服务(Atomic Service)是 HarmonyOS 推出的一种轻量级应用形态,用户无需安装即可使用,通过系统入口(如搜索、扫码、碰一碰、卡片)触发,用完即走。
与传统应用对比:
| 维度 | 原子化服务 | 传统应用 |
|---|---|---|
| 安装方式 | 免安装,即用即走 | 需要下载安装 |
| 包形态 | HAP / HSP,体积更小 | 完整 App Pack |
| 入口 | 卡片、搜索、NFC、二维码、分享 | 桌面图标 |
| 生命周期 | 更短,快速启动销毁 | 长驻后台 |
| 能力范围 | 聚焦单一高频场景 | 功能全面 |
| 分发 | 华为应用市场 / 服务中心 | 应用市场为主 |
开发要点:
- 需要在
module.json5中声明installationFree: true。 - 通常以卡片(Form)作为主要入口和交互载体。
- 需要快速完成核心功能,首屏加载要快。
- 支持账号体系打通,可与传统应用共享数据。
配置示例:
{
"module": {
"type": "atomicService",
"installationFree": true,
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets"
}
]
}
}最佳实践:
- 原子化服务适合订咖啡、查快递、点餐、乘车码等高频短时场景。
- 入口体验要极致,卡片信息要实时准确。
- 复杂流程可引导用户跳转到传统应用。
评分维度:
- 能说明原子化服务免安装、即用即走的特点(40%)
- 能对比传统应用在入口、生命周期、体积上的差异(30%)
- 能指出开发配置和适用场景(30%)
常见错误:
- 把原子化服务当成“小程序”完全等同,忽略其系统级入口和卡片能力。
- 在原子化服务中堆砌复杂功能。
- 忽略首屏性能对原子化服务的重要性。
延伸追问:
- 原子化服务和快应用、微信小程序有什么异同?
- 原子化服务如何实现商业闭环?
相关题目:
参考资源:
口头回答版:
原子化服务是鸿蒙的一种免安装应用形态,用户不用下载安装,通过卡片、搜索、扫码、碰一碰就能直接打开使用,用完即走。它比传统应用更轻量、入口更多、生命周期更短,适合点餐、乘车码、查快递这种高频短时场景。开发时要在 module.json5 里声明 installationFree: true,通常以卡片作为主要入口。
FB-46-CO-A-011:什么是卡片服务(Form / Widget)?它的生命周期是怎样的?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:卡片、Form、Widget、FormExtensionAbility、HarmonyOS 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请介绍 HarmonyOS 的卡片服务,说明卡片的主要类型、生命周期以及更新机制。
参考答案:
卡片(Form / Widget)是 HarmonyOS 上一种轻量级信息展示和交互单元,可以添加到桌面、负一屏、状态栏等系统入口,用户无需打开应用即可获取信息或执行简单操作。
卡片类型:
| 类型 | 说明 | 典型尺寸 |
|---|---|---|
| 静态卡片 | 仅展示固定内容,更新频率低 | 1x2、2x2、2x4、4x4 |
| 动态卡片 | 可定时刷新或接收推送更新 | 同上 |
| JS / ArkTS 卡片 | 使用 ArkTS / JS 编写 UI | 视系统支持 |
| HTML 卡片 | 早期方案,现已逐步被 ArkTS 卡片替代 | - |
卡片生命周期(FormExtensionAbility):
| 回调 | 触发时机 |
|---|---|
onAddForm() | 卡片被添加到桌面时 |
onCastToNormalForm() | 卡片从临时态转为常态 |
onUpdateForm() | 卡片需要更新时 |
onFormEvent() | 卡片触发指定事件时 |
onRemoveForm() | 卡片被移除时 |
onAcquireFormState() | 查询卡片状态 |
卡片更新方式:
- 定时刷新:在
form_config.json中配置updateDuration。 - 主动更新:应用侧调用
updateForm()推送数据。 - 事件触发:点击卡片按钮通过
callEventNotify通知服务。
示例:卡片配置文件 form_config.json
{
"forms": [
{
"name": "WeatherCard",
"displayName": "$string:weather_card",
"description": "$string:weather_card_desc",
"src": "./ets/weatherform/pages/WeatherCard.ets",
"uiSyntax": "arkts",
"window": {
"designWidth": 720,
"autoDesignWidth": true
},
"colorMode": "auto",
"isDefault": true,
"updateEnabled": true,
"scheduledUpdateTime": "10:30",
"updateDuration": 1,
"defaultDimension": "2*2",
"supportDimensions": ["2*2", "2*4"]
}
]
}最佳实践:
- 卡片应聚焦关键信息展示,避免复杂交互。
- 合理使用定时刷新,避免频繁唤醒导致功耗问题。
- 卡片 UI 要适配不同尺寸和深色模式。
评分维度:
- 能说明卡片的定位和入口(30%)
- 能描述 FormExtensionAbility 生命周期(30%)
- 能说出定时刷新、主动更新、事件触发三种更新方式(40%)
常见错误:
- 把卡片当成应用内的一个普通页面。
- 在卡片中做复杂业务逻辑或长时间任务。
- 更新频率设置过高,导致耗电。
延伸追问:
- 卡片和原子化服务是什么关系?
- 卡片点击后如何跳转到应用指定页面?
相关题目:
参考资源:
口头回答版:
鸿蒙卡片是一种轻量级的信息展示单元,可以放到桌面、负一屏,不用打开应用就能看到信息。卡片背后由 FormExtensionAbility 管理生命周期,主要有 onAddForm、onUpdateForm、onRemoveForm 这些回调。更新方式有定时刷新、应用主动调用 updateForm、还有卡片事件触发更新。卡片要尽量轻,不要做复杂交互,避免耗电。
FB-46-CO-A-012:ArkTS 中的状态装饰器有哪些?它们之间有什么区别?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:ArkTS、状态装饰器、@State、@Prop、@Link、@Provide、@Consume 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请介绍 ArkTS 中常用的状态装饰器,并说明 @State、@Prop、@Link、@Provide、@Consume 的区别和使用场景。
参考答案:
状态装饰器是 ArkTS / ArkUI 中实现状态驱动 UI 的核心机制,不同装饰器决定数据在组件树中的流动方向、可修改性和通知范围。
常见装饰器对比:
| 装饰器 | 数据方向 | 是否可在子组件修改 | 同步方式 | 作用范围 |
|---|---|---|---|---|
@State | 组件内部 | 是 | 自身状态变化刷新 | 当前组件 |
@Prop | 父 → 子 | 否(单向同步) | 父变子变,子变不影响父 | 父子单向 |
@Link | 父 ↔ 子 | 是(双向同步) | 双向同步 | 父子双向 |
@Provide / @Consume | 祖先 ↔ 后代 | 是 | 双向同步 | 跨层级 |
@ObjectLink | 父 → 子 | 是(对象属性) | 观察对象内部属性 | 父子 |
@Observed | 标记类 | - | 使类实例可被深度观察 | 类级别 |
@Watch | 监听 | - | 状态变化时执行回调 | 任意 |
示例:
@Component
struct Child {
@Prop title: string; // 父传子,只读
@Link count: number; // 父传子,双向
build() {
Column() {
Text(this.title);
Button(`count: ${this.count}`)
.onClick(() => {
this.count++; // 双向同步会通知父组件
});
}
}
}
@Entry
@Component
struct Parent {
@State message: string = 'Hello';
@State counter: number = 0;
build() {
Column() {
Child({ title: this.message, count: $counter });
Text(`parent counter: ${this.counter}`);
}
}
}注意:
@Link传参时使用$变量名语法。@Prop只能接受父组件的@State、@Link、@Provide等装饰过的变量。@Provide/@Consume通过 key 匹配,适合主题、语言等跨层级数据。
最佳实践:
- 组件自有状态用
@State。 - 父子单向传递用
@Prop,双向同步用@Link。 - 跨层级少量全局数据用
@Provide/@Consume,复杂全局状态用 AppStorage 或状态管理库。
评分维度:
- 能区分 @State、@Prop、@Link 的数据方向(40%)
- 能说明 @Provide / @Consume 的跨层级作用(30%)
- 能在代码中正确使用 $counter 等传参语法(30%)
常见错误:
@Link传参时不使用$语法。- 在子组件中直接修改
@Prop。 @State修饰复杂对象时未加@Observed/@ObjectLink,导致深层属性变化不刷新。
延伸追问:
- 如果 @State 修饰的是一个数组,push 元素会刷新吗?
- @ObjectLink 和 @Link 有什么区别?
相关题目:
参考资源:
口头回答版:
ArkTS 状态装饰器有 @State、@Prop、@Link、@Provide、@Consume 这些。@State 是组件内部状态;@Prop 是父传子单向同步,子组件不能改;@Link 是双向同步,子组件改了父组件也会变,传参要用 $counter 这种写法;@Provide 和 @Consume 是跨层级的双向同步,适合主题、语言这种。要注意 @Prop 不能在子组件里直接修改。
FB-46-CA-A-013:下面代码中,点击按钮后父组件的 counter 会变化吗?为什么?
题型:代码分析题 难度:🟡 进阶 岗位层级:高级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:ArkTS、@Prop、@Link、状态同步、代码分析 出现频率:高频 预计回答时长:3-5 分钟
题目描述:
@Component
struct ChildA {
@Prop counter: number;
build() {
Button(`ChildA: ${this.counter}`)
.onClick(() => {
this.counter++;
});
}
}
@Component
struct ChildB {
@Link counter: number;
build() {
Button(`ChildB: ${this.counter}`)
.onClick(() => {
this.counter++;
});
}
}
@Entry
@Component
struct Parent {
@State counter: number = 0;
build() {
Column({ space: 20 }) {
Text(`Parent counter: ${this.counter}`).fontSize(24);
ChildA({ counter: this.counter });
ChildB({ counter: $counter });
}
.width('100%')
.padding(20);
}
}分别点击 ChildA 和 ChildB 的按钮,父组件的 counter 会变化吗?为什么?
参考答案:
- 点击 ChildA:父组件
counter不会变化。 - 点击 ChildB:父组件
counter会变化。
原因:
- ChildA 使用
@Prop:@Prop是单向同步,子组件中修改counter只是修改子组件自己的副本,不会反向同步给父组件。同时 ArkTS 对@Prop的修改不会触发父组件刷新。 - ChildB 使用
@Link:@Link是双向同步,子组件和父组件共享同一个状态引用。子组件中this.counter++会同步到父组件的@State counter,父组件会重新渲染。
正确的双向同步写法:
ChildB({ counter: $counter });如果希望 ChildA 也能影响父组件,应改为 @Link:
@Component
struct ChildA {
@Link counter: number;
// ...
}
// 父组件
ChildA({ counter: $counter });最佳实践:
- 需要子组件修改父组件数据时,使用
@Link或事件回调。 - 只读展示使用
@Prop,避免意外修改。
评分维度:
- 正确判断 ChildA 不影响父组件、ChildB 影响父组件(40%)
- 能解释 @Prop 单向同步和 @Link 双向同步的区别(40%)
- 能正确写出 @Link 的传参语法(20%)
常见错误:
- 认为
@Prop修改后会同步给父组件。 @Link传参时不使用$counter而写成this.counter。- 在
@Prop修饰的变量上做复杂双向绑定。
延伸追问:
- 如果用
@Prop又想通知父组件更新,应该怎么做? @ObjectLink在这个场景下能否替代@Link?
相关题目:
参考资源:
口头回答版:
点击 ChildA 父组件不会变,因为 ChildA 用的是 @Prop,单向同步,子组件改的只是自己的副本。点击 ChildB 父组件会变,因为 ChildB 用的是 @Link,双向同步,父子共享同一个状态。双向同步传参时要用 $counter 这种写法。
FB-46-CD-A-014:请手写一个可复用的 ArkTS 自定义按钮组件。
题型:手写代码题 难度:🟡 进阶 岗位层级:高级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:ArkTS、自定义组件、@Component、@Prop、@Event、复用 出现频率:中频 预计回答时长:5-10 分钟
题目描述: 请手写一个可复用的 ArkTS 自定义按钮组件 PrimaryButton,支持自定义文案、是否禁用、加载态,并能够向父组件暴露点击事件。
参考答案:
// components/PrimaryButton.ets
@Component
export struct PrimaryButton {
@Prop text: string;
@Prop disabled: boolean = false;
@Prop loading: boolean = false;
@Prop bgColor: ResourceColor = Color.Blue;
@Prop textColor: ResourceColor = Color.White;
// 通过回调向父组件暴露点击事件
onClick?: () => void;
build() {
Button() {
Row({ space: 8 }) {
if (this.loading) {
LoadingProgress()
.width(16)
.height(16)
.color(this.textColor);
}
Text(this.text)
.fontSize(16)
.fontColor(this.textColor)
.fontWeight(FontWeight.Medium);
}
.justifyContent(FlexAlign.Center);
}
.width('100%')
.height(48)
.backgroundColor(this.disabled || this.loading ? Color.Gray : this.bgColor)
.enabled(!(this.disabled || this.loading))
.borderRadius(8)
.onClick(() => {
if (!this.disabled && !this.loading && this.onClick) {
this.onClick();
}
});
}
}父组件使用:
import { PrimaryButton } from '../components/PrimaryButton';
@Entry
@Component
struct LoginPage {
@State isLoading: boolean = false;
handleLogin(): void {
this.isLoading = true;
setTimeout(() => {
this.isLoading = false;
}, 2000);
}
build() {
Column({ space: 20 }) {
PrimaryButton({
text: '登录',
loading: this.isLoading,
onClick: () => this.handleLogin()
});
PrimaryButton({
text: '禁用状态',
disabled: true
});
}
.width('100%')
.padding(20);
}
}设计要点:
- 使用
@Prop接收外部配置,保证组件无状态或低状态。 - 通过
onClick回调而非直接修改父组件状态,遵循单向数据流。 loading和disabled同时影响视觉与可点击状态。- 组件导出使用
export struct,可被其他文件import。
最佳实践:
- 通用组件尽量只接收 props,不依赖外部全局状态。
- 复杂事件可使用
CustomEvent或多参数回调。 - 组件参数提供合理默认值。
评分维度:
- 能正确使用 @Component 和 @Prop(30%)
- 能实现禁用、加载态及点击回调(30%)
- 能在父组件中正确使用该组件(20%)
- 代码风格清晰、可复用(20%)
常见错误:
- 子组件直接修改
@Prop状态。 - 回调传参不使用箭头函数,导致
this指向错误。 - 组件内部硬编码文案和颜色。
延伸追问:
- 如何在自定义组件中暴露更复杂的事件数据?
- 这个组件如果要支持图标前缀,应该怎么扩展?
相关题目:
参考资源:
口头回答版:
我会写一个 PrimaryButton 组件,用 @Component 声明,@Prop 接收 text、disabled、loading、颜色这些配置。里面放一个 Button,Button 里用 Row 包 LoadingProgress 和 Text。当 loading 或 disabled 时,背景变灰并设置 enabled 为 false。点击通过 onClick 回调给父组件处理。父组件用的时候传 text 和回调就行。这样组件无状态、只接收配置,复用性强。
FB-46-PE-A-015:鸿蒙中如何进行列表渲染?有哪些性能优化手段?
题型:性能优化题 难度:🟡 进阶 岗位层级:高级 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:List、ListItem、LazyForEach、性能优化、长列表、ArkUI 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请介绍 ArkUI 中的列表渲染方式,并说明长列表场景下应如何优化性能。
参考答案:
ArkUI 常用列表组件:
| 组件 | 适用场景 |
|---|---|
List | 垂直 / 水平滚动长列表 |
Grid | 网格布局 |
Swiper | 轮播 |
Scroll + Column | 少量静态内容 |
基础列表示例(适合短列表):
List({ space: 12 }) {
ForEach(this.items, (item: ItemModel) => {
ListItem() {
Text(item.name).fontSize(16);
}
}, (item: ItemModel) => item.id);
}
.width('100%')
.height('100%');长列表优化:使用 LazyForEach + List 实现懒加载:
import { BasicDataSource } from '../data/BasicDataSource';
@Entry
@Component
struct LongListPage {
private dataSource: BasicDataSource = new BasicDataSource();
aboutToAppear(): void {
for (let i = 0; i < 1000; i++) {
this.dataSource.pushData({ id: i, name: `Item ${i}` });
}
}
build() {
List({ space: 10 }) {
LazyForEach(this.dataSource, (item: ItemModel) => {
ListItem() {
Text(item.name)
.fontSize(16)
.height(60);
}
}, (item: ItemModel) => item.id.toString());
}
.width('100%')
.height('100%')
.cachedCount(5); // 预加载上下各 5 个 item
}
}性能优化手段:
- 使用
LazyForEach替代ForEach:只渲染可视区 item。 - 提供稳定的 key:基于业务 ID,避免使用 index。
- 设置
cachedCount:预加载上下若干 item,平衡流畅度与内存。 - 固定 item 高度:减少布局测量开销。
- 避免复杂嵌套:减少
Column/Row层级。 - 组件复用:列表项尽量使用相同结构,利于 ArkUI 复用节点。
- 图片懒加载与缓存:
Image组件设置objectFit,使用网络图片缓存。 - 避免在 item 中创建大量
@State:状态越少,刷新范围越小。
最佳实践:
- 数据量超过一屏必须使用
LazyForEach。 - 列表项有图片时,优先使用缩略图或占位图。
- 分页加载配合
onReachEnd事件。
评分维度:
- 能正确使用 List + LazyForEach(30%)
- 能提供稳定 key 和 cachedCount(30%)
- 能说出至少 4 种长列表优化手段(40%)
常见错误:
- 长列表使用
ForEach一次性渲染全部数据。 - 用数组 index 作为 key,导致状态错位。
- item 高度不固定,导致滑动卡顿。
延伸追问:
- LazyForEach 的数据源为什么需要实现 IDataSource?
- 列表中嵌套复杂自定义组件时如何减少重绘?
相关题目:
参考资源:
口头回答版:
ArkUI 列表主要用 List 和 ListItem。短列表可以用 ForEach,长列表一定要用 LazyForEach,只渲染可视区。性能优化要点:给 item 提供稳定唯一的 key,不要用 index;设置 cachedCount 预加载;item 高度尽量固定;减少嵌套层级;列表项状态尽量少;图片做懒加载和缓存。这样能保证长列表流畅。
FB-46-EN-A-016:鸿蒙工程化中有哪些模块化方案?如何选择 HAR、HSP、Feature HAP?
题型:工程化题 难度:🟡 进阶 岗位层级:高级 / 专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:HAR、HSP、Feature HAP、工程化、模块化、Monorepo 出现频率:中频 预计回答时长:5-8 分钟
题目描述: 请介绍鸿蒙工程化中 HAR、HSP、Feature HAP 三种模块化方案,并说明各自的选型依据。
参考答案:
鸿蒙工程化中的三种模块形态:
| 模块 | 加载方式 | 运行独立性 | 适用场景 |
|---|---|---|---|
| HAR | 编译期静态链接到 HAP | 不可独立运行 | 组件库、工具库、常量配置 |
| HSP | 运行期动态共享 | 不可独立运行 | 多 HAP 共享代码/资源 |
| Feature HAP | 运行期动态下载安装 | 可独立运行 | 大业务模块、按需下载 |
选型依据:
HAR 静态库:
- 通用 UI 组件、工具函数、网络封装、常量定义。
- 适合被单个或多个 HAP 引用,编译期合并。
- 缺点是多个 HAP 各自引用同一份 HAR 会重复打包。
HSP 动态共享包:
- 多个 HAP 需要共享同一套代码或资源时使用。
- 运行期只存在一份,减少包体积。
- 适合公共资源、多 HAP 共享的页面或组件。
Feature HAP:
- 大业务模块按功能拆分,用户未使用时无需下载。
- 可独立运行,有自己的 Ability 和生命周期。
- 适合电商、金融、游戏等按业务线拆分的大型应用。
工程组织示例:
MyApp
├── entry/ # Entry HAP(入口)
├── feature_payment/ # Feature HAP(支付模块,按需下载)
├── feature_live/ # Feature HAP(直播模块)
├── library_ui/ # HAR(公共 UI 组件库)
├── library_utils/ # HAR(工具库)
└── shared_common/ # HSP(公共资源)依赖声明示例:
// entry/build-profile.json5
{
"apiType": "stageMode",
"buildOption": {},
"targets": [
{
"name": "default",
"runtimeOS": "HarmonyOS"
}
],
"entryModules": ["entry"]
}最佳实践:
- 基础工具、UI 组件优先 HAR。
- 多 HAP 共享内容优先 HSP。
- 大业务、低频功能使用 Feature HAP 按需加载。
- 建立统一的模块规范、版本管理和依赖审计。
评分维度:
- 能区分 HAR、HSP、Feature HAP 的加载与运行特性(40%)
- 能给出具体选型建议(30%)
- 能说明模块化对包体积和启动速度的影响(30%)
常见错误:
- 所有公共代码都用 HAR,导致重复打包。
- 该拆 Feature HAP 的业务还全部塞进 Entry HAP。
- HSP 中引用 HAR 时出现循环依赖。
延伸追问:
- HSP 和 HAR 在代码引用上有什么限制?
- Feature HAP 如何被 Entry HAP 动态拉起?
相关题目:
参考资源:
口头回答版:
鸿蒙工程化里 HAR 是静态库,编译期打进 HAP,适合 UI 组件、工具库;HSP 是动态共享包,运行期多 HAP 共享,适合公共资源;Feature HAP 是独立功能模块,可以按需下载安装。选型上:基础组件和工具用 HAR,多 HAP 共享内容用 HSP,大业务模块用 Feature HAP。这样能减包体积、加快启动。
深入题(8 道)
FB-46-FS-P-017:ArkUI 的渲染原理是什么?状态变化后如何触发 UI 更新?
题型:框架原理题 难度:🔴 深入 岗位层级:专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:ArkUI、渲染原理、状态管理、VDOM、diff、鸿蒙 出现频率:中频 预计回答时长:8-15 分钟
题目描述: 请深入介绍 ArkUI 的渲染原理,包括声明式 UI 如何转换为实际界面、状态变化后框架如何检测并更新 UI。
参考答案:
ArkUI 渲染流程:
源码编译:
- ArkTS 代码经过 ArkCompiler 进行 AOT 静态编译,生成高效的机器码或字节码。
- 声明式 UI 语法在编译期被解析为 UI 描述信息。
UI 描述构建:
- 运行期执行
build()方法,生成组件树(Component Tree)。 - 组件树是轻量的 UI 描述,不是直接渲染节点。
- 运行期执行
渲染树构建:
- ArkUI 引擎将组件树转换为渲染树(Render Tree)。
- 渲染树包含具体的渲染节点(RenderNode),负责布局、绘制、事件分发。
布局与绘制:
- 布局阶段:计算每个渲染节点的位置和尺寸。
- 绘制阶段:将节点绘制到屏幕上,可能使用 GPU 加速。
状态变化与刷新:
- 被装饰器(
@State、@Prop、@Link等)修饰的变量会被框架观察。 - 状态变化时,框架标记相关组件为脏(dirty)。
- 下一帧渲染时,重新执行
build(),生成新的组件树。 - ArkUI 进行 diff,只更新发生变化的渲染节点,而不是全量重建。
- 被装饰器(
状态观察机制:
| 装饰器 | 观察粒度 |
|---|---|
@State | 组件内部状态 |
@Prop | 父传子,值级别 |
@Link | 引用级别双向同步 |
@ObjectLink | 对象属性级别 |
@Observed | 类级别,使对象可被深度观察 |
AppStorage / LocalStorage | 全局存储 |
性能优化点:
- 状态要尽量放在离使用它最近的组件,避免大范围刷新。
- 复杂对象用
@Observed+@ObjectLink避免整体替换。 - 减少
build()中的条件分支变化,提升 diff 效率。 - 长列表使用
LazyForEach,减少节点创建。
最佳实践:
- 不要手动操作渲染树节点,除非做非常底层的自定义绘制。
- 状态变化应批量处理,避免一帧内多次触发刷新。
评分维度:
- 能描述编译、组件树、渲染树、布局绘制流程(40%)
- 能解释状态装饰器的观察与脏标记机制(30%)
- 能给出性能优化建议(30%)
常见错误:
- 认为 ArkUI 和浏览器 DOM 一样有完整虚拟 DOM。
- 在
build()中直接修改状态。 - 对
@State修饰的深层对象属性变化不刷新感到困惑。
延伸追问:
- ArkUI 的 diff 算法和 React / Vue 的 diff 有什么异同?
- 自定义绘制时如何直接操作 RenderNode?
相关题目:
参考资源:
口头回答版:
ArkUI 渲染分几步:ArkTS 源码被 ArkCompiler 静态编译,运行期 build 方法生成组件树,引擎再转成渲染树,然后布局、绘制到屏幕。状态变化时,框架会观察被装饰器修饰的变量,标记相关组件为脏,下一帧重新 build 并 diff,只更新变化的节点。所以状态要尽量放在最贴近使用的组件,减少刷新范围;复杂对象要用 @Observed 和 @ObjectLink 来观察内部属性。
FB-46-PE-P-018:鸿蒙应用如何进行性能与功耗优化?
题型:性能优化题 难度:🔴 深入 岗位层级:专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:性能优化、功耗、启动速度、内存、ArkUI、HarmonyOS 出现频率:高频 预计回答时长:8-15 分钟
题目描述: 请从启动性能、运行时性能、内存、功耗四个维度,说明鸿蒙应用常见的优化手段。
参考答案:
一、启动性能优化:
| 方向 | 手段 |
|---|---|
| 减少主包体积 | 使用 HSP / Feature HAP 拆分,移除无用资源 |
| 延迟加载 | 非首屏模块动态 import、HAP 按需下载 |
| 减少 Ability 初始化 | onCreate 不做耗时操作,异步初始化 |
| 预加载 | 合理使用 aboutToAppear 与异步数据请求 |
| ArkCompiler AOT | 利用静态编译提升启动和执行速度 |
二、运行时性能优化:
| 方向 | 手段 |
|---|---|
| 列表优化 | LazyForEach、稳定 key、cachedCount、固定高度 |
| 减少重绘 | 状态精准定位,避免大范围 @State 刷新 |
| 图片优化 | 使用合适分辨率、缓存、占位图、WebP |
| 动画优化 | 使用属性动画而非布局动画,避免触发 relayout |
| 避免阻塞主线程 | 耗时任务放入 TaskPool / Worker |
三、内存优化:
| 方向 | 手段 |
|---|---|
| 避免内存泄漏 | 页面销毁时取消订阅、清理定时器 |
| 大对象管理 | 及时释放 Bitmap、长列表复用节点 |
| 避免循环引用 | 注意匿名函数、闭包中的对象引用 |
| 全局状态谨慎 | AppStorage 中不要存放大量数据 |
四、功耗优化:
| 方向 | 手段 |
|---|---|
| 后台限制 | 不在后台常驻 Service,使用短时任务或延迟任务 |
| 传感器/定位 | 用完即停,使用低功耗模式 |
| 网络请求 | 合并请求、断点续传、使用长连接替代频繁短连接 |
| 卡片刷新 | 合理设置 updateDuration,避免频繁唤醒 |
示例:TaskPool 执行耗时任务
import { taskpool } from '@kit.ArkTS';
@Concurrent
function heavyCompute(data: number[]): number {
return data.reduce((sum, v) => sum + v, 0);
}
async function runTask(): Promise<void> {
const task = new taskpool.Task(heavyCompute, [1, 2, 3, 4, 5]);
const result = await taskpool.execute(task) as number;
console.info(`result: ${result}`);
}最佳实践:
- 性能优化要先通过 Profiler 定位瓶颈,再针对性优化。
- 鸿蒙对后台管控严格,不要试图“保活”。
- 多设备场景下要考虑低端设备的性能差异。
评分维度:
- 能从启动、运行时、内存、功耗四个维度展开(40%)
- 能给出具体优化手段和代码示例(30%)
- 能提到 TaskPool / Worker / Profiler 等工具(30%)
常见错误:
- 一上来就做“感知不强”的微观优化,未先测量。
- 把 Web 端优化手段直接套用到鸿蒙,忽略系统限制。
- 滥用后台 Service 导致应用被系统限制或下架。
延伸追问:
- 鸿蒙 Profiler 能看到哪些指标?
- TaskPool 和 Worker 有什么区别?
相关题目:
参考资源:
口头回答版:
鸿蒙性能和功耗优化我分四块来看。启动性能要减包体积、延迟加载、不在 onCreate 做耗时操作;运行时性能主要用 LazyForEach 做列表、状态精准定位避免大范围刷新、图片优化、耗时任务放 TaskPool;内存上注意取消订阅、释放大对象、避免循环引用;功耗上不要后台保活,传感器用完停,卡片刷新频率别太高。优化前最好先用 Profiler 定位瓶颈。
FB-46-CO-P-019:鸿蒙中如何进行 NDK / C++ 开发?适用场景有哪些?
题型:概念题 难度:🔴 深入 岗位层级:专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:NDK、C++、Native、鸿蒙、性能、JNI、NAPI 出现频率:中频 预计回答时长:5-8 分钟
题目描述: 请介绍 HarmonyOS 的 NDK / C++ 开发方式,包括如何与 ArkTS 交互,以及适合使用 Native 开发的场景。
参考答案:
HarmonyOS 支持使用 NDK(Native Development Kit)进行 C / C++ 开发,并通过 NAPI(Native API)或 Node-API 与 ArkTS 通信。
NDK 开发流程:
- 创建 Native 模块:在工程中创建 C++ 模块,目录结构包含
cpp、include、CMakeLists.txt。 - 编写 C++ 代码:实现业务逻辑,使用
napi头文件暴露函数。 - 配置 CMake / ndk:
build-profile.json5中声明 native 编译配置。 - ArkTS 调用:通过
import xxx from 'libentry.so'加载 so 库并调用。
C++ 暴露函数示例:
// hello.cpp
#include "napi/native_api.h"
static napi_value Add(napi_env env, napi_callback_info info) {
size_t argc = 2;
napi_value args[2] = {nullptr};
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
double value0, value1;
napi_get_value_double(env, args[0], &value0);
napi_get_value_double(env, args[1], &value1);
napi_value sum;
napi_create_double(env, value0 + value1, &sum);
return sum;
}
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports) {
napi_property_descriptor desc[] = {
{ "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END
static napi_module demoModule = {
.nm_version = 1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = Init,
.nm_modname = "entry",
.nm_priv = nullptr,
.reserved = { 0 },
};
extern "C" __attribute__((constructor)) void RegisterEntryModule() {
napi_module_register(&demoModule);
}ArkTS 调用:
import testNapi from 'libentry.so';
let result: number = testNapi.add(1, 2);
console.info(`add result: ${result}`);适用场景:
| 场景 | 原因 |
|---|---|
| 音视频编解码 | 复用成熟 C/C++ 库,如 FFmpeg |
| 图像处理 | 高性能像素计算 |
| 游戏引擎 | 需要直接操作 GPU、物理引擎 |
| 加密算法 | 复用 OpenSSL 等库 |
| 性能敏感算法 | C++ 执行效率更高 |
| 跨平台复用 | 复用已有 C++ 业务逻辑 |
最佳实践:
- 仅在确实有性能或复用需求时使用 NDK,否则优先 ArkTS。
- 注意 C++ 内存管理,避免泄漏和崩溃。
- 跨语言传输大数据时使用 TypedArray 减少拷贝。
评分维度:
- 能说明 NDK 与 ArkTS 通过 NAPI 交互(30%)
- 能描述 NDK 开发基本流程(30%)
- 能给出适用场景和最佳实践(40%)
常见错误:
- 为了“性能”把所有业务都放到 C++,增加维护成本。
- NAPI 参数校验不严格,导致崩溃。
- 忽略 C++ 与 ArkTS 之间的线程模型差异。
延伸追问:
- NAPI 和 JNI 有什么异同?
- Native 层如何进行异步回调到 ArkTS?
相关题目:
参考资源:
口头回答版:
鸿蒙支持 NDK C++ 开发,通过 NAPI 和 ArkTS 交互。基本流程是创建 C++ 模块、写 C++ 代码、用 napi 暴露函数、配置 CMake、然后在 ArkTS 里 import so 库调用。适合音视频编解码、图像处理、游戏引擎、加密算法、性能敏感计算,或者复用已有的 C++ 库。但一般业务优先用 ArkTS,只有确实有性能或复用需求才上 NDK。
FB-46-CO-P-020:鸿蒙应用如何做跨设备适配?响应式布局有哪些关键能力?
题型:概念题 难度:🔴 深入 岗位层级:专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:跨设备适配、响应式布局、栅格、断点、HarmonyOS 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请介绍 HarmonyOS 应用面向手机、平板、折叠屏、车机等多设备时的适配方案,重点说明响应式布局和断点系统。
参考答案:
鸿蒙强调“一次开发,多端部署”,跨设备适配依赖以下能力:
响应式布局组件:
Row、Column、Flex、Grid、List、Stack、Swiper等。- 组件尺寸使用百分比、
vp、fp、lpx等相对单位。
断点系统(Breakpoint):
- 根据屏幕宽度自动匹配
xs、sm、md、lg、xl等断点。 - 可配合
mediaQuery或display能力监听窗口变化。
- 根据屏幕宽度自动匹配
栅格系统(GridRow / GridCol):
- 类似 Bootstrap 的 12 列栅格,按断点分配列数。
- 适合复杂页面从手机到平板的自适应。
原子化布局能力:
layoutWeight:按比例分配剩余空间。expandSafeArea:适配刘海、挖孔屏安全区。windowSize/screenSize获取窗口尺寸。
栅格示例:
@Entry
@Component
struct ResponsivePage {
@State currentBp: string = 'md';
build() {
GridRow({ breakpoints: { value: ['320vp', '520vp', '840vp', '1280vp'] } }) {
GridCol({ span: { xs: 12, sm: 12, md: 6, lg: 4 } }) {
Column() {
Text('Card 1').fontSize(20);
}
.width('100%')
.height(120)
.backgroundColor('#f0f0f0');
}
GridCol({ span: { xs: 12, sm: 12, md: 6, lg: 4 } }) {
Column() {
Text('Card 2').fontSize(20);
}
.width('100%')
.height(120)
.backgroundColor('#e0e0e0');
}
GridCol({ span: { xs: 12, sm: 12, md: 12, lg: 4 } }) {
Column() {
Text('Card 3').fontSize(20);
}
.width('100%')
.height(120)
.backgroundColor('#d0d0d0');
}
}
.width('100%')
.padding(16);
}
}多设备适配策略:
| 场景 | 方案 |
|---|---|
| 手机 vs 平板 | 使用栅格 + 断点,调整列数 |
| 折叠屏展开/折叠 | 监听窗口尺寸变化,重新布局 |
| 横竖屏切换 | 使用响应式单位,避免硬编码 |
| 车机 | 考虑远距离交互,按钮尺寸更大 |
| 手表 / IoT | 精简界面,使用专用 Ability |
最佳实践:
- 设计稿以 720vp 为基准,使用
vp单位。 - 避免使用绝对像素和硬编码尺寸。
- 复杂页面拆分为“大纲-详情”两套布局,根据断点切换。
评分维度:
- 能说出响应式组件、断点、栅格等关键能力(40%)
- 能写出 GridRow / GridCol 示例(30%)
- 能给出手机、平板、车机等不同设备的适配策略(30%)
常见错误:
- 用固定 px 写布局,导致不同设备显示异常。
- 忽略折叠屏和窗口多开场景。
- 在车机上直接复用手机 UI,不考虑交互距离。
延伸追问:
- 如何监听窗口尺寸变化并动态调整布局?
- 鸿蒙的断点和 CSS Media Query 有什么异同?
相关题目:
参考资源:
口头回答版:
鸿蒙跨设备适配主要靠响应式布局。核心能力有:用百分比、vp 这些相对单位;用 GridRow / GridCol 栅格系统;用断点系统 xs/sm/md/lg 根据屏幕宽度切换列数;还有 layoutWeight 按比例分配空间、expandSafeArea 适配安全区。设计时尽量不用固定像素,复杂页面可以拆成手机版和平板版两套布局,按断点切换。车机、手表这些特殊设备还要单独考虑交互距离和屏幕大小。
FB-46-SE-P-021:鸿蒙应用的安全架构是怎样的?如何做好权限治理?
题型:安全题 难度:🔴 深入 岗位层级:专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:鸿蒙安全、权限治理、签名、加密、沙箱、ACL 出现频率:中频 预计回答时长:5-8 分钟
题目描述: 请介绍 HarmonyOS 应用安全架构的核心机制,并说明在实际开发中如何做好权限治理。
参考答案:
HarmonyOS 安全架构核心机制:
应用沙箱:
- 每个应用运行在独立的进程和文件沙箱中,默认不能访问其他应用数据。
- 通过
context.filesDir、context.cacheDir等访问私有目录。
应用签名:
- 所有 HAP 必须签名后才能安装运行。
- 发布签名和调试签名分开管理,防止私钥泄露。
权限分级:
system_grant:安装时自动授予。user_grant:运行时申请。ACL:受控权限,需特殊签名或上架审核。
分布式安全:
- 设备间通过信任环(Trust Zone / 华为账号)认证。
- 跨设备传输默认加密。
SELinux / 强制访问控制:
- 系统服务受强制访问控制策略保护。
权限治理实践:
| 方向 | 措施 |
|---|---|
| 最小权限 | 只声明业务必需的权限 |
| 按需申请 | user_grant 权限在功能触发时申请 |
| 用户告知 | 申请前说明权限用途 |
| 拒绝兜底 | 用户拒绝后提供降级方案 |
| 动态撤销 | 监听权限变化,及时释放相关资源 |
| 审计 | 上线前用安全扫描工具检查越权调用 |
代码示例:检查并申请权限
import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit';
async function checkAndRequestPermission(permission: Permissions): Promise<boolean> {
const atManager = abilityAccessCtrl.createAtManager();
const grantStatus = await atManager.checkAccessToken(getContext().applicationInfo.accessTokenId, permission);
if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
return true;
}
const result = await atManager.requestPermissionsFromUser(getContext(), [permission]);
return result.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;
}最佳实践:
- 权限申请文案要明确、具体,符合隐私合规要求。
- 敏感操作(拍照、录音、定位)要有明显提示。
- 跨设备调用硬件时也要校验权限和身份。
评分维度:
- 能说明沙箱、签名、权限分级、分布式安全等机制(40%)
- 能给出权限治理的具体措施(30%)
- 能写出权限检查和申请的代码(30%)
常见错误:
- 一次性申请所有权限,导致用户反感。
- 敏感数据明文存储在私有目录。
- 忽略用户拒绝权限后的体验兜底。
延伸追问:
- 鸿蒙如何实现跨设备数据传输的端到端加密?
- 应用沙箱和 Android 的沙箱机制有什么异同?
相关题目:
参考资源:
口头回答版:
鸿蒙安全架构有应用沙箱、应用签名、权限分级、分布式安全和强制访问控制。每个应用运行在独立沙箱里,HAP 必须签名,权限分 system_grant、user_grant 和 ACL。权限治理要做到最小权限、按需申请、明确告知用户、拒绝后有降级方案,还要动态监听权限变化。敏感数据不要明文存,跨设备传输默认是加密的。
FB-46-CO-P-022:鸿蒙应用状态流转(Continuation)是什么?如何实现?
题型:概念题 难度:🔴 深入 岗位层级:专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:Continuation、状态流转、分布式、迁移、HarmonyOS 出现频率:中频 预计回答时长:5-8 分钟
题目描述: 请解释 HarmonyOS 中的应用状态流转(Continuation / 迁移),并说明实现任务迁移的关键步骤和注意事项。
参考答案:
应用状态流转(Continuation)是 HarmonyOS 分布式能力的核心特性之一,允许用户在一个设备上未完成的操作,无缝迁移到另一个设备继续。例如:手机上编辑的文档迁移到平板继续编辑。
核心概念:
| 概念 | 说明 |
|---|---|
| 源端 | 发起迁移的设备 |
| 目标端 | 接收迁移的设备 |
| Mission | 任务记录,包含 Ability 状态 |
| 迁移数据 | 应用自定义的业务状态 |
实现步骤:
声明分布式迁移能力:
- 在
module.json5中声明continuable: true。
- 在
实现
onContinue()回调:- 在源端 UIAbility 中保存当前业务状态。
- 返回
AGREE表示同意迁移。
在目标端恢复状态:
- 目标端 UIAbility 通过
want参数获取迁移数据,恢复界面。
- 目标端 UIAbility 通过
调用迁移 API:
- 使用
continueManager或系统手势触发迁移。
- 使用
示例代码:
import { UIAbility, Want, AbilityConstant } from '@kit.AbilityKit';
import { continuationManager } from '@kit.ContinuationManagerKit';
export default class EditorAbility extends UIAbility {
private draftContent: string = '';
onContinue(wantParam: Record<string, Object>): AbilityConstant.OnContinueResult {
wantParam['draftContent'] = this.draftContent;
return AbilityConstant.OnContinueResult.AGREE;
}
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
if (want.parameters && want.parameters['draftContent']) {
this.draftContent = want.parameters['draftContent'] as string;
}
}
async startContinue(): Promise<void> {
try {
await continuationManager.startContinuationDeviceManager();
} catch (err) {
console.error(`start continuation failed: ${JSON.stringify(err)}`);
}
}
}注意事项:
- 迁移数据应尽量轻量,大文件通过分布式文件系统传递 URI。
- 两端设备需要登录同一华为账号或完成配对。
- 目标端应用版本需要兼容源端数据结构。
- 迁移过程中要处理网络中断、用户取消等异常。
最佳实践:
- 只迁移必要状态,不要迁移临时缓存。
- 迁移前后保持用户体验一致,避免数据丢失。
- 对敏感业务迁移数据进行加密。
评分维度:
- 能解释 Continuation 的源端、目标端、迁移数据(30%)
- 能说出实现迁移的关键步骤(30%)
- 能指出大文件、账号、版本兼容等注意事项(40%)
常见错误:
- 把全部页面栈和业务数据都序列化迁移,导致数据过大。
- 忽略目标端版本不兼容的问题。
- 未处理迁移失败时的回退逻辑。
延伸追问:
- 迁移和普通的跨设备启动 Ability 有什么区别?
- 鸿蒙的分布式数据库能否替代 Continuation 保存状态?
相关题目:
参考资源:
口头回答版:
Continuation 是鸿蒙的分布式迁移能力,比如手机上写到一半的文档可以无缝迁移到平板继续编辑。实现步骤:在 module.json5 声明 continuable,源端 UIAbility 的 onContinue 里保存业务状态并返回 AGREE,目标端 onCreate 里从 want 参数恢复状态。注意迁移数据要轻量,大文件传 URI,两端要同账号或已配对,目标端版本要兼容,还要处理失败回退。
FB-46-CD-P-023:请手写一个鸿蒙网络请求与状态管理结合的示例。
题型:手写代码题 难度:🔴 深入 岗位层级:专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:网络请求、HTTP、状态管理、@State、Promise、ArkTS 出现频率:中频 预计回答时长:8-15 分钟
题目描述: 请手写一个鸿蒙页面,实现从网络加载用户列表并展示,包含加载中、空态、错误重试三种状态,并说明如何处理并发和内存泄漏。
参考答案:
// models/UserModel.ets
export interface UserModel {
id: number;
name: string;
avatar: string;
}
// api/UserApi.ets
import { http } from '@kit.NetworkKit';
import { UserModel } from '../models/UserModel';
export class UserApi {
static async fetchUsers(): Promise<UserModel[]> {
const httpRequest = http.createHttp();
try {
const response = await httpRequest.request(
'https://api.example.com/users',
{
method: http.RequestMethod.GET,
header: { 'Content-Type': 'application/json' }
}
);
if (response.responseCode === 200 && response.result) {
return JSON.parse(response.result.toString()) as UserModel[];
}
throw new Error(`HTTP ${response.responseCode}`);
} finally {
httpRequest.destroy();
}
}
}// pages/UserListPage.ets
import { UserApi } from '../api/UserApi';
import { UserModel } from '../models/UserModel';
@Entry
@Component
struct UserListPage {
@State users: UserModel[] = [];
@State loading: boolean = false;
@State errorMsg: string = '';
private isActive: boolean = true;
aboutToAppear(): void {
this.loadUsers();
}
aboutToDisappear(): void {
this.isActive = false;
}
async loadUsers(): Promise<void> {
this.loading = true;
this.errorMsg = '';
try {
const data = await UserApi.fetchUsers();
if (this.isActive) {
this.users = data;
}
} catch (err) {
if (this.isActive) {
this.errorMsg = err instanceof Error ? err.message : '加载失败';
}
} finally {
if (this.isActive) {
this.loading = false;
}
}
}
build() {
Column() {
if (this.loading && this.users.length === 0) {
LoadingProgress().width(40).height(40);
Text('加载中...').margin({ top: 12 });
} else if (this.errorMsg) {
Text(this.errorMsg).fontColor(Color.Red);
Button('重试')
.margin({ top: 12 })
.onClick(() => this.loadUsers());
} else if (this.users.length === 0) {
Text('暂无用户');
} else {
List({ space: 12 }) {
ForEach(this.users, (user: UserModel) => {
ListItem() {
Row({ space: 12 }) {
Image(user.avatar)
.width(48)
.height(48)
.borderRadius(24);
Text(user.name).fontSize(16);
}
.width('100%')
.padding(12);
}
}, (user: UserModel) => user.id.toString());
}
.width('100%')
.layoutWeight(1);
}
}
.width('100%')
.height('100%')
.padding(16);
}
}关键点:
- 使用
isActive标志位避免页面销毁后还更新状态。 httpRequest.destroy()释放网络请求资源。- 使用
try / finally确保 loading 状态正确结束。 - 列表使用稳定 key。
最佳实践:
- 网络请求封装到独立模块,统一处理 token、超时、重试。
- 使用
AbortController或类似机制取消未完成的请求。 - 全局状态可使用 AppStorage 或状态管理库。
评分维度:
- 能正确发起 HTTP 请求并解析数据(30%)
- 能实现加载、空态、错误、成功四种 UI 状态(30%)
- 能处理页面销毁后的状态更新与资源释放(20%)
- 代码结构清晰,有错误处理和重试(20%)
常见错误:
- 页面销毁后还继续更新
@State,导致异常。 - 不释放
httpRequest造成资源泄漏。 - 网络请求直接写在
build()中。
延伸追问:
- 如何实现请求取消和竞态处理?
- 如果要做下拉刷新和上拉加载更多,如何扩展?
相关题目:
参考资源:
口头回答版:
我会分三层:Model 定义 User 结构,Api 层用 NetworkKit 的 http 发请求并 destroy 释放,页面层用 @State 管理 users、loading、errorMsg。aboutToAppear 时加载,aboutToDisappear 时把 isActive 置 false,防止页面销毁后还更新状态。UI 上分加载中、错误重试、空态、列表成功四个分支。列表用 ForEach 加稳定 key。网络请求最好再封装一层统一处理 token 和超时。
FB-46-FS-P-024:鸿蒙与 Android / iOS / 小程序 / Flutter 在技术范式上有哪些本质差异?
题型:框架原理题 难度:🔴 深入 岗位层级:专家 面试知识域:46 鸿蒙 ArkTS / HarmonyOS、17 跨端技术 标签:鸿蒙、Android、iOS、Flutter、小程序、跨端、对比 出现频率:中频 预计回答时长:8-15 分钟
题目描述: 请从系统架构、UI 范式、开发语言、应用形态、分发方式等维度,对比鸿蒙与 Android / iOS / 小程序 / Flutter 的本质差异。
参考答案:
| 维度 | HarmonyOS | Android | iOS | 小程序 | Flutter |
|---|---|---|---|---|---|
| 系统内核 | 多内核(微内核 + Linux + LiteOS) | Linux 内核 | XNU / BSD | 依赖宿主 App | 依赖宿主操作系统 |
| 开发语言 | ArkTS、C/C++ | Kotlin / Java | Swift / Obj-C | JavaScript / WXML | Dart |
| UI 范式 | ArkUI 声明式 | 命令式 + Compose 声明式 | 命令式 + SwiftUI 声明式 | 受限的声明式 | Skia 自绘,声明式 |
| 应用形态 | 应用 + 原子化服务 + 卡片 | 传统应用为主 | 传统应用 + Widget | 轻应用 | 应用 |
| 跨设备 | 系统级分布式能力 | 依赖应用层实现 | 依赖 Handoff / AirDrop | 受限于微信生态 | 依赖框架能力 |
| 包结构 | HAP / HSP / HAR | APK / AAB | IPA | 小程序包 | 平台产物 |
| 渲染引擎 | ArkUI 自研渲染管线 | Skia / HWUI | Skia / UIKit | WebView / Skyline | Skia / Impeller |
| 后台管控 | 严格,禁止保活 | 较严格 | 严格 | 受宿主限制 | 较严格 |
| 一次开发多端 | 原生支持 | 需单独适配 | 需单独适配 | 依赖各平台小程序 | Android/iOS 较好 |
本质差异:
- 系统级分布式:鸿蒙把多设备协同作为系统原生能力,而不是应用层协议。
- 原子化服务:鸿蒙有独立的免安装服务形态,入口不仅限于桌面。
- 声明式 UI 原生集成:ArkUI 是鸿蒙第一方 UI 框架,与系统服务深度整合。
- Stage 模型:以“能力”为中心组织应用,支持跨设备迁移。
- 编译优化:ArkCompiler 对 ArkTS 做 AOT 静态编译,提升启动和运行效率。
迁移考虑:
- 从 Android / iOS 迁移:界面需重写为 ArkUI,业务逻辑可复用部分 TS / C++ 代码。
- 从小程序迁移:需重新设计应用结构,但 JS/TS 经验可复用。
- 从 Flutter 迁移:UI 范式接近,但 Widget 树要转为 ArkUI 组件树。
最佳实践:
- 不要简单照搬其他平台的架构,要利用鸿蒙的分布式和卡片能力。
- 复杂业务模块优先用 ArkTS 实现,性能瓶颈处使用 NDK。
评分维度:
- 能从至少 5 个维度进行对比(40%)
- 能指出鸿蒙系统级分布式、原子化服务、Stage 模型等本质差异(30%)
- 能给出不同平台迁移到鸿蒙的注意事项(30%)
常见错误:
- 把鸿蒙简单理解为 Android 换壳。
- 认为 Flutter / 小程序代码可以直接在鸿蒙运行。
- 忽略鸿蒙对后台和权限的严格管控。
延伸追问:
- 如果要把一个大型 Flutter 应用迁移到鸿蒙,你会怎么规划?
- 鸿蒙的 ArkUI 和 Flutter 的 Widget 在渲染管线上的差异是什么?
相关题目:
参考资源:
口头回答版:
鸿蒙和 Android、iOS、小程序、Flutter 最大的区别是系统级分布式能力,多设备协同是原生的。应用形态上除了传统 App,还有原子化服务和卡片。开发语言是 ArkTS,UI 用 ArkUI 声明式。包结构是 HAP/HSP/HAR。对比安卓,鸿蒙不是换壳,内核、应用模型、生命周期、权限管控都不同。Flutter 是自绘引擎,鸿蒙是 ArkUI 自研渲染管线。迁移时 UI 基本要重写,但 TS/JS 经验和部分 C++ 库可以复用。
架构题(32 道)
FB-46-SD-R-025:如何设计一个鸿蒙多端协同的阅读应用?
题型:系统设计题 难度:⚫ 架构 岗位层级:架构师 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:多端协同、架构设计、阅读应用、分布式、Continuation、卡片 出现频率:中频 预计回答时长:15-30 分钟
题目描述: 请设计一个鸿蒙多端协同阅读应用,要求支持手机、平板、车机三种设备,包含书架、阅读器、听书、桌面卡片等功能,并说明关键技术选型和数据同步方案。
参考答案:
一、整体架构:
┌─────────────────────────────────────────┐
│ 多端协同阅读应用 │
├─────────────┬─────────────┬─────────────┤
│ 手机端 │ 平板端 │ 车机端 │
│ 书架/阅读器 │ 沉浸式阅读 │ 听书/语音 │
├─────────────┴─────────────┴─────────────┤
│ 公共 HAR:UI 组件 / 网络 / 存储 │
├─────────────────────────────────────────┤
│ HSP:阅读引擎 / 用户中心 / 书籍资源 │
├─────────────────────────────────────────┤
│ 分布式数据 │ Continuation │ 卡片服务 │
├─────────────────────────────────────────┤
│ 云端:用户数据 / 书籍内容 / 听书服务 / 推荐 │
└─────────────────────────────────────────┘二、模块划分:
| 模块 | 形态 | 说明 |
|---|---|---|
| Entry HAP | 主入口 | 书架、个人中心 |
| Feature Reader | Feature HAP | 阅读器,按需下载 |
| Feature Audio | Feature HAP | 听书模块,按需下载 |
| library_ui | HAR | 通用 UI 组件 |
| library_network | HAR | 网络、缓存、拦截 |
| shared_reader | HSP | 阅读引擎、排版、字体 |
| shared_account | HSP | 账号、阅读进度同步 |
三、多端适配策略:
| 设备 | 重点能力 | UI 策略 |
|---|---|---|
| 手机 | 便携阅读、书架管理 | 单列布局,底部导航 |
| 平板 | 沉浸式大屏阅读 | 双栏书架 + 全屏阅读 |
| 车机 | 听书、语音控制 | 大按钮、语音交互为主 |
四、数据同步方案:
- 阅读进度:使用分布式数据库(DistributedDataObject)或云端同步。
- 书签/笔记:云端数据库为主,本地缓存兜底。
- 书籍资源:大文件存分布式文件或云端 CDN,本地只保留索引。
五、跨设备迁移:
- 手机阅读到一半,通过 Continuation 迁移到平板继续阅读。
onContinue中保存当前章节、页码、字体设置等轻量状态。- 目标端从
want.parameters恢复状态,拉取对应章节内容。
六、卡片服务:
- 桌面卡片展示“最近阅读”和“今日推荐”。
- 点击卡片直接进入阅读器指定章节。
- 定时刷新推荐内容,但控制频率避免耗电。
七、安全与隐私:
- 阅读记录等敏感数据本地加密存储。
- 跨设备同步使用加密通道。
- 用户账号体系与华为账号打通。
最佳实践:
- 公共能力下沉到 HAR / HSP,业务功能用 Feature HAP 按需加载。
- 多端共享状态优先使用鸿蒙分布式数据能力,减少对云端的实时依赖。
- 车机端重点做语音交互和听书,不要做复杂阅读 UI。
评分维度:
- 能合理划分 HAP / HSP / HAR 模块(25%)
- 能给出手机、平板、车机的差异化方案(25%)
- 能设计数据同步和 Continuation 方案(25%)
- 能考虑卡片、安全、性能等非功能需求(25%)
常见错误:
- 所有功能塞进一个 Entry HAP,无法按需加载。
- 多端使用完全相同的 UI,未做针对性适配。
- 跨设备同步时全量传输书籍内容,造成流量和延迟问题。
延伸追问:
- 如果用户离线,阅读进度如何同步?
- 听书模块在后台被系统限制时如何处理?
相关题目:
参考资源:
口头回答版:
我会把应用拆成 Entry HAP 做主入口和书架,阅读器和听书做成 Feature HAP 按需下载,公共 UI 和网络库做成 HAR,阅读引擎和账号数据做成 HSP 多 HAP 共享。手机端侧重便携阅读和书架,平板端做双栏沉浸阅读,车机端主要做听书和语音控制。阅读进度、书签用鸿蒙分布式数据库或云端同步;手机读到一半可以通过 Continuation 迁移到平板。还要有桌面卡片展示最近阅读和今日推荐。安全和离线场景也要考虑。
FB-46-SD-R-026:一个鸿蒙应用从 0 到 1,你会如何做技术选型?
题型:系统设计题 难度:⚫ 架构 岗位层级:架构师 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:技术选型、鸿蒙、架构、ArkTS、HAP、工程化 出现频率:高频 预计回答时长:15-30 分钟
题目描述: 如果你要负责一个中大型鸿蒙应用从 0 到 1 的建设,请从技术栈、应用模型、工程结构、状态管理、网络、数据、测试、CI/CD 等方面说明你的选型思路。
参考答案:
一、技术栈:
| 层面 | 选型 | 说明 |
|---|---|---|
| 开发语言 | ArkTS | 官方主推,强类型,AOT 编译 |
| UI 框架 | ArkUI 声明式 | 原生性能,多端适配 |
| 应用模型 | Stage 模型 | 面向全场景分布式 |
| 跨平台复用 | 仅在性能瓶颈处使用 NDK | 不优先引入跨端框架 |
二、工程结构:
MyApp
├── entry/ # 主入口 HAP
├── features/ # 业务 Feature HAP
│ ├── feature_home/
│ ├── feature_mine/
│ └── feature_search/
├── libraries/ # HAR 静态库
│ ├── library_ui/
│ ├── library_network/
│ ├── library_storage/
│ └── library_utils/
├── shared/ # HSP 动态共享包
│ ├── shared_common/
│ └── shared_account/
└── build-scripts/ # 构建脚本三、状态管理:
- 组件内状态:
@State、@Prop、@Link。 - 跨组件少量状态:
@Provide/@Consume、AppStorage。 - 复杂全局状态:自研 Store 或参考 Redux / Pinia 思想的轻量状态库。
- 避免把所有状态都放在 AppStorage。
四、网络层:
- 基于
@kit.NetworkKit的 http 模块封装。 - 统一处理 baseURL、token、签名、超时、重试、错误码。
- 使用拦截器模式处理日志和缓存。
五、数据持久化:
- 轻量 KV:Preferences。
- 结构化数据:RelationalStore(关系型数据库)。
- 跨设备同步:DistributedKVStore / DistributedDataObject。
- 大文件:DistributedFile 或云端对象存储。
六、测试:
- 单元测试:ArkTS 单元测试框架。
- UI 测试:UiTest 框架。
- 兼容性测试:覆盖手机、平板、折叠屏、车机等设备。
七、CI/CD:
- 代码提交触发静态扫描、类型检查、单元测试。
- 构建产物按环境签名:debug、release、上架。
- 使用华为 AppGallery Connect 分发和灰度。
八、质量门禁:
- 包体积、启动时间、内存占用、功耗纳入 CI 指标。
- 权限最小化和隐私合规审计。
最佳实践:
- 优先使用官方 SDK 和最佳实践,避免引入不成熟第三方库。
- 架构上预留 Feature HAP 扩展点,便于业务线独立演进。
- 建立鸿蒙专属组件库和设计规范。
评分维度:
- 能覆盖语言、模型、工程结构、状态、网络、数据、测试、CI/CD(30%)
- 能给出具体选型和理由(30%)
- 能考虑鸿蒙多端、分布式、包体积等特殊因素(25%)
- 能提出质量门禁和可持续演进方案(15%)
常见错误:
- 直接照搬 Web 或小程序架构。
- 忽视 HAP / HSP / HAR 的选型,导致后期重构。
- 全局状态管理过度设计。
延伸追问:
- 如果团队之前只有 Android 经验,如何快速切换到鸿蒙?
- 鸿蒙目前生态不如安卓成熟,遇到官方 API 缺失怎么办?
相关题目:
参考资源:
口头回答版:
从 0 到 1 做鸿蒙应用,语言用 ArkTS,UI 用 ArkUI 声明式,模型用 Stage。工程上 entry 做主入口,业务拆 Feature HAP,公共 UI 和工具做成 HAR,多 HAP 共享的做成 HSP。状态管理看规模,小组件用 @State/@Link,跨层级用 @Provide/@Consume 或 AppStorage,复杂全局状态做轻量 Store。网络用 NetworkKit 封装统一拦截器,数据持久化用 Preferences、RelationalStore 或分布式数据库。测试要有单元测试和 UiTest,CI/CD 做静态检查、签名打包、灰度发布。还要把包体积、启动时间、功耗纳入质量门禁。
FB-46-SD-R-027:如何设计鸿蒙卡片与原子化服务的整体架构?
题型:系统设计题 难度:⚫ 架构 岗位层级:架构师 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:卡片、原子化服务、架构设计、Form、Widget、分发 出现频率:中频 预计回答时长:15-30 分钟
题目描述: 请设计一个面向鸿蒙的卡片与原子化服务架构,要求覆盖卡片的入口设计、数据刷新、点击跳转、与主应用的协同,以及原子化服务的商业闭环。
参考答案:
一、整体架构:
┌──────────────────────────────────────────┐
│ 系统入口:桌面 / 负一屏 / 搜索 / 扫码 │
├──────────────────────────────────────────┤
│ 卡片层(Form) │
│ ├── 信息展示卡片:天气、待办、快递 │
│ ├── 快捷操作卡片:扫一扫、乘车码、播放控制 │
│ └── 推荐卡片:今日新闻、今日歌单 │
├──────────────────────────────────────────┤
│ 原子化服务层(Atomic Service) │
│ ├── 轻量交互页面 │
│ └── 引导安装完整应用或转化付费 │
├──────────────────────────────────────────┤
│ 主应用层(Full Application) │
│ ├── 完整功能 │
│ ├── 账号 / 数据 / 订单 │
│ └── 商业闭环 │
├──────────────────────────────────────────┤
│ 云端:内容服务 / 推荐引擎 / 推送 / 数据分析 │
└──────────────────────────────────────────┘二、卡片分类与职责:
| 卡片类型 | 职责 | 刷新策略 |
|---|---|---|
| 信息展示型 | 展示关键数据 | 定时 + 云端推送 |
| 快捷操作型 | 一键完成高频操作 | 事件触发 |
| 推荐型 | 引导用户进入服务 | 算法推荐 + 定时 |
三、数据刷新机制:
- 定时刷新:通过
form_config.json的updateDuration配置。 - 主动刷新:应用后台通过
updateForm()推送。 - 事件刷新:卡片内按钮点击触发
callEventNotify。 - 推送刷新:通过 Push Kit 下发卡片数据更新。
四、点击跳转与协同:
- 点击卡片打开原子化服务或主应用指定页面。
- 使用
Router或want携带参数跳转。 - 原子化服务与主应用共享同一账号和数据体系。
五、原子化服务商业闭环:
| 阶段 | 做法 |
|---|---|
| 获客 | 卡片作为系统级入口,降低使用门槛 |
| 激活 | 即用即走,快速完成核心价值 |
| 转化 | 复杂流程引导至主应用或 H5 落地页 |
| 留存 | 卡片定时更新保持曝光,PUSH 召回 |
| 变现 | 主应用内完成订阅、购买、广告 |
六、工程组织:
- 卡片 UI 和逻辑封装为独立 HAR,便于多 HAP 复用。
- FormExtensionAbility 与主应用 Ability 分离,保证卡片轻量。
- 卡片数据接口独立,避免直接依赖主应用业务代码。
最佳实践:
- 卡片信息要“一眼可见”,交互要“一触即达”。
- 卡片刷新频率要平衡实时性和功耗。
- 原子化服务不要做成完整应用的缩水版,而要聚焦核心场景。
评分维度:
- 能清晰划分卡片层、原子化服务层、主应用层(25%)
- 能设计卡片分类、刷新、跳转机制(25%)
- 能说明原子化服务的商业闭环(25%)
- 能考虑工程组织和功耗、体验平衡(25%)
常见错误:
- 卡片信息过多,失去轻量意义。
- 原子化服务没有明确的转化路径,无法形成闭环。
- 卡片刷新频率过高导致耗电。
延伸追问:
- 如何衡量卡片和原子化服务的 ROI?
- 卡片和主应用之间如何安全共享数据?
相关题目:
参考资源:
口头回答版:
我会分三层:系统入口下面是卡片层,负责轻量信息展示和快捷操作;中间是原子化服务层,免安装、聚焦核心场景;下面是主应用层,做完整功能和商业闭环。卡片分信息展示、快捷操作、推荐三类,刷新可以用定时、主动推送、事件触发。点击卡片跳到原子化服务或主应用,数据和账号打通。商业闭环就是卡片获客、原子化服务激活、主应用转化变现。工程上卡片 UI 单独封 HAR,FormExtensionAbility 独立,保证轻量。
FB-46-SD-R-028:将现有跨平台应用迁移到鸿蒙,你会如何制定策略?
题型:系统设计题 难度:⚫ 架构 岗位层级:架构师 面试知识域:46 鸿蒙 ArkTS / HarmonyOS、17 跨端技术 标签:迁移、鸿蒙、跨平台、兼容、重写、策略 出现频率:高频 预计回答时长:15-30 分钟
题目描述: 公司现有一个基于 Flutter / React Native / 小程序 / H5 的跨平台应用,计划迁移到鸿蒙。请制定一个可行的迁移策略,包括技术评估、迁移路径、风险控制和验收标准。
参考答案:
一、迁移前评估:
| 评估维度 | 内容 |
|---|---|
| 现有技术栈 | Flutter / RN / 小程序 / H5 |
| 业务复杂度 | 页面数、自定义组件数、Native 依赖 |
| 核心能力 | 支付、地图、音视频、蓝牙、推送等 |
| 性能要求 | 启动时间、帧率、包体积 |
| 第三方依赖 | SDK 是否有鸿蒙版本 |
| 团队能力 | ArkTS / ArkUI 储备 |
二、迁移策略:
| 来源 | 推荐策略 |
|---|---|
| Flutter | UI 重写为 ArkUI,业务逻辑 TS/JS 可复用,Dart 侧核心算法可用 NDK 重写或保留 C++ |
| React Native | JSX 组件转 ArkUI,JS 业务逻辑迁移较平滑,原生模块需重新实现 |
| 小程序 | 应用结构需重新设计,WXML/JS 经验可复用,但生命周期和路由差异大 |
| H5 | 整体重构为原生 ArkUI,H5 页面可临时用 Web 组件内嵌过渡 |
三、推荐迁移路径:
Phase 1:基础搭建
- 建立鸿蒙工程,确定 HAP / HAR / HSP 结构。
- 搭建公共组件库、网络层、状态管理、埋点。
Phase 2:核心链路迁移
- 优先迁移首页、列表、详情、登录、支付等核心页面。
- 关键 Native 能力用 NDK 或鸿蒙官方 SDK 替换。
Phase 3:能力补齐
- 迁移二级功能、运营活动、推送、分享等。
- 引入卡片、原子化服务等鸿蒙特有能力。
Phase 4:优化与上线
- 性能优化、包体积治理、功耗优化。
- 灰度发布、AB 测试、数据监控。
四、风险控制:
| 风险 | 应对措施 |
|---|---|
| 鸿蒙 SDK 缺失 | 寻找官方替代方案,或自研过渡,评估是否需要降级 |
| 团队学习成本 | 制定培训计划,建立代码规范,Code Review 强化 |
| 双端并行维护 | 抽象公共业务逻辑,建立跨平台共享层 |
| 性能不达标 | 分阶段 Profiling,设立性能基线 |
| 上架审核 | 提前了解华为应用市场政策,权限最小化 |
五、验收标准:
- 功能覆盖率 ≥ 95%。
- 核心链路启动时间、帧率不低于原平台。
- 包体积、功耗、崩溃率满足上线要求。
- 通过华为应用市场上架审核。
最佳实践:
- 不要追求一次性完全重写,优先保障核心链路可用。
- 迁移过程中保留原有应用运行,降低业务风险。
- 充分利用鸿蒙卡片、分布式等能力创造差异化价值。
评分维度:
- 能按来源给出差异化迁移策略(25%)
- 能制定分阶段迁移路径(25%)
- 能识别 SDK 缺失、性能、团队等风险并给出应对(25%)
- 能设定合理的验收标准(25%)
常见错误:
- 要求所有功能一次性迁移完成,导致周期过长。
- 完全照搬原有架构,未利用鸿蒙特有能力。
- 忽略第三方 SDK 的鸿蒙适配情况。
延伸追问:
- 如果某个核心第三方 SDK 暂时没有鸿蒙版本,你会怎么处理?
- 迁移过程中如何与原应用共享业务逻辑,避免重复开发?
相关题目:
参考资源:
口头回答版:
迁移前先评估现有技术栈、业务复杂度、Native 依赖、第三方 SDK 和团队能力。Flutter 过来 UI 要重写,业务逻辑和 C++ 算法可复用;RN 和小程序也是 UI 重写,JS 逻辑能复用一部分;H5 建议整体重构。我推荐分四步走:先搭鸿蒙工程基础,再迁移核心链路,然后补齐二级功能,最后优化上线。风险主要是 SDK 缺失、团队学习成本和性能,要提前找替代方案、做培训、设性能基线。验收看功能覆盖、启动帧率、包体积、崩溃率和上架审核。
FB-46-CP-R-029:如何看待鸿蒙生态的发展?作为前端架构师应如何布局?
题型:综合开放题 难度:⚫ 架构 岗位层级:架构师 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:鸿蒙生态、技术战略、前端架构、全场景、布局 出现频率:中频 预计回答时长:10-20 分钟
题目描述: 请结合鸿蒙生态现状,谈谈你对鸿蒙未来发展的判断,并说明作为前端架构师应如何在团队、技术、产品上布局鸿蒙。
参考答案:
一、鸿蒙生态现状判断:
| 维度 | 现状 |
|---|---|
| 设备覆盖 | 手机、平板、车机、穿戴、IoT 快速增长 |
| 开发者生态 | 官方投入大,文档和工具持续完善 |
| 应用数量 | 头部应用加速适配,长尾应用仍在观望 |
| 技术成熟度 | ArkUI、Stage 模型、分布式能力趋于稳定 |
| 商业模式 | 应用市场、原子化服务、硬件联动带来新机会 |
二、发展机遇:
- 系统级分布式:多设备协同是鸿蒙最大差异化,适合 IoT、车机、办公协同。
- 原子化服务与卡片:降低用户使用门槛,创造新入口。
- 自主可控:政企、金融、关键行业有强烈适配诉求。
- 新流量红利:早期适配者可获得官方推荐和流量扶持。
三、前端架构师布局建议:
团队层面:
- 组建鸿蒙专项小组,培养 ArkTS / ArkUI 核心开发者。
- 建立鸿蒙代码规范、组件库、最佳实践文档。
- 与华为技术团队、生态伙伴保持沟通。
技术层面:
- 搭建鸿蒙基础脚手架和公共库。
- 建立跨端组件抽象层,降低未来多端维护成本。
- 关注 NDK、卡片、分布式等高级能力。
产品层面:
- 识别适合鸿蒙特有能力的产品场景(多设备协同、卡片)。
- 推动核心产品优先适配鸿蒙,抢占流量红利。
- 设计原子化服务和卡片,提升用户触达效率。
生态层面:
- 参与开源社区和鸿蒙开发者活动。
- 输出技术博客、开源组件,建立技术品牌。
- 推动第三方 SDK 鸿蒙化,完善生态。
四、风险与挑战:
- 生态成熟度仍在发展中,部分第三方能力缺失。
- 多设备碎片化带来适配和测试成本。
- 团队需要学习新的语言、框架、工具链。
最佳实践:
- 不要盲目 All-in,应结合业务优先级逐步投入。
- 先落地“标杆项目”,积累经验后再大规模推广。
- 保持对 OpenHarmony 和行业动态的关注。
评分维度:
- 能对鸿蒙生态现状有客观判断(25%)
- 能从团队、技术、产品、生态四个维度给出布局建议(35%)
- 能识别发展机遇与风险(25%)
- 表达有战略高度和可落地性(15%)
常见错误:
- 一味唱衰或一味吹捧,缺乏客观分析。
- 只谈技术,不谈团队培养和产品价值。
- 忽视生态不成熟带来的实际风险。
延伸追问:
- 你认为鸿蒙最大的竞争对手是谁?差异化在哪里?
- 如果公司资源有限,你会优先投入哪些鸿蒙能力?
相关题目:
参考资源:
口头回答版:
我认为鸿蒙生态正处于快速成长期,设备覆盖越来越广,头部应用开始适配,官方投入也很大。最大的机会是系统级分布式、原子化服务和卡片带来的新入口。作为前端架构师,团队上要培养 ArkTS/ArkUI 核心人才;技术上要搭脚手架、公共库,关注 NDK 和分布式能力;产品上要找到适合鸿蒙特有能力的高价值场景;生态上要参与社区、输出技术品牌。但也要看到第三方 SDK 不成熟、多设备适配成本高等风险,建议结合业务优先级逐步投入,先落地标杆项目。
FB-46-PE-R-030:如何为鸿蒙应用建立一套完整的性能工程体系?
题型:性能优化题 难度:⚫ 架构 岗位层级:架构师 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:性能工程、鸿蒙、Profiler、指标体系、CI、性能基线 出现频率:中频 预计回答时长:15-30 分钟
题目描述: 请设计一套适用于鸿蒙应用的性能工程体系,覆盖性能指标定义、监控、分析、优化和防止劣化。
参考答案:
一、性能指标体系:
| 类别 | 核心指标 |
|---|---|
| 启动性能 | 冷启动时间、首屏时间、Ability onCreate 耗时 |
| 运行时 | 列表帧率、页面切换时长、手势响应延迟 |
| 内存 | 峰值内存、Native 内存、泄漏率 |
| 功耗 | 后台唤醒次数、CPU 占用、卡片刷新频率 |
| 包体积 | Entry HAP 体积、资源占比、Feature HAP 下载大小 |
二、性能监控体系:
本地 Profiling:
- 使用 DevEco Studio 自带的 Profiler:CPU、Memory、GPU、Network。
- 关键路径手动埋点,记录启动、页面加载、接口耗时。
线上监控:
- 接入 APM SDK,采集启动时间、崩溃率、ANR、慢帧。
- 分设备、分系统版本、分场景聚合数据。
卡片与原子化服务专项:
- 监控卡片加载时长、更新成功率、耗电占比。
三、性能分析流程:
发现问题 → 复现定位 → Profiler 采样 → 根因分析 → 制定优化 → 验证收益 → 固化基线四、优化闭环:
| 阶段 | 动作 |
|---|---|
| 日常 | Code Review 中关注性能风险 |
| 迭代 | 新功能上线前做性能测试 |
| 灰度 | 对比旧版本关键指标 |
| 复盘 | 重大性能问题写 Postmortem |
五、防止劣化:
- 性能基线:每个核心页面/Ability 设定启动、帧率、内存基线。
- CI 门禁:合并请求触发性能测试,超过基线阻止合并。
- 包体积门禁:HAP 体积增长超过阈值自动告警。
- 功耗门禁:后台任务、卡片刷新纳入审核清单。
六、组织架构:
- 设立性能 Owner,负责指标建设和优化推进。
- 各业务线指定性能接口人。
- 定期召开性能复盘会。
最佳实践:
- 性能优化要数据驱动,避免拍脑袋。
- 关键指标要可量化、可对比、可回溯。
- 性能文化需要长期建设,不是一次性项目。
评分维度:
- 能定义合理的性能指标体系(25%)
- 能设计本地 + 线上监控方案(25%)
- 能给出优化闭环和防止劣化机制(30%)
- 能考虑组织保障和持续运营(20%)
常见错误:
- 只关注启动时间,忽略帧率、功耗、内存。
- 性能数据缺乏分场景、分设备聚合。
- 没有性能基线和 CI 门禁,劣化无法及时发现。
延伸追问:
- 鸿蒙 Profiler 和传统 Android Profiler 在使用上有什么不同?
- 如何在低版本鸿蒙设备上保持性能一致性?
相关题目:
参考资源:
口头回答版:
我会从指标体系、监控、分析、优化、防止劣化五个层面来建性能工程体系。指标包括启动、运行时帧率、内存、功耗、包体积。监控分本地 Profiler 和线上 APM。分析流程是发现问题、复现、采样、根因、优化、验证、固化基线。防止劣化主要靠性能基线、CI 门禁、包体积和功耗审核。还要有性能 Owner 和定期复盘,把性能当成持续运营的事。
FB-46-SD-R-031:设计一个面向企业内部的鸿蒙办公协同平台架构。
题型:系统设计题 难度:⚫ 架构 岗位层级:架构师 面试知识域:46 鸿蒙 ArkTS / HarmonyOS 标签:企业架构、办公协同、鸿蒙、安全、多端、私有化 出现频率:中频 预计回答时长:15-30 分钟
题目描述: 请设计一个面向企业内部的鸿蒙办公协同平台,要求支持即时通讯、日程、审批、文档预览、会议投屏、多端协同,并重点考虑安全合规和私有化部署。
参考答案:
一、整体架构:
┌─────────────────────────────────────────────┐
│ 终端层:手机 / 平板 / PC / 车机 / 智慧屏 │
├─────────────────────────────────────────────┤
│ 鸿蒙应用:IM / 日程 / 审批 / 文档 / 会议 / 投屏 │
├─────────────────────────────────────────────┤
│ 公共 HAR/HSP:UI 组件 / 网络 / 安全 / 推送 / 存储 │
├─────────────────────────────────────────────┤
│ 网关层:API Gateway / 推送网关 / 文件网关 │
├─────────────────────────────────────────────┤
│ 业务中台:IM / 日程 / 审批 / 文档 / 会议 / 搜索 │
├─────────────────────────────────────────────┤
│ 数据中台:用户中心 / 权限中心 / 审计日志 / 知识库 │
├─────────────────────────────────────────────┤
│ 基础设施:私有化服务器 / 对象存储 / 数据库 / 缓存 │
└─────────────────────────────────────────────┘二、鸿蒙特有能力应用:
| 场景 | 鸿蒙能力 |
|---|---|
| 会议投屏 | 分布式软总线,手机一键投屏到智慧屏 |
| 多端协同 | Continuation,手机上编辑文档迁移到平板 |
| 日程提醒 | 卡片服务,桌面展示今日会议 |
| 审批待办 | 原子化服务 + 卡片,快速审批 |
| 文档预览 | ServiceExtensionAbility 后台渲染 |
三、安全合规设计:
- 数据安全:端到端加密、国密算法、本地数据加密存储。
- 身份安全:统一身份认证(SSO)、多因素认证、设备绑定。
- 访问控制:RBAC / ABAC 权限模型,敏感操作审计。
- 合规:满足等保、数据本地化、隐私合规要求。
- 应用安全:防截屏、防录屏、安全键盘、水印。
四、私有化部署:
- 支持企业私有服务器部署,不与公网直连。
- 推送网关可对接企业自有推送服务。
- 文件存储支持私有对象存储或 NAS。
- 支持离线模式,弱网环境下基本功能可用。
五、多端一致性:
- 核心数据通过企业数据中台同步。
- 使用鸿蒙分布式数据库实现跨设备实时同步。
- 复杂 UI 按设备形态自适应。
六、工程组织:
- Entry HAP:工作台入口。
- Feature HAP:IM、日程、审批、文档、会议独立模块。
- HAR:企业级 UI 组件、安全 SDK、网络 SDK。
- HSP:公共业务模型、账号体系。
最佳实践:
- 企业场景优先保证安全和稳定,其次才是体验。
- 敏感数据不出企业内网,所有外发需审计。
- 建立灾备和回滚机制。
评分维度:
- 能合理划分业务模块和鸿蒙特有能力(25%)
- 能设计安全合规和私有化部署方案(30%)
- 能说明多端协同和数据同步机制(25%)
- 能考虑工程组织和可运维性(20%)
常见错误:
- 忽视企业场景对安全和合规的严格要求。
- 所有业务模块耦合在一个 HAP 中。
- 跨设备同步时不考虑弱网和离线场景。
延伸追问:
- 如果企业要求数据完全不出内网,推送怎么做?
- 如何防止企业内部应用被截图或录屏泄露?
相关题目:
参考资源:
口头回答版:
企业办公协同平台我会分层设计:终端层是鸿蒙各种设备,应用层按 IM、日程、审批、文档、会议拆成 Feature HAP,公共能力下沉到 HAR/HSP。鸿蒙特有能力方面:会议投屏用分布式软总线、文档编辑用 Continuation 迁移、日程和审批用卡片和原子化服务。安全和私有化是关键:数据端到端加密、国密、本地加密、SSO、审计、防截屏;支持私有化部署、离线模式、企业自有推送。企业场景优先保安全和稳定。
FB-46-CO-A-013:鸿蒙 HarmonyOS 的 Ability 是什么?有哪些类型?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、Ability、FA、PA、组件 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明 HarmonyOS 中 Ability 的概念及主要类型。
参考答案: Ability 是 HarmonyOS 应用的基本组成单元,代表一种应用能力。主要分为:
FA(Feature Ability)
- 有 UI 界面,对应页面级能力。
- 类似 Android 的 Activity。
- 使用 JS/eTS 开发。
PA(Particle Ability)
- 无 UI 界面,对应后台服务能力。
- 类似 Android 的 Service。
- 可分为 Data Ability 和 Service Ability。
在 HarmonyOS NEXT / API 9+ 中,Ability 模型演进为 Stage 模型:
- UIAbility:带界面的应用组件。
- ExtensionAbility:扩展能力,如服务卡片、输入法、壁纸等。
Ability 生命周期:
- UIAbility:onCreate、onWindowStageCreate、onForeground、onBackground、onWindowStageDestroy、onDestroy。
FA 和 PA 的交互:
- FA 可以启动 PA 完成后台任务。
- PA 可以通过 EventHandler 或 CommonEvent 向 FA 通知结果。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
HarmonyOS 的 Ability 是应用基本组成单元。FA 有 UI 类似 Activity,PA 无 UI 类似 Service。新 Stage 模型有 UIAbility 和 ExtensionAbility。UIAbility 生命周期包括 onCreate、onWindowStageCreate、onForeground、onBackground、onDestroy 等。
FB-46-CO-A-014:鸿蒙 ArkTS 与 TypeScript 有什么区别?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、ArkTS、TypeScript、区别 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙 ArkTS 语言与 TypeScript 的主要区别。
参考答案: ArkTS 是鸿蒙基于 TypeScript 扩展的声明式 UI 开发语言。
主要区别:
声明式 UI
- ArkTS 内置声明式 UI 语法,类似 SwiftUI/Flutter。
- TypeScript 本身不支持声明式 UI,需依赖框架。
状态管理
- ArkTS 提供
@State、@Prop、@Link、@Provide、@Consume等装饰器。 - 实现组件状态管理和数据绑定。
- ArkTS 提供
强类型约束
- ArkTS 对类型要求更严格,运行前做更多静态检查。
- 不支持 TS 中部分动态特性,如 any 的滥用。
性能优化
- ArkTS 编译为方舟编译器 IR,运行效率高。
- 针对鸿蒙 Runtime 优化。
UI 描述
- 使用 ArkUI 框架,通过 ArkTS 描述 UI。
- 组件化、状态驱动、响应式。
生态差异
- ArkTS 运行在鸿蒙生态,依赖 ArkUI 和鸿蒙 API。
- TypeScript 可运行在任何支持 JS 的平台。
示例:
@Entry
@Component
struct Index {
@State message: string = 'Hello HarmonyOS';
build() {
Column() {
Text(this.message)
}
}
}评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
ArkTS 是基于 TypeScript 扩展的声明式 UI 语言,有状态装饰器如 @State、@Prop、@Link,类型约束更严格,编译为方舟 IR 性能高,依赖 ArkUI 框架。
FB-46-CO-A-015:鸿蒙 ArkUI 中的 @State、@Prop、@Link 有什么区别?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、ArkUI、状态管理、装饰器 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明 ArkUI 中 @State、@Prop、@Link 三种状态装饰器的区别和使用场景。
参考答案: ArkUI 状态装饰器:
| 装饰器 | 数据流向 | 修改权限 | 使用场景 |
|---|---|---|---|
@State | 组件内部 | 组件内可修改 | 组件自有状态 |
@Prop | 父 → 子 | 子组件只读 | 父传数据给子展示 |
@Link | 父 ↔ 子 | 双向同步 | 父子共享可变状态 |
示例:
@Entry
@Component
struct Parent {
@State count: number = 0
build() {
Column() {
ChildProp({ count: this.count }) // 单向传递
ChildLink({ count: $count }) // 双向绑定
}
}
}
@Component
struct ChildProp {
@Prop count: number
build() { Text(`${this.count}`) }
}
@Component
struct ChildLink {
@Link count: number
build() {
Button('add').onClick(() => this.count++)
}
}注意:
@Prop是深拷贝单向传递,子组件修改不影响父组件。@Link是引用绑定,子组件修改会同步父组件。- 复杂状态可用
@Provide/@Consume跨层级传递。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
@State 是组件内部状态,@Prop 是父到子单向只读,@Link 是父子双向同步。Prop 深拷贝单向,Link 引用双向。复杂状态用 @Provide/@Consume。
FB-46-CO-A-016:鸿蒙的 Stage 模型和 FA 模型有什么区别?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、Stage模型、FA模型、Ability 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明 HarmonyOS 中 Stage 模型与 FA 模型的主要区别。
参考答案: Stage 模型与 FA 模型区别:
| 维度 | FA 模型 | Stage 模型 |
|---|---|---|
| 开发语言 | JS/Java | ArkTS/eTS |
| Ability 类型 | FA(UI)+ PA(Service/Data) | UIAbility + ExtensionAbility |
| 窗口管理 | 由 FA 自己管理 | WindowStage 统一托管 |
| 进程模型 | 多 Ability 可在同一进程 | 更灵活的进程和 Ability 管理 |
| 生命周期 | 较简单 | 更完整,适配多窗口/折叠屏 |
| 推荐版本 | API 8 及以前 | API 9 及以后 |
Stage 模型优势:
- 更好的多窗口、分屏、折叠屏适配。
- 更清晰的生命周期和窗口管理。
- 更适合复杂应用开发。
- 是 HarmonyOS 未来发展的主要方向。
迁移建议:
- 新项目直接使用 Stage 模型。
- 老项目逐步从 FA 模型迁移到 Stage 模型。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
FA 模型是早期模型,用 JS/Java,Stage 模型是 API9 后的新模型,用 ArkTS,有 UIAbility 和 ExtensionAbility,WindowStage 托管窗口,生命周期更完整,更好适配多窗口折叠屏,是新项目首选。
FB-46-CO-A-017:鸿蒙应用如何实现页面路由跳转?
题型:概念题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、路由、跳转、UIAbility 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙 Stage 模型中页面路由跳转的方式。
参考答案: 鸿蒙页面跳转方式:
同 Ability 内页面跳转
- 使用
@ohos.router模块。 router.pushUrl({ url: 'pages/Detail' })。router.back()返回。- 支持传参:
params。
- 使用
不同 Ability 间跳转
- 使用
UIAbilityContext的startAbility。 - 通过
want参数指定目标 Ability 和参数。
- 使用
返回结果
startAbilityForResult启动目标 Ability。- 目标 Ability 通过
terminateSelfWithResult返回结果。
示例:
import router from '@ohos.router';
// 同 Ability 跳转
router.pushUrl({
url: 'pages/Detail',
params: { id: 123 }
});
// 读取参数
const params = router.getParams() as Record<string, string>;注意:
- 页面栈管理由框架负责。
- 避免循环跳转导致栈溢出。
- 跨 Ability 跳转涉及进程间通信,参数需序列化。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
鸿蒙同 Ability 内用 @ohos.router 的 pushUrl/back,跨 Ability 用 UIAbilityContext.startAbility,可 startAbilityForResult 拿返回结果。注意页面栈管理和跨 Ability 参数序列化。
FB-46-CO-B-009:鸿蒙的原生能力如何调用?如何与前端 ArkTS 交互?
题型:概念题 难度:🟢 基础 岗位层级:初级 面试知识域:鸿蒙 标签:HarmonyOS、原生能力、NAPI、ArkTS 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙中如何调用系统原生能力,以及 ArkTS 与 C/C++ 原生代码的交互方式。
参考答案: 鸿蒙调用原生能力方式:
系统 API
- 鸿蒙提供大量系统 API 模块,如
@ohos.file.fs、@ohos.network.http。 - ArkTS 直接 import 调用。
- 鸿蒙提供大量系统 API 模块,如
NAPI(Native API)
- 用于 ArkTS 与 C/C++ 原生代码交互。
- 类似 Node.js 的 N-API。
- 适合调用底层库、高性能计算、复用 C/C++ 代码。
NAPI 开发流程
- 编写 C/C++ 实现。
- 使用 NAPI 接口注册模块和函数。
- 在 ArkTS 中通过 import 引入 .so 库调用。
三方库
- 通过 OHPM(OpenHarmony Package Manager)引入。
- 或在 CMake 中集成开源 C/C++ 库。
示例:
import testNapi from 'libentry.so';
let result = testNapi.add(1, 2);适用场景:
- 音视频编解码、图像处理、加密算法、游戏引擎等高性能场景。
- 复用现有 C/C++ 资产。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
鸿蒙 ArkTS 可直接用系统 API,需要高性能或 C/C++ 时用 NAPI 交互。NAPI 类似 Node.js N-API,C/C++ 实现注册模块后 ArkTS 引入 .so 调用。适合音视频、图像、加密等场景。
FB-46-CD-A-015:用 ArkTS 实现一个简单的计数器组件。
题型:手写代码题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:ArkTS、计数器、组件、手写代码 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请用 ArkTS 编写一个计数器组件,包含显示数字、增加、减少按钮。
参考答案:
@Entry
@Component
struct Counter {
@State count: number = 0
build() {
Column({ space: 20 }) {
Text(`${this.count}`)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Row({ space: 20 }) {
Button('-')
.width(80)
.onClick(() => {
this.count--
})
Button('+')
.width(80)
.onClick(() => {
this.count++
})
}
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}关键点:
- 使用
@State管理 count 状态。 - 点击事件通过
.onClick绑定。 - 使用
Column和Row进行布局。 - 状态变化会自动触发 UI 刷新。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
用 @State 管理 count,Column 和 Row 布局,Text 显示数字,两个 Button 分别 onClick 增减 count。状态变化自动刷新 UI。
FB-46-CD-A-016:用 ArkTS 实现一个 TODO 列表,支持添加和删除。
题型:手写代码题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:ArkTS、TODO、列表、手写代码 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请用 ArkTS 实现一个简单 TODO 列表,包含输入框、添加按钮、列表展示和删除功能。
参考答案:
class TodoItem {
id: number
text: string
constructor(id: number, text: string) {
this.id = id
this.text = text
}
}
@Entry
@Component
struct TodoList {
@State todos: TodoItem[] = []
@State inputText: string = ''
build() {
Column({ space: 12 }) {
Row({ space: 10 }) {
TextInput({ placeholder: '输入待办事项', text: $$this.inputText })
.layoutWeight(1)
Button('添加')
.onClick(() => {
if (this.inputText.trim()) {
this.todos.push(new TodoItem(Date.now(), this.inputText))
this.inputText = ''
}
})
}
.width('100%')
.padding(16)
List({ space: 10 }) {
ForEach(this.todos, (item: TodoItem) => {
ListItem() {
Row() {
Text(item.text)
.layoutWeight(1)
Button('删除')
.fontSize(12)
.onClick(() => {
const index = this.todos.findIndex(t => t.id === item.id)
if (index > -1) this.todos.splice(index, 1)
})
}
.width('100%')
.padding(12)
.backgroundColor('#f5f5f5')
.borderRadius(8)
}
}, (item: TodoItem) => item.id.toString())
}
.width('100%')
.layoutWeight(1)
.padding(16)
}
.width('100%')
.height('100%')
}
}关键点:
@State管理 todos 和 inputText。ForEach渲染列表,必须提供唯一 key。TextInput使用$$this.inputText双向绑定。- 删除时通过 id 定位。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
用 @State 管理 todos 和 inputText,TextInput 双向绑定,点击添加 push 新项,列表用 ForEach 渲染并给唯一 key,删除时按 id splice。
FB-46-CD-A-017:用 ArkTS 实现一个简单的网络请求并展示列表。
题型:手写代码题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:ArkTS、网络请求、列表、手写代码 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请用 ArkTS 编写一个页面,发起 HTTP 请求获取列表数据并展示。
参考答案:
import http from '@ohos.net.http';
interface Item {
id: number
title: string
}
@Entry
@Component
struct HttpList {
@State list: Item[] = []
@State loading: boolean = false
@State errorMsg: string = ''
aboutToAppear() {
this.fetchData()
}
fetchData() {
this.loading = true
const httpRequest = http.createHttp()
httpRequest.request(
'https://jsonplaceholder.typicode.com/posts',
{ method: http.RequestMethod.GET },
(err, data) => {
this.loading = false
if (!err && data.responseCode === 200) {
this.list = JSON.parse(data.result.toString()) as Item[]
} else {
this.errorMsg = '请求失败'
}
}
)
}
build() {
Column() {
if (this.loading) {
Text('加载中...')
} else if (this.errorMsg) {
Text(this.errorMsg)
} else {
List({ space: 10 }) {
ForEach(this.list.slice(0, 20), (item: Item) => {
ListItem() {
Text(`${item.id}. ${item.title}`)
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
}
.padding(12)
}, (item: Item) => item.id.toString())
}
}
}
.width('100%')
.height('100%')
.padding(16)
}
}关键点:
- 在
aboutToAppear生命周期发起请求。 - 使用
@ohos.net.http模块。 - 异步回调中更新
@State。 - 注意网络权限配置。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
在 aboutToAppear 里用 @ohos.net.http 发请求,回调中更新 @State list,UI 根据 loading、error、list 状态渲染。注意网络权限。
FB-46-CD-A-018:用 ArkTS 实现一个自定义弹窗组件。
题型:手写代码题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:ArkTS、弹窗、自定义组件、手写代码 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请用 ArkTS 实现一个可复用的自定义弹窗组件,支持标题、内容、确认和取消按钮。
参考答案:
@CustomDialog
struct ConfirmDialog {
controller: CustomDialogController
title: string = '提示'
message: string = ''
onConfirm?: () => void
onCancel?: () => void
build() {
Column({ space: 20 }) {
Text(this.title)
.fontSize(20)
.fontWeight(FontWeight.Bold)
Text(this.message)
.fontSize(16)
.fontColor('#666')
Row({ space: 20 }) {
Button('取消')
.backgroundColor('#eee')
.fontColor('#333')
.onClick(() => {
this.controller.close()
this.onCancel?.()
})
Button('确认')
.onClick(() => {
this.controller.close()
this.onConfirm?.()
})
}
}
.padding(24)
.backgroundColor(Color.White)
.borderRadius(12)
.width('80%')
}
}
@Entry
@Component
struct Page {
dialogController: CustomDialogController | null = null
aboutToAppear() {
this.dialogController = new CustomDialogController({
builder: ConfirmDialog({
title: '删除确认',
message: '确定要删除吗?',
onConfirm: () => console.log('确认'),
onCancel: () => console.log('取消')
})
})
}
build() {
Column() {
Button('打开弹窗')
.onClick(() => {
this.dialogController?.open()
})
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}关键点:
- 使用
@CustomDialog装饰器定义弹窗组件。 - 通过
CustomDialogController控制打开和关闭。 - 支持传入标题、内容、回调。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
用 @CustomDialog 定义弹窗组件,接收 title、message、onConfirm、onCancel,外部用 CustomDialogController 控制 open/close。
FB-46-CO-P-023:鸿蒙应用如何适配不同设备(手机、平板、折叠屏、车机)?
题型:概念题 难度:🔴 深入 岗位层级:专家 面试知识域:鸿蒙 标签:HarmonyOS、多设备适配、响应式、布局 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙应用如何适配多种终端设备的屏幕尺寸和交互方式。
参考答案: 鸿蒙多设备适配方案:
响应式布局
- 使用百分比、Flex、Grid、媒体查询。
- ArkUI 提供
Row、Column、Grid、List、Tabs等响应式容器。
断点系统
- 根据屏幕宽度定义断点(sm、md、lg)。
- 不同断点下调整布局和组件显示。
原子化服务与 Ability 复用
- 同一 Ability 可在不同设备上运行。
- 根据设备类型加载不同 UI 或布局。
资源限定符
- 使用
resources/base、resources/rawfile、resources/${device}等目录。 - 为不同设备提供差异化资源。
- 使用
折叠屏适配
- 监听屏幕折叠状态变化。
- 使用
display模块获取屏幕信息。 - 调整布局避免元素被折叠处遮挡。
交互方式差异
- 车机:大按钮、语音交互、驾驶模式。
- 手表:极小屏幕,精简信息。
- 电视:遥控器焦点导航。
1+8+N 生态
- 鸿蒙强调多端协同。
- 应用可跨设备流转,需考虑接续和分布式能力。
开发建议
- 优先使用响应式组件,减少设备判断代码。
- 用模拟器和真机测试不同设备。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
鸿蒙多设备适配用响应式布局、断点系统、资源限定符,监听折叠屏状态,根据不同设备交互方式调整,支持 1+8+N 生态跨设备流转。
FB-46-CO-P-024:鸿蒙的分布式能力有哪些?前端如何调用?
题型:概念题 难度:🔴 深入 岗位层级:专家 面试知识域:鸿蒙 标签:HarmonyOS、分布式、软总线、能力 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙分布式能力的核心概念,以及前端 ArkTS 如何调用分布式能力。
参考答案: 鸿蒙分布式能力:
分布式软总线
- 设备间自动发现、连接、组网。
- 无需关心底层网络协议。
分布式数据管理
- 跨设备数据共享和同步。
- 如分布式数据库、分布式文件系统。
分布式任务调度
- 应用跨设备迁移、协同。
- 例:手机上视频通话流转到平板。
分布式设备虚拟化
- 将其他设备的硬件能力虚拟化为本机能力。
- 如调用其他手机的摄像头、麦克风。
前端调用方式:
系统 API
@ohos.distributedDeviceManager:设备管理。@ohos.data.distributedDataObject:分布式数据对象。@ohos.distributedHardware:分布式硬件。
跨设备 Ability 启动
- 通过
startAbility指定目标设备 ID。 - 实现应用跨设备流转。
- 通过
分布式数据库
- 创建同步数据库,数据自动在多设备间同步。
示例场景:
- 手机编辑文档,自动同步到平板继续编辑。
- 手机来电时,车机自动接听。
注意:
- 分布式能力需要设备登录同一华为账号并开启相关权限。
- 当前开放能力随版本演进。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
鸿蒙分布式能力包括软总线、数据管理、任务调度、设备虚拟化。前端用 @ohos.distributedDeviceManager 等 API,通过 startAbility 跨设备启动,分布式数据库自动同步。
FB-46-CO-P-025:鸿蒙应用如何做性能优化?
题型:概念题 难度:🔴 深入 岗位层级:专家 面试知识域:鸿蒙 标签:HarmonyOS、性能优化、ArkTS、ArkUI 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙 ArkTS/ArkUI 应用的性能优化方向。
参考答案: 鸿蒙应用性能优化方向:
减少状态更新
- 避免不必要的
@State装饰,减少重渲染。 - 只更新真正变化的数据。
- 避免不必要的
组件复用
- 使用
LazyForEach+cachedCount优化长列表。 - 避免一次性创建大量组件。
- 使用
避免深层嵌套
- 减少 UI 层级,提升渲染性能。
图片优化
- 使用合适尺寸和格式。
- 开启图片懒加载、缓存。
网络优化
- 合并请求、缓存数据、压缩传输。
启动优化
- 延迟加载非首屏资源。
- 使用
aboutToAppear合理初始化。
内存管理
- 及时释放不需要的资源和监听。
- 避免内存泄漏。
异步操作
- I/O、网络、复杂计算放异步任务。
- 避免阻塞主线程。
使用性能工具
- DevEco Studio 提供 Profiler、Memory、CPU、Network 分析工具。
- 针对性优化。
NAPI 高性能计算
- 复杂计算用 C/C++ 通过 NAPI 实现。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
鸿蒙性能优化要减少状态更新、组件复用、避免深层嵌套、图片网络优化、启动延迟加载、内存管理、异步操作、用 DevEco Profiler、复杂计算用 NAPI。
FB-46-CO-P-026:鸿蒙的方舟编译器有什么特点?
题型:概念题 难度:🔴 深入 岗位层级:专家 面试知识域:鸿蒙 标签:HarmonyOS、方舟编译器、ArkCompiler、性能 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙方舟编译器的主要特点和优势。
参考答案: 方舟编译器(ArkCompiler)特点:
统一编译
- 支持多种语言统一编译为方舟 IR。
- 包括 ArkTS、JS、C/C++ 等。
AOT 编译
- 支持 Ahead-of-Time 编译。
- 应用在安装或运行时提前编译为机器码,提升执行效率。
无解释执行
- 减少解释器开销。
- 提升启动速度和运行性能。
内存优化
- 更高效的垃圾回收机制。
- 减少 GC 停顿和内存占用。
类型系统
- 针对 ArkTS 的强类型做优化。
- 运行时类型检查更高效。
跨语言调用优化
- ArkTS 与 C/C++ 通过 NAPI 调用更高效。
安全增强
- 编译期做更多安全检查。
- 运行时减少安全漏洞。
对开发者的影响:
- ArkTS 应用编译后执行效率更高。
- 需要遵守更严格的类型规范。
- 部分动态 JS 特性不支持。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
方舟编译器统一编译多语言,支持 AOT 编译为机器码,减少解释执行,内存 GC 优化,强类型系统,跨语言调用高效,编译期安全检查。让 ArkTS 执行效率更高但类型约束更严。
FB-46-CP-R-030:设计一个鸿蒙多端协同的阅读应用架构。
题型:综合开放题 难度:🔵 架构 岗位层级:架构师 面试知识域:鸿蒙 标签:HarmonyOS、架构、多端协同、阅读应用 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请设计一个支持手机、平板、折叠屏协同的阅读应用架构。
参考答案: 鸿蒙多端协同阅读应用架构:
Ability 设计
ReaderUIAbility:主阅读界面。BookshelfUIAbility:书架管理。SearchUIAbility:搜索入口。SyncServiceExtensionAbility:后台同步服务。
数据层
- 本地数据库:书籍元信息、阅读进度、笔记。
- 分布式数据对象:跨设备同步阅读进度和书签。
- 云端服务:账号、书库、购买记录。
业务层
- 阅读器引擎:排版、翻页、字体、主题。
- 书架管理:分类、搜索、导入。
- 用户中心:登录、会员、云同步。
UI 层
- 响应式布局,根据断点切换单栏/双栏。
- 折叠屏:展开时左侧目录右侧内容。
- 平板:书架和阅读分屏。
跨设备协同
- 手机看书,平板上自动接续到当前页。
- 通过分布式数据库同步进度。
- 跨设备复制、分享书摘。
性能优化
- 大文件分片加载。
- 阅读内容虚拟渲染。
- 图片和字体按需加载。
安全
- 付费内容加密存储。
- 阅读权限校验。
扩展
- 服务卡片显示最近阅读。
- 通知栏快速续读。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
架构分 Ability、数据层、业务层、UI 层。Ability 有阅读、书架、搜索、同步服务。数据层用本地库加分布式对象加云端。UI 响应式适配折叠屏和平板。跨设备通过分布式数据库同步进度。
FB-46-EN-A-017:鸿蒙应用如何集成第三方库?
题型:工程化题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、第三方库、OHPM、集成 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙应用中如何引入和管理第三方库。
参考答案: 鸿蒙第三方库集成方式:
OHPM(OpenHarmony Package Manager)
- 鸿蒙官方包管理工具,类似 npm。
- 使用
ohpm install xxx安装。 - 依赖写入
oh-package.json5。
Har(HarmonyOS Archive)
- 鸿蒙静态共享包格式。
- 可引用本地或远程 Har 包。
Hsp(HarmonyOS Shared Package)
- 动态共享包,运行时共享。
- 适合多模块共享代码和资源。
本地模块
- 通过
file:./local-module方式引用本地代码。
- 通过
C/C++ 库
- 通过 CMake 集成第三方 C/C++ 库。
- 编译为 so 后通过 NAPI 调用。
npm 兼容
- 部分纯 JS npm 包可在鸿蒙中使用。
- 但涉及浏览器 API 或平台特性的包需适配。
管理建议:
- 优先使用 OHPM 官方仓库和经过验证的库。
- 定期更新依赖,关注安全漏洞。
- 对关键库做源码审查。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
鸿蒙用 OHPM 管理依赖,类似 npm,支持 Har 静态包、Hsp 动态共享包、本地模块、C/C++ 库。纯 JS npm 包部分可用,涉及平台特性的需适配。
FB-46-EN-A-018:鸿蒙应用的模块化开发方式有哪些?
题型:工程化题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、模块化、HAP、HAR、HSP 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙应用中的 HAP、HAR、HSP 及其使用场景。
参考答案: 鸿蒙应用模块化:
| 模块 | 说明 | 使用场景 |
|---|---|---|
| HAP | HarmonyOS Ability Package,应用安装包 | 主模块/特性模块,可独立安装 |
| HAR | HarmonyOS Archive,静态共享包 | 代码和资源静态引用,编译进宿主 |
| HSP | HarmonyOS Shared Package,动态共享包 | 多 HAP/HSP 间运行时共享,减少包体积 |
HAP:
- 一个应用可包含多个 HAP。
- entry HAP 是入口,feature HAP 可按需下载。
HAR:
- 类似 Android 的 aar 或 npm 包。
- 编译时合并到引用方。
- 适合通用组件库、工具库。
HSP:
- 运行时共享,多个模块共用一份代码。
- 适合大型应用多模块间共享。
- 需要动态路由支持。
选择建议:
- 独立功能模块:HAP。
- 通用组件/工具:HAR。
- 多模块共享大模块:HSP。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
HAP 是应用安装包,HAR 是静态共享包,HSP 是动态共享包。独立功能用 HAP,通用组件用 HAR,多模块共享大模块用 HSP。
FB-46-FS-P-025:鸿蒙 ArkUI 的声明式 UI 与传统命令式 UI 有什么区别?
题型:框架原理题 难度:🔴 深入 岗位层级:专家 面试知识域:鸿蒙 标签:ArkUI、声明式、命令式、UI 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请对比鸿蒙 ArkUI 的声明式 UI 与传统命令式 UI 开发方式的区别。
参考答案: 声明式 UI vs 命令式 UI:
| 维度 | 声明式 UI(ArkUI) | 命令式 UI(传统 Android/iOS) |
|---|---|---|
| 开发方式 | 描述 UI 应该是什么样 | 逐步命令修改 UI |
| 状态管理 | 状态驱动自动刷新 | 手动更新视图 |
| 代码结构 | UI 即代码,结构清晰 | 代码和布局分离 |
| 可维护性 | 高,数据流清晰 | 容易散落各处 |
| 性能 | 框架 diff 后最小化更新 | 完全由开发者控制 |
ArkUI 声明式示例:
@State count: number = 0
build() {
Column() {
Text(`${this.count}`)
Button('add').onClick(() => this.count++)
}
}命令式示例(伪代码):
textView.setText(String.valueOf(count));
button.setOnClickListener(v -> {
count++;
textView.setText(String.valueOf(count));
});声明式 UI 优势:
- 开发者只需关心状态,框架负责视图更新。
- 代码更简洁,易于理解和维护。
- 更适合响应式和多端适配。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
声明式 UI 描述 UI 应该是什么样,状态驱动自动刷新;命令式 UI 是逐步命令修改视图。ArkUI 是声明式,开发者只关心状态,框架负责更新,代码更简洁易维护。
FB-46-FS-P-026:鸿蒙的服务卡片(Widget)如何开发?
题型:框架原理题 难度:🔴 深入 岗位层级:专家 面试知识域:鸿蒙 标签:HarmonyOS、服务卡片、Widget、开发 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙服务卡片的基本概念和开发方式。
参考答案: 鸿蒙服务卡片:
概念:
- 服务卡片是鸿蒙应用在桌面/负一屏等位置展示的轻量级 UI。
- 无需打开应用即可查看关键信息或执行快捷操作。
- 属于 ExtensionAbility 的一种(FormExtensionAbility)。
开发方式:
创建卡片
- 在 DevEco Studio 中选择创建 Service Widget。
- 生成 FormExtensionAbility 和卡片页面。
配置卡片
- 在 module.json5 中声明卡片信息。
- 配置卡片名称、尺寸、预览图、更新周期等。
卡片页面
- 使用 ArkTS 编写卡片 UI。
- 受限于卡片能力,部分组件和 API 不可用。
数据更新
- 卡片通过 FormBindingData 绑定数据。
- 应用可通过
updateForm主动更新卡片。 - 支持定时刷新。
交互
- 卡片点击可跳转应用指定页面。
- 通过
router或action触发。
注意事项:
- 卡片资源占用受限,UI 要简洁。
- 卡片生命周期由系统管理。
- 频繁更新会耗电,需合理设置更新策略。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
服务卡片是鸿蒙轻量级桌面 Widget,属于 FormExtensionAbility。在 DevEco 中创建,配置 module.json5,用 ArkTS 写 UI,通过 FormBindingData 绑定和 updateForm 更新,点击可跳转应用。
FB-46-PE-A-016:鸿蒙应用启动慢如何排查?
题型:性能优化题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、启动优化、排查、性能 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙应用启动慢时,你会如何排查和优化。
参考答案: 鸿蒙应用启动慢排查:
使用 DevEco Profiler
- 查看启动阶段 CPU、内存、I/O 耗时。
- 定位启动瓶颈。
分析 Ability 生命周期
- 检查 onCreate、onWindowStageCreate 中是否有耗时操作。
- 延迟初始化非必要逻辑。
检查首屏渲染
- WXML/ArkTS 结构是否过于复杂。
- 首屏组件数量是否过多。
检查网络请求
- 启动时是否发起过多同步请求。
- 能否并行、缓存、延迟加载。
检查资源加载
- 大图片、字体、配置文件是否拖慢启动。
- 压缩和延迟加载资源。
检查包体积
- 主包是否过大,影响安装和加载速度。
- 使用 HAR/HSP 和延迟加载。
检查同步操作
- 启动时避免大量同步 Storage、文件 I/O、复杂计算。
优化方向
- 异步初始化、骨架屏、预加载、延迟加载、资源压缩、减少首屏组件。
验证
- 对比优化前后启动耗时。
- 用真机多场景测试。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
启动慢用 DevEco Profiler 看 CPU 内存 IO,检查 Ability 生命周期、首屏渲染、网络请求、资源加载、包体积、同步操作。优化方向是异步初始化、骨架屏、预加载、延迟加载、压缩资源、减少首屏组件。
FB-46-PE-A-017:鸿蒙 ArkUI 中如何实现列表性能优化?
题型:性能优化题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、ArkUI、列表、性能 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙 ArkUI 中长列表的性能优化方案。
参考答案: ArkUI 长列表优化:
使用 LazyForEach
- 懒加载,只渲染可视区及缓冲区数据。
- 配合
cachedCount设置缓存数量。
组件复用
- 列表项组件结构尽量一致,便于框架复用。
- 避免不同类型 item 混用导致复用率低。
减少 item 复杂度
- 简化每个 item 的 UI 结构。
- 减少嵌套层级和复杂计算。
图片优化
- item 中图片懒加载、压缩、合适尺寸。
- 避免大图片导致滑动卡顿。
避免滑动中 setState
- 滑动过程中不要频繁更新列表数据。
- 停止滚动后再更新。
key 稳定
- ForEach/LazyForEach 提供稳定唯一 key。
- 帮助框架高效 diff。
预加载数据
- 触底前提前请求下一页数据。
- 避免滑动到底时等待。
使用 List 而非 Scroll
- List 针对长列表做了优化,比 Scroll + Column 更高效。
示例:
List({ space: 10 }) {
LazyForEach(this.dataSource, (item: Item) => {
ListItem() {
ItemView({ item })
}
}, (item: Item) => item.id)
}
.cachedCount(5)评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
ArkUI 长列表用 LazyForEach 懒加载加 cachedCount,组件复用,减少 item 复杂度,图片优化,滑动中少更新,key 稳定,预加载数据,用 List 容器。
FB-46-PE-A-018:鸿蒙应用如何做内存优化?
题型:性能优化题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、内存优化、Leak、性能 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙应用开发中常见的内存问题及优化方法。
参考答案: 鸿蒙内存优化:
避免内存泄漏
- 及时清理定时器、事件监听、回调。
- 页面卸载时取消未完成的网络请求。
图片管理
- 大图片按需加载和释放。
- 使用合适尺寸,避免内存中放大。
对象池复用
- 频繁创建销毁的对象使用对象池。
数据分页
- 长列表不要一次性加载全部数据。
- 使用 LazyForEach 和数据分页。
减少全局状态
- 不要把所有数据都放 AppStorage 或全局变量。
- 页面级数据页面销毁时释放。
监听器管理
- sensor、location、网络状态等监听器用完后取消。
避免循环引用
- ArkTS 中注意回调和闭包可能导致的引用持有。
使用性能工具
- DevEco Studio Memory Profiler 分析内存占用。
- 定位内存泄漏和高内存模块。
大对象延迟加载
- 非首屏资源延迟加载或使用时加载。
定期 review
- 复杂模块定期做内存 review。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
鸿蒙内存优化要避免泄漏,清理定时器和监听,图片按需加载,对象池复用,数据分页,减少全局状态,避免循环引用,用 Memory Profiler 分析,延迟加载大对象。
FB-46-SE-A-001:鸿蒙应用的安全机制有哪些?
题型:安全题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、安全、权限、沙箱 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙应用的安全机制和前端开发中需要注意的安全事项。
参考答案: 鸿蒙应用安全机制:
应用沙箱
- 每个应用运行在独立沙箱中。
- 文件、数据、进程相互隔离。
权限管理
- 权限分为 normal、dangerous、system_grant、user_grant。
- 敏感权限需动态申请并说明用途。
签名机制
- 应用必须签名才能安装。
- 防止篡改和伪造。
数据加密
- 支持数据库加密、文件加密、KeyStore。
- 敏感数据建议加密存储。
网络安全
- 默认限制明文 HTTP 传输。
- 支持证书绑定、TLS。
组件访问控制
- Ability 可配置 exported、permissions。
- 防止未授权访问。
前端注意事项:
- 敏感逻辑和密钥放后端。
- 用户输入做校验和过滤。
- 网络请求使用 HTTPS。
- 合理申请权限,不过度收集信息。
- 本地存储注意加密和清理。
- 关注应用签名和代码完整性。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
鸿蒙安全有应用沙箱、权限管理、签名机制、数据加密、网络安全、组件访问控制。前端要注意敏感逻辑放后端,输入校验,HTTPS,合理权限,本地加密,关注签名完整性。
FB-46-SS-A-001:鸿蒙应用上架需要经过哪些流程?
题型:软技能题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、上架、审核、流程 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请说明鸿蒙应用上架到华为应用市场的主要流程和注意事项。
参考答案: 鸿蒙应用上架流程:
开发完成并自测
- 功能、性能、兼容性、安全自测。
- 使用真机和模拟器测试。
准备材料
- 应用图标、截图、简介、隐私政策。
- 软著、ICP 备案(国内需要)。
应用签名
- 使用发布证书和 profile 签名。
- 配置混淆和代码保护(可选)。
构建发布包
- 在 DevEco Studio 中构建 APP 包或 HAP 包。
提交审核
- 登录 AppGallery Connect。
- 填写应用信息,上传安装包。
审核等待
- 华为审核团队进行合规、安全、内容审核。
- 可能被打回修改。
发布上线
- 审核通过后选择发布时间。
- 可分阶段发布。
运营维护
- 监控崩溃、用户反馈、版本更新。
注意事项:
- 隐私政策必须完整、合规。
- 权限申请要与功能匹配。
- 应用内容符合法律法规。
- 上架前进行签名和 release 构建。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
鸿蒙上架流程:开发自测、准备材料、应用签名、构建发布包、提交 AppGallery Connect 审核、发布上线、运营维护。注意隐私政策、权限匹配、内容合规、release 签名。
FB-46-SS-A-002:鸿蒙生态目前的发展现状对前端开发者意味着什么?
题型:软技能题 难度:🟡 进阶 岗位层级:高级 面试知识域:鸿蒙 标签:HarmonyOS、生态、前端、发展 出现频率:高频 预计回答时长:5-8 分钟
题目描述: 请谈谈鸿蒙生态发展对前端开发者的机遇和挑战。
参考答案: 鸿蒙生态对前端开发者的意义:
机遇:
新平台红利
- 鸿蒙原生应用需求增长,人才缺口大。
- 早期进入者有更多机会。
技术栈延续
- ArkTS 基于 TypeScript,前端开发者学习成本相对较低。
- ArkUI 声明式语法与主流前端框架思路一致。
多端开发
- 一次开发可适配手机、平板、车机、IoT 等多设备。
- 拓展前端能力边界。
分布式能力
- 学习跨设备协同、软总线等新技术。
- 成为全场景开发人才。
挑战:
生态成熟度
- 第三方库、工具链、社区资源仍在完善。
- 部分功能需要适配或自研。
平台差异
- 多端适配、设备能力差异带来复杂度。
学习成本
- 需要学习 ArkTS、ArkUI、HarmonyOS 特有 API 和生命周期。
市场竞争
- 新平台需要与 iOS/Android 竞争用户和开发者。
建议:
- 前端开发者可关注鸿蒙方向,作为技能补充。
- 从 ArkTS/ArkUI 入手,逐步深入系统能力和分布式开发。
评分维度:
- 能准确理解问题并给出结构化回答(40%)
- 能结合实际案例或数据说明(30%)
- 能体现业务思维与技术落地的结合(30%)
常见错误:
- 回答过于空泛,缺乏具体做法。
- 只谈技术实现,忽略业务目标和约束。
- 没有考虑风险和可执行性。
口头回答版:
鸿蒙生态给前端带来新平台红利、技术栈延续、多端开发、分布式能力等机遇,也面临生态成熟度、平台差异、学习成本、市场竞争等挑战。建议前端从 ArkTS/ArkUI 入手,逐步深入。