• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1## 简介
2升级包安装组件运行在updater分区,其功能主要包括读取misc分区信息获取升级包状态,对升级包进行校验,确保升级包合法有效;然后从升级包中解析出升级的可执行程序,创建子进程并启动升级程序。具体升级的动作由升级脚本控制。本文将介绍如何针对OpenHarmony L2场景适配updater模式。
3
4## 前置条件
5- 参考OpenHarmony官方指导,完成正常系统编译和内核启动,能进入正常模式,且运行正常。
6- 芯片需配置包含updater分区和misc分区的分区表。updater分区大小不小于32M。
7
8## 镜像编译
9镜像编译流程:
10
11![](figures/updater适配_编译流程.png)
12
13### 使能updater子系统构建
14修改编译配置文件,使能updater.img编译选项
15以RK3568为例,在build/subsystem_config.json文件添加配置如下配置。当前默认参与构建。
16
17```
18      "updater": {
19        "path": "base/update",
20        "name": "updater"
21      },
22```
23
242.产品配置中添加updater组件编译
25以RK3568为例,在productdefine/common/products/ohos-arm64.json中添加
26
27```
28       "updater:update_service":{},
29```
30
31### 组件构建
32OpenHarmony使用BUILD.gn和ninja等工具构建编译框架。编译的二进制文件和动态库需要修改BUILG.gn文件将其复制到updater目录。在对应的BUILD.gn文件中添加如下配置:
33
34```
35      install_images = [
36        "system",
37        "updater",
38      ]
39```
40
41静态库会编译进二进制文件和动态库。
42编译系统根据install_image选项将组件复制到out/rk3568/packages/phone/updater目录。
43
44### 镜像编译
45使能镜像编译选项,编译脚本会将out/rk3568/packages/phone/updater文件夹打包成成updater.img镜像。先使用gzip工具压缩,然后使用cpio工具制作镜像。镜像格式为ASCII cpio archive (SVR4 with no CRC)。updater.img没有内核,以根文件系统挂载。out/rk3568/packages/phone/updater目录结构与根文件系统结构一致。如果内核不支持gzip解压,需要修改脚本,否则会导致镜像启动失败。以RK3568为例,updater.img大小限制为32M,过多添加文件到updater.img会导致镜像超过32M编译失败,可以根据需求修改镜像最大值。
46
47## 镜像启动
48完整的启动流程如下:
49
50![](figures/updater适配_启动流程.png)
51### 配置MISC分区
52OpenHarmony使用MISC分区保存启动时的指令,默认的MISC分区的结构体为:
53
54```
55    struct UpdateMessage {
56        char command[32];
57        char status[32];
58        char update[768];
59        char stage[32];
60        char keyinfo[32];
61        char reserved[224];
62    };
63```
64command为当前的命令,update存放升级包路径,reserved存放保留信息。
65### 配置uboot和内核
66uboot需要读取MISC分区的指令,如果command为updater,uboot能启动到updater模式。内核需要根据uboot的指令加载updater.img67updater模式启动与正常模式启动流程一致。当正常模式调通后,参考正常模式完成updater模式的调试。
68updater.img镜像是ramdisk格式且没有内核,需要uboot先拉起内核,然后加载updater.img到内存,作为根文件系统挂载到内核。如果芯片不支持ramdisk格式,需要进一步适配。
69
70### init服务启动
71init进程启动之后,读取init.cfg配置文件,依次启动各关键进程。
72启动配置文件由以下配置文件组成:
73- 与产品相关的配置文件
74以RK3568为例,updater模式的init.cfg文件位于产品目录device/board/hihope/rk3568/updater下。init.cfg是启动的入口,通过import方式导入其他配置文件。init.rk3568.usb.cfg主要是USB和HDC相关的配置,与产品特性有关。
75- updater_common.cfg
76updater模式通用的启动,代码目录。updater_common.cfg包含了多个基础服务,这些服务与产品解耦,依赖系统组件。
77- 复用正常模式的配置文件
78为了降低耦合复用正常模式的配置文件。这部分配置文件适用于正常模式和updater模式,不需要针对性适配。通过BUILD.g设置复制到updater.img,通过import方式调用。
79init.usb.cfg:HDC相关的配置
80init.usb.configfs.cfg :USB相关的配置
81faultloggerd.cfg:faultloggerd服务配置文件,用于捕获updater模式的crash异常
82hilogd.cfg:hilogd配置文件,用于打印OpenHarmony所有组件的日志。
83配置文件需要修改对应的BUILD.gn文件,拷贝到产品out目录,最终打包到updater.img镜像。参考如下配置:
84
85```
86        ohos_prebuilt_etc("updater_common.cfg") {
87          source = "updater_common.cfg"
88          install_images = [ "updater" ]       #打包到updater.img
89          part_name = "updater"
90        }
91```
92
93### 升级服务启动
94完成配置文件的适配,单板运行时会根据配置文件顺序依次执行配置中的命令。最终拉起升级子系统核心服务updater进程。updater服务启动以后,屏幕会显示UI界面,进行安装包升级,恢厂,重启等功能。升级服务功能如下所示:
95![](figures/Openharmony-updater-升级子系统架构图.png)
96
97初次适配会出现进程功能缺失等情况,参考如下方法进行调试
98- 使用ps -A命令查询updater,hdcd等关键进程是否启动。
99- 使用dmesg查看内核日志,是否是init服务异常。
100- 使用hilog和faultlogger查看进程是否出现crash,其他组件是否正常。
101- 手动拉起服务,如果服务能启动,检查启动配置文件是否正确。
102
103### OTA升级
104正常模式有两个子程序用于操作misc分区。
105执行write_updater命令向misc分区的update字段写入指令,指令格式参考参考write_updater源码base/update/updater/utils/write_updater.cpp106执行reboot updater命令,向misc分区的command写入指令,单板会重新启动,重启过程中uboot读取misc分区的命令,从command命令判断当前要进入updater模式,依次加载内核和updater.img,完成从正常模式到updater模式的启动流程。
107updater进程启动后读取update字段的命令,获取升级包的路径,单板进入升级流程,直至升级成功重启。
108### updater模式界面
109正常模式只输入reboot updater命令,进入updater模式界面。此模式可以进行SD卡升级,恢厂等操作。
110
111### flashd模式
112flashd模式介绍:flashd是OpenHarmony升级子系统的一个刷机模式,可以提供格式化用户分区,擦除分区,刷写镜像,zip格式整包升级的功能。
113Flashd分为客户端和服务端,客户端提供统一的用户界面,服务端提供对应的功能服务,二者之间通过HDC作为数据传输通道。适配Flashd模式,可以提供刷机脚本刷机,工厂模式等功能。
114updater模式为常规升级模式,只能进行升级包升级和恢厂设置等功能。
115flashd模式和updater模式共用一个进程,入口函数在base/update/updater/services/main.cpp的main()函数,读取misc信息判断当前是否进入flashd模式。
116正常模式输入以下命令进入flashd模式:
117
118```
119    # write_updater boot_flash
120    # reboot updater
121```
122
123flashd模式调试具体参考:。
124
125## 驱动适配
126updater模式屏幕,触控等参考:
127