需要学习
- 网络请求
- 文件上传:鸿蒙数据上传三步走-掘金
- fs:@ohos.file.fs(文件管理)
- fd:(file descriptro文件描述器)
- 页面跳转
- router【页面跳转每次都指定模式,不写默认是多例模式】、【UIAbility默认是singleton】
- navigation【HarmonyOS NEXT的方法】
- 597navigation 的生命周期
- navigator【HarmonyOS3.0的方法】
- 导入第三方库(以第三方库
@ohos/lottie为例)- 方法一:在Terminal窗口。
ohpm install @ohos/lottie - 方法二:在工程
oh-package.json5中添加如下代码,在执行ohpm install命令1
2
3"dependencies":{
"@ohos/lottie": "^2.0.0"
} - 完成上述后,在页面中使用:
import lottie,{AnimationItem} from '@ohos/lottie';
- 方法一:在Terminal窗口。
- 导入别的模块的内容
- 要导出的模块的
index.ets中如:export * from './src/main/ets/components/utils/EmitterUtils' - 在页面中使用
- 要导出的模块的
- Text的fontWeight(700),其中700是啥【是Bold】
- FlexAlign.SpaceBetween是啥
- ArkWeb
- 架构
分层架构设计、模块化设计、应用导航设计 - 资源放到公共模块AppScope的写法
- 代码混淆
- pushPathByName 给NavPathStack栈加入内容
看懂鸿蒙系统
鸿蒙系统是啥?
- 分布式操作系统
- 基于微内核
- 面向全场景
- 华为自主研发
支持哪些设备?
- 大电视
- 手机
- PC
- 智能手表
- 车机
- 智能音箱
有哪些亮点?
- 全场景流畅体验
- 架构级可信安全
- 跨终端无缝协同
- 兼容安卓应用
笔记
OpenHarmony sdk 与 harmonyOS sdk
前者是开源的,后者是华为自己基于前者做的闭源。即公司有合作的harmonyOS sdk就用后者,否则用前者来开发ArkTS是在TypeScript(简称TS)基础上的扩展
Ability内页面间跳转(ArkTS)
源码: https://developer.huawei.com/consumer/cn/codelabsPortal/serviceTypes/harmonyos-cn开源项目》OpenHarmony》OpenHarmony教程指南
https://gitee.com/openharmony/codelabs-
- ArkTS禁止使用any类型。ArkTS强制使用静态类型
- ArkTS不允许有多个静态块
-
- 基本概念
- 密钥:【本地生成】格式为
.p12,包含非对称加密中使用的公钥和私钥,存储在密钥库文件中,公钥和私钥对用于数字签名和验证。
- 证书请求文件:【本地生成】格式为
.csr,全称为Certificate Signing Request,包含密钥对中的公钥和公共名称、组织名称、组织单位等信息,用于向AppGallery Connect申请数字证书。 - 数字证书:格式为
.cer,由华为AppGallery Connect颁发。 - Profile文件:【网站申请】格式为
.p7b,包含HarmonyOS应用/服务的包名、数字证书信息、描述应用/服务允许申请的证书权限列表,以及允许应用/服务调试的设备列表(如果应用/服务类型为Release类型,则设备列表为空)等内容,每个应用/服务包中均必须包含一个Profile文件
- 密钥:【本地生成】格式为
- 基本概念
-
1
openssl x509 -in xxx.cer -pubkey -noout
打包
- 打包上线前为了稳妥改成release,再打
.app包(build APP(s))- 打完包上传鸿蒙后台:AppGallery Connect》版本信息》版本选取,“上传”【选择“测试和正式上架”】
- 生成邀请测试链接:版本列表,右上角“创建测试版本”,“邀请测试”,【最底下的“测试用户”勾选,“生成分享链接”要勾选】
- release模式不能运行在真机上,可以运行在模拟器上,debug模式两者都可以
- 脚本安装hap给测试(QA)【打包上架的是
.app】
在Windows上可以用git的bash来执行,就能看到错误信息,否则窗口一闪而过bash install.sh^07e44e
DevEco Studio 安装hap的过程
1 | ::强制停止 bundleName 的进程 |
BuilderParam:通过它来声明是组件构建者参数,需要配合@Builder使用
例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
struct AppBar{
private title: string=''
leadingBuilder(){}
leading: ()=> void = this.leadingBuilder
build(){
Row(){
this.leading()
Text(this.title).fontSize(20).fontWeight(FontWeight.Bold)
.fontColor($r('sys.color.white'))
}
.backgroundColor('#317bd4')
.width('100%')
.height(56)
.padding({left: 20, right: 20})
.justifyContent(FlexAlign.SpaceBetween)
}
}
//使用的地方【别的页面或自定义组件中】
leading(){
SymbolGlypn($r('sys.symbol.access_card'))
.fontSize(24)
.fontColor([Color.White])
.fontWeight(FontWeight.Bold)
}
build(){
Stack(){
Column(){
AppBar({title: "计数器", leading: this.leading})
}
}
}
新建HelloWorld项目
新建步骤
Create Project>选择‘Application’>选择‘Empty Ability’》单击’Next’,进入配置页。配置页详细信息如下:
- Project name是开发者可以自行设置的项目名称,这里根据自己选择修改为自己项目名称。
- Bundle name是包名称,默认情况下应用ID也会使用该名称,应用发布时对应的ID需要保持一致。
Save location为工程保存路径,建议用户自行设置相应位置。
Compile SDK是编译的API版本,这里默认选择API9。
Model选择Stage模型,其他保持默认即可。
代码结构
切换到Project的代码结构【3.1.0】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47.
├── AppScope
│ └── resouces
│ └── base
│ └── element 主要存放公共的字符串、布局文件等资源
│ string.json
│ └── media 存放全局公共的多媒体资源文件
│ └── app.json5 配置文件
├── entry 默认的初始模块【应用的主模块】
│ └── src
│ └── main
│ └── ets 用于存放编写的代码文件【我们开发主要集中在ets文件夹中】
│ └── entryability 存放ability文件,用于当前ability应用逻辑和生命周期管理
│ └── pages 存放页面。Index.ets是初始页面
│ └── resouces 模块内的公共资源
│ └── base
│ └── element 主要存放模块的字符串、布局文件等资源
│ color.json
│ string.json
│ └── media 存放模块的多媒体资源文件
│ └── profile
│ main_pages.json
│ └── en_US 主要存放模块的英文字符串、布局文件等资源
│ └── element
│ └── rawfile
│ └── zh_CN
│ └── element 主要存放模块的中文字符串、布局文件等资源
│ └── module.json5 配置文件
│ └── ohosTest 单元测试
│ └── ets
│ └── test
│ └── testability
│ └── pages
│ └── testrunner
│ └── resouces
│ └── base
│ └── element
│ └── media
│ └── profile
│ └── build-profile.json5 模块级配置信息,包括编译构建配置项
│ └── hvigorfile.ts 模块级构建脚本
│ └── oh-package.json5 模块级依赖配置信息文件
├── hvigor
├── oh_modules 工程的依赖包,存放工程依赖的源文件
├── build-profile.json5 工程级配置信息,包括签名、产品配置等
├── hvigorfile.ts 工程级编译构建任务脚本,hvigor是基于任务管理机制实现的一款全新的自动化构建工具,主要提供任务注册编排,工程模型管理、配置管理等核心能力。
└── oh-package.json5 工程级依赖配置文件,用于记录引入包的配置信息
- DevEco Studio的预览
- Before using the Previewer for phone, tablet, TV, and wearable apps, make sure the OpenGL version on your computer is 3.2 or later.
- The
<richtext>,<web>,<video>,<XComponent>components do not support previews.
配置文件解析
app.json5
1 | "app": { |
- bundleName是包名。
- vendor是应用程序供应商。
- versionCode是用于区分应用版本。
- versionName是版本号。
- icon对应于应用的显示图标。
- label是应用名。
module.json5
entry>src>main>module.json5是模块的配置文件,包含当前模块的配置信息。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34"module": {
"name": "entry",
"type": "entry",
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"deviceTypes": [
"phone"
],
"deliveryWithInstall": true,
"installationFree": false,
"pages": "$profile:main_pages",
"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",
"exported": true,
"skills": [
{
"entities": [
"entity.system.home",
],
"actions": [
"action.system.home"
]
}
]
}
]
}
其中module对应的是模块的配置信息,一个模块对应一个打包后的hap包,hap包全称是HarmonyOS Ability Package,其中包含了ability、第三方库、资源和配置文件。其具体属性及其描述可以参照下表1。
| 属性 | 描述 |
|---|---|
| name | 该标签标识当前module的名字,module打包成hap后,表示hap的名称,标签值采用字符串表示(最大长度31个字节),该名称在整个应用要唯一。 |
| type | 表示模块的类型,类型有三种,分别是entry、feature和har。 |
| srcEntry | 当前模块的入口文件路径。 |
| description | 当前模块的描述信息。 |
| mainElement | 该标签标识hap的入口ability名称或者extension名称。只有配置为mainElement的ability或者extension才允许在服务中心露出。 |
| deviceTypes | 该标签标识hap可以运行在哪类设备上,标签值采用字符串数组的表示。 |
| deliveryWithInstall | 标识当前Module是否在用户主动安装的时候安装,表示该Module对应的HAP是否跟随应用一起安装。- true:主动安装时安装。- false:主动安装时不安装。 |
| installationFree | 标识当前Module是否支持免安装特性。- true:表示支持免安装特性,且符合免安装约束。- false:表示不支持免安装特性。 |
| pages | 对应的是main_pages.json文件,用于配置ability中用到的page信息。 |
| abilities | 是一个数组,存放当前模块中所有的ability元能力的配置信息,其中可以有多个ability。 |
对于abilities中每一个ability的属性项,其描述信息如下表2。
| 属性 | 描述 |
|---|---|
| name | 该标签标识当前ability的逻辑名,该名称在整个应用要唯一,标签值采用字符串表示(最大长度127个字节)。 |
| srcEntry | ability的入口代码路径。 |
| description | ability的描述信息。 |
| icon | ability的图标。该标签标识ability图标,标签值为资源文件的索引。该标签可缺省,缺省值为空。如果ability被配置为MainElement,该标签必须配置。 |
| label | ability的标签名。 |
| startWindowIcon | 启动页面的图标。 |
| startWindowBackground | 启动页面的背景色。 |
| visible | ability是否可以被其他应用程序调用,true表示可以被其它应用调用, false表示不可以被其它应用调用。 |
| skills | 标识能够接收的意图的action值的集合,取值通常为系统预定义的action值,也允许自定义。 |
| entities | 标识能够接收Want的Entity值的集合。 |
| actions | 标识能够接收的Want的Action值的集合,取值通常为系统预定义的action值,也允许自定义。 |
main_pages.json(模块的)
src/main/resources/base/profile/main_pages.json文件保存的是页面page的路径配置信息,所有需要进行路由跳转的page页面都要在这里进行配置。
1 | { |
语法
1 | interface DateConstructor { |
是Typescript接口,描述了一个构造函数的类型。具体来说DateConstructor接口具有一个构造签名,表示它可用来创建Date对象。以下是详细解释:
interface DataConstructor:定义一个接口,接口可用于描述一个对象的结构或行为。new (value: number| string | Date): Date:表示构造函数的签名。new关键字表示这是一个构造函数。构造函数可接受一个参数,此参数类型可以是number、string、Date。构造函授在调用时会返回一个类型为Date的对象。
参数说明:**value: number | string | Date**: 表示构造函数可以接受三种类型的参数:number: 例如,使用时间戳(自1970年1月1日以来的毫秒数)来创建一个Date对象。
单位
fp vp px
距离使用vp(virtual pixel虚拟像素单位)
字体大小fp(font pixel字体像素单位)px(pixel屏幕实际像素)
fp的大小默认情况下与vp相同,1fp=1vp。如果用户在设置中选择了更大字体,则字体实际显示大小就会在vp的基础上乘以scale系数,即 ==1fp=1vp*scale==px,1px在不同分辨率的手机上的大小不同,适配性差。所以不论Android还是HarmonyOS 写距离大小还是字体大小都不要用px资源引用
- 在json中引用资源。如
module.json5其中layered_image内容是:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
"module": {
...
"abilities": [
{
...
"description": "$string:EntryAbility_desc",
"icon": "$media:layered_image",
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background",
"exported": true
}
]
}
}1
2
3
4
5
6
7{
"layered-image":
{
"background" : "$media:background",
"foreground" : "$media:foreground"
}
} - 在ets中引用资源
1
2$r('app.media.background')
$r('app.string.EntryAbility_desc')
同名字符串引用顺序,同一个权限的reason显示内容
module.json5中,权限的reason
1 | { |
上面的代码。
- 如果entry、多个har中都有同一个权限,那么显示的是entry中找到的reason内容
- 如果只有多个har中有同一个权限,那么显示的是第一个har中找到的reason内容(即har的依赖顺序是第一个)
- harA的子依赖中有这个权限,harA本身没有这个权限,harA的顺序即使在harB的前面,显示的是harB的reason内容
开发
申请模拟器:https://developer.huawei.com/consumer/cn/activity/201714466699051861/signup
安装应用程序包和上传文件
- 将本地HAP包拖到屏幕上即可进行安装
- 通过命令行
hdc app install安装
上传文件
- 本地文件上传到模拟器中,拖到文件到模拟器屏幕上。会放到虚拟设备的
/storage/media/100/local/files/Docs/Download/目录下 - 使用命令行
hdc file send也可以
鸿蒙学习链接
- HarmonyOS第一课|应用开发视频教程学习|HarmonyOS应用开发官网
- OpenHarmony应用开发之UI界面_哔哩哔哩_bilibili
- OpenHarmony三方库的使用和发布_哔哩哔哩_bilibili
- OpenHarmony应用开发视频播器_哔哩哔哩_bilibili
- [OpenHarmony 知识体系](https://growing.openharmony.cn/mainPlay/knowledgeGraph
- 脚手架-生成鸿蒙代码
- 在2GB DAYU200上本地部署大语言模型-鸿蒙开发者社区-51CTO.COM
- OpenHarmony之NAPI框架介绍
- OpenHarmony应用编译 - 如何在源码中编译复杂应用(3.2-Release)-鸿蒙开发者社区-51CTO.COM
- 第五章-保存应用数据 _页面布局介绍_哔哩哔哩_bilibili
ts学习链接
- TypeScript的官方教程 https://www.typescriptlang.org/docs/
- JS基础Day1-04-JavaScript注释和结束符_哔哩哔哩_bilibili
- ArkTS语法-基础用法入门_哔哩哔哩_bilibili
工具
- 在线(编程)Playground平台 https://www.typescriptlang.org/play
第三方库
- harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。
- harmony-dialog 一款极为简单易用的零侵入弹窗,仅需一行代码即可轻松实现,无论在何处都能够轻松弹出。
- SpinKit 是一个适用于OpenHarmony/HarmonyOS的加载动画库。
- SkRouter
- 鸿蒙自带的图标
TypeScript快速入门
相关资料
- 《鸿蒙 (OpenHarmony)开发入门教学视频》
- 《鸿蒙生态应用开发V2.0白皮书》
- 《鸿蒙 (OpenHarmony)开发基础到实战手册》
- 《鸿蒙开发基础》
- 《鸿蒙开发进阶》
- 《鸿蒙进阶实战》
OpenHarmony
OpenHarmony技术架构

内核层
- 内核子系统:采用多内核(Linux内核或LiteOS)设计,支持针对不同资源受限设备选用适合的OS内核。内核抽象层(KAL,Kernel Abstract Layer)通过屏蔽多内核差异,对上层提供基础的内核能力,包括进程/线程管理、内存管理、文件系统、网络管理和外设管理等。
- 驱动子系统:驱动框架(HDF)是系统硬件生态开放的基础,提供统一外设访问能力和驱动开发、管理框架。
系统服务层
系统服务层是OpenHarmony的核心能力集合,通过框架层对应用程序提供服务。该层包含以下几个部分:
- 系统基本能力子系统集:为分布式应用在多设备上的运行、调度、迁移等操作提供了基础能力,由分布式总线、分布式数据管理、分布式任务调度、公共基础库、多模输入、图形、安全、AI等子系统组成。
- 基础软件服务子系统集:提供公共的、通用的软件服务,由事件通知、电话、多媒体、DFX(Design For X)等子系统组成。
- 增强软件服务子系统集:提供针对不同设备的、差异化的能力增强型软件服务,由智慧屏专有业务、穿戴专有业务、IoT专有业务等子系统组成。
- 硬件服务子系统集:提供硬件服务,由位置服务、用户IAM、穿戴专有硬件服务、IoT专有硬件服务等子系统组成。
根据不同设备形态的部署环境,基础软件服务子系统集、增强软件服务子系统集、硬件服务子系统集内部可以按子系统粒度裁剪,每个子系统内部又可以按功能粒度裁剪。
框架层
框架层为应用开发提供了C/C++/JS等多语言的用户程序框架和Ability框架,适用于JS语言的ArkUI框架,以及各种软硬件服务对外开放的多语言框架API。根据系统的组件化裁剪程度,设备支持的API也会有所不同。
应用层
应用层包括系统应用和第三方非系统应用。应用由一个或多个FA(Feature Ability)或PA(Particle Ability)组成。其中,FA有UI界面,提供与用户交互的能力;而PA无UI界面,提供后台运行任务的能力以及统一的数据访问抽象。基于FA/PA开发的应用,能够实现特定的业务功能,支持跨设备调度与分发,为用户提供一致、高效的应用体验。
- HarmonyOS 应用/服务开发、测试完成后,需要将应用/服务发布至应用市场,以便应用市场对应用/服务进行分发,普通消费者可以通过应用市场或服务中心获取到对应的HarmonyOS 应用/服务。需要注意的是,发布到华为应用市场或服务中心的HarmonyOS 应用/服务,必须使用应用市场颁发的发布证书进行签名。
- @MockSetup修饰的方法仅在预览场景会自动触发,并先于组件的aboutToAppear执行。
Android和HarmonyOS对比
ArkTs和TS区别
ArkTS是在TypeScript做的扩展,跟标准的Ts的区别主要是放弃了脚本语言动态化的特性,跟Dart有些类似。
- 强制使用静态类型
- 禁止在运行时改变对象布局
- 限制运算符语义
- 不支持Structural typing(结构化类型)
关于结构类型和名义类型
名义类型系统:数据类型的兼容性或等价性是通过明确的声明和/或类型的名称来确定的。这意味着即使两个类型的结构完全相同,如果它们的名称不同或者没有明确声明它们是相互兼容的,那么它们就被认为是不兼容的。比如Java。
结构类型系统:如果一个类型 Y 具有与类型 X 相同的所有属性,那么类型 Y 被认为是可以赋值给类型 X 的。换句话说,类型的兼容性是通过类型的结构和成员来检查的,而不是通过它们的名字。比如TypeScript。ArkTs中的null和undefined
定义 - 在 TypeScript中,
undefined和null是两种不同的类型,也是两个不同的值。undefined 表示变量已经声明,但尚未赋值,或者对象的属性不存在。而 null 表示变量没有任何值,或者说它的值就是“无”。 - 在非严格比较(
==)下,undefined和null是相等的,因为非严格比较会进行类型转换 - 但在严格比较(
===)下,undefined和null是不相等的,因为严格比较不会进行类型转换
相同点:
它们都代表了值的空缺。
在 TypeScript 的默认设置下,它们可以赋值给任何类型,例如 number、string 等。
不同点:
null 通常用来表示一个对象不存在,而 undefined 通常用来表示一个变量没有被赋值,或者一个对象的属性不存在。ArkTs中的Object、object
object:object类型则用于表示除基本类型外的类型。也就是除number、string、boolean、symbol、null或undefined之外的类型。Object:Object类型是所有引用类型的基类型。任何值包括除了null和undefined外的基本类型的值(它们会被自动装箱),都可以直接被赋给Object类型的变量。(可以理解成除了null和undefined以外的所有值)对象字面量
对象字面量是一个表达式,可用于创建类实例并提供一些初始值。它在某些情况下更方便,可以用来代替new表达式。1
2
3
4
5class C {
n: number = 0;
s: string = '';
}
let c: C = {n: 42, s: 'foo'};关于异步
- Java主要通过线程和线程池实现异步
- Kotlin一般是使用协程,避免了线程创建,更轻量
- ArkTs主要是Promise和
async/await,跟Dart类似。创建线程主要是通过TaskPool和Worker。关于仓颉
作为华为自研编程语言,现阶段只有小部分公司在尝试,华为也在推广。但是如果没办法带来比较明显的开发效率提升或者app性能提升,编程语言切换的意义就不大了。命令式和声明式
- 命令式编程是一种编程范式,强调程序的执行过程。在这种范式中,程序员需要明确地告诉计算机每一步应该做什么,如何做。命令式编程关注的是“怎么做”(how to do it),而不是“做什么”(what to do)。常见的命令式编程语言包括
C、Java、Python等。 - 声明式编程是一种编程范式,强调程序的目标和结果。在这种范式中,程序员只需要声明程序的目标,而不需要关心具体的执行过程。声明式编程关注的是“做什么”(what to do),而不是“怎么做”(how to do it)。常见的声明式编程语言包括
SQL、HTML、React等。
Android命令式编程,一般习惯使用各种set、update方法直接更新各种控件的数据和UI属性。个人感觉使用比较简单,想更新某个控件直接set值去控制。
HarmonyOS声明式编程,无法直接改动某个控件的样式和数据,只能改变对应的数据状态,而数据状态和UI展示存在映射关系。开发过程中需要考虑要不要拆分不同的数据状态对应不同组件,还有涉及父子组件、兄弟组件、跨层级组件的状态变化,具体场景用什么样的状态修饰更合理。组件使用方面
- ArkUI组件不是class,无法使用base类、抽象类等方式,只能通过组件嵌套,迭代多了就可能多嵌套一层层base能力的组件。
- ArkUI中List组件复用使用比较繁琐
- 部分组件高度默认是屏幕高度,无法像安卓一样高度自适应,需要获取子组件高度然后控制高度。
权限管理
跟安卓区别比较大,让用户从管理“权限”到管理“数据”。以图片为例,应用将无法再获取整个图库的访问权限,用户选择哪张照片,应用就得到哪张照片。 - 提供各类系统Pick,开发者不需要再单独封装。如联系人、拍照、文件管理、图库等。
- 提供各类安全控件,用在界面内集成对应控件,用户点击后,应用将获得临时授权,从而执行相关操作。
AI相关能力
这是安卓不具备的,前期推广阶段基本都是免费的,后期估计会收费。 - Core Speech Kit(基础语音服务):文本转语音、语音识别
- Core Vision Kit(基础视觉服务):通用文字识别(识别各类图片文字)、人脸检测、人脸比对以及主体分割等能力。
- Speech Kit(场景化语音服务):朗读控件(TextReader)和AI字幕控件(AICaption)能力
- Vision Kit(场景化视觉服务):人脸活体检测能力、卡证识别能力、文档扫描能力和AI识图能力
负一屏
负一屏主要展示各种卡片,算是站外流量分发的主要入口。 - 小米、oppo、荣耀等其他安卓厂商叫快应用,一般通过js开发。
- 华为升级鸿蒙Next系统后改为元服务,负一屏主要展示元服务卡片,点击一般是打开元服务,也是通过ArkTs开发。主要好处是免安装,有大小限制。
AI智能体
- 小米、oppo、vivo、荣耀等都有自己的智能体,但是有的不对外开放,有的支持力度有限。
- 鸿蒙提供了小艺智能体,主要分发入口包括推荐卡片、小艺建议、小艺搜索等,开发者可以接入后在合适的时机弹出各类卡片。
性能和体验
- 华为对于app性能和稳定性要求比较高,会针对冷启动、完成时延、卡顿丢帧等指标出性能报告,推动App开发者做优化。并且针对折叠屏适配会有一定的要求。
- 其他安卓厂商对于性能和折叠屏关注度不高,主要靠各app开发者自己关注。
鸿蒙和Flutter
由于多了鸿蒙端导致开发成本的提高,推动了跨端的落地。部分页面在需求迭代过程由native改为Flutter开发,方面后续在鸿蒙端的接入。
关于开发体验
- Flutter和鸿蒙相比,主要问题是嵌套层级太多,设置个圆角、背景色、padding等属性都需要嵌套,感觉比较繁琐。
- 鸿蒙和Flutter都作为声明式范式,鸿蒙的状态管理通过各类注解,父子组件,兄弟组件等方式分的还是比较细的。Flutter一般通过
State、ValueNotifier等方式进行组件更新。Flutter适配及体验
- Flutter开发的页面完成时延或帧率等性能跟原生比还是有一定差距,主要还是用于二三级页面或者B端App开发。
- Flutter在鸿蒙端的适配主要是兼容各类
channel实现跟Native的通信。当然部分页面或组件在鸿蒙端展示异常就需要单独适配。知识体系(待完善)
ArkTS应用
1、应用程序包结构(hap、har、hsp)
2、整体架构
3、开发模型
ArkTs
1、基本语法
2、方舟字节码
3、容器类库
4、并发
ArkUI
1、基本语法
2、声明式UI描述
3、自定义组件
4、装饰器
5、状态管理
6、渲染控制
Stage模型
1、应用配置文件
2、应用组件
3、后台任务
4、进程模块
5、线程模型
性能优化
1、冷启动
2、响应时延
3、完成时延
4、滑动帧率
5、包大小
