需要学习
- 网络请求
- 文件上传:鸿蒙数据上传三步走-掘金
- 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、包大小