HarmonyOS笔记

需要学习

  • 网络请求
  • 文件上传:鸿蒙数据上传三步走-掘金
    • 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';
  • 导入别的模块的内容
    • 要导出的模块的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

  • 从TypeScript到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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
::强制停止 bundleName 的进程
hdc shell aa force-stop hmos.com.xm597.app

::给手机端创建临时目录
hdc shell mkdir data/local/tmp/5588cff7d2344a0db70a270bb22aa455

::把所有的hsp 发送到临时目录
hdc file send hsp 临时目录
::把hap 发送到临时目录
hdc file send hap 临时目录
::安装临时目录中的所有hsp和hap
hdc shell bm install -p 临时目录
::删除手机端的临时目录
hdc shell rm -rf 临时目录
::启动bundleName的EntryAbility的页面
hdc shell aa start -a EntryAbility -b hmos.com.xm597.app
  • 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
    @Component

    struct AppBar{
    private title: string=''
    @Builder
    leadingBuilder(){}
    @BuilderParam
    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)
    }
    }

    //使用的地方【别的页面或自定义组件中】
    @Builder
    leading(){
    SymbolGlypn($r('sys.symbol.access_card'))
    .fontSize(24)
    .fontColor([Color.White])
    .fontWeight(FontWeight.Bold)
    }
    build(){
    Stack(){
    Column(){
    AppBar({title: "计数器", leading: this.leading})
    }
    }
    }

新建HelloWorld项目

新建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
2
3
4
5
6
7
8
"app": {
"bundleName": "com.example.helloworld",
"vendor": "example",
"versionCode": 1000000,
"versionName": "1.0.0",
"icon": "$media:app_icon",
"label": "$string:app_name"
}
  • 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
2
3
4
5
{
"src": [
"pages/index"
]
}

语法

1
2
3
interface DateConstructor {  
new (value: number | string | Date): Date;
}

是Typescript接口,描述了一个构造函数的类型。具体来说DateConstructor接口具有一个构造签名,表示它可用来创建Date对象。以下是详细解释:

  • interface DataConstructor:定义一个接口,接口可用于描述一个对象的结构或行为。
  • new (value: number| string | Date): Date:表示构造函数的签名。new关键字表示这是一个构造函数。构造函数可接受一个参数,此参数类型可以是numberstringDate。构造函授在调用时会返回一个类型为Date的对象。
    参数说明:**value: number | string | Date**: 表示构造函数可以接受三种类型的参数:
  • number: 例如,使用时间戳(自1970年1月1日以来的毫秒数)来创建一个 Date 对象。
  • string: 例如,使用日期字符串(如 "2023-10-01")来创建一个 Date 对象。
  • Date: 允许传入另一个 Date 对象,从而创建一个新的 Date 对象。

    常用组件汇总

    常用组件汇总

单位

fp vp px
距离使用vpvirtual pixel虚拟像素单位)
字体大小fpfont pixel字体像素单位)
pxpixel屏幕实际像素)

  1. fp 的大小默认情况下与 vp 相同,1fp=1vp。如果用户在设置中选择了更大字体,则字体实际显示大小就会在vp的基础上乘以scale系数,即 ==1fp=1vp*scale==
  2. px1px在不同分辨率的手机上的大小不同,适配性差。所以不论Android还是HarmonyOS 写距离大小还是字体大小都不要用px

    资源引用

  • 在json中引用资源。如module.json5
    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
    }
    ]
    }
    }
    其中layered_image内容是:
    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
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
{  
"module": {
。。。,
"requestPermissions": [
{
"name": "ohos.permission.APPROXIMATELY_LOCATION",
"reason": "$string:approximately_location_desc",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
},
{
"name": "ohos.permission.LOCATION",
"reason": "$string:location_desc",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
}
]
}

上面的代码。

  1. 如果entry、多个har中都有同一个权限,那么显示的是entry中找到的reason内容
  2. 如果只有多个har中有同一个权限,那么显示的是第一个har中找到的reason内容(即har的依赖顺序是第一个)
    1. harA的子依赖中有这个权限,harA本身没有这个权限,harA的顺序即使在harB的前面,显示的是harB的reason内容

开发

申请模拟器https://developer.huawei.com/consumer/cn/activity/201714466699051861/signup

安装应用程序包和上传文件

  1. 将本地HAP包拖到屏幕上即可进行安装
  2. 通过命令行hdc app install安装

上传文件

  1. 本地文件上传到模拟器中,拖到文件到模拟器屏幕上。会放到虚拟设备的/storage/media/100/local/files/Docs/Download/目录下
  2. 使用命令行hdc file send也可以

鸿蒙学习链接

TypeScript快速入门

相关资料

  • 《鸿蒙 (OpenHarmony)开发入门教学视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙进阶实战》

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中,undefinednull 是两种不同的类型,也是两个不同的值。undefined 表示变量已经声明,但尚未赋值,或者对象的属性不存在。而 null 表示变量没有任何值,或者说它的值就是“无”。
  • 在非严格比较(==)下,undefinednull 是相等的,因为非严格比较会进行类型转换
  • 但在严格比较(===)下,undefinednull 是不相等的,因为严格比较不会进行类型转换
    相同点:
    它们都代表了值的空缺。
    在 TypeScript 的默认设置下,它们可以赋值给任何类型,例如 number、string 等。
    不同点:
    null 通常用来表示一个对象不存在,而 undefined 通常用来表示一个变量没有被赋值,或者一个对象的属性不存在。

    ArkTs中的Object、object

  • objectobject类型则用于表示除基本类型外的类型。也就是除 numberstringbooleansymbolnullundefined 之外的类型。
  • ObjectObject类型是所有引用类型的基类型。任何值包括除了nullundefined外的基本类型的值(它们会被自动装箱),都可以直接被赋给Object类型的变量。(可以理解成除了nullundefined以外的所有值)

    对象字面量

    对象字面量是一个表达式,可用于创建类实例并提供一些初始值。它在某些情况下更方便,可以用来代替new表达式。
    1
    2
    3
    4
    5
    class 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)。常见的命令式编程语言包括 CJavaPython 等。
  • 声明式编程是一种编程范式,强调程序的目标和结果。在这种范式中,程序员只需要声明程序的目标,而不需要关心具体的执行过程。声明式编程关注的是“做什么”(what to do),而不是“怎么做”(how to do it)。常见的声明式编程语言包括 SQLHTMLReact等。
    Android命令式编程,一般习惯使用各种setupdate方法直接更新各种控件的数据和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一般通过StateValueNotifier等方式进行组件更新。

    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、包大小