Openharmony4.x系统升级适配方法
前提 进行系统升级功能适配,需要保证bootload下图形原厂驱动、input原厂驱动正常,例如能正常显示开机logo等。 启动updater镜像 以本地升级为例,进行手动升级测试,需要通过hdc命令进入updater模式,相关命令如下: hdc reboot updater #重启进入updater模式 hdc updater_reboot #updater模式下重启进入正常模式 进入upd
前提
进行系统升级功能适配,需要保证bootload下图形原厂驱动、input原厂驱动正常,例如能正常显示开机logo等。
启动updater镜像
以本地升级为例,进行手动升级测试,需要通过hdc命令进入updater模式,相关命令如下:
hdc reboot updater #重启进入updater模式
hdc updater_reboot #updater模式下重启进入正常模式
进入updater模式时updater镜像的启动流程如下:
由流程图可知,进入updater模式并非走的OH的正常启动流程,而是由uboot拉起。实现该流程需要了解以下几方面的适配处理:
1、创建misc分区
Misc 分区是裸盘,是主系统和updater 子系统的一个沟通介质。misc 分区中会存储升级子系统在升级过程中需要的元数据(metadata),如升级命令,掉电续传记录等。 misc 分区的大小约1MB,是一个裸分区,无需制作文件系统, 升级子系统直接访问。
OpenHarmony使用MISC分区保存启动时的指令,默认的MISC分区的结构体为:
struct UpdateMessage { char command[32]; char update[1280]; char reserved[736]; };
command为当前的命令,update存放升级包路径,reserved存放保留信息。
2、配置uboot和内核
uboot需要读取MISC分区的指令,如果command为updater,uboot能启动到updater模式。内核需要根据uboot的指令加载updater.img。
Updater 子系统与主系统共用同一个内核,但用户态是从不同的分区启动。
当主系统OTA service下载到升级包后,会将升级包的位置记录到Misc分区。系统重启后,将从updater 分区启动并进入Updater子系统。
updater模式启动与正常模式启动流程一致。当正常模式调通后,参考正常模式完成updater模式的调试。
如果缺少misc或updater分区是无法升级的,需要将其加上。
3、创建updater分区
updater是一个独立的分区,分区大小建议不小于20MB。updater分区镜像是ext4 格式文件系统。确保系统内核ext4 文件系统的config 是打开状态。
4、分区配置表
升级包安装组件在运行过程中,需要通过分区配置表操作分区。默认的分区配置表文件名是fstab.updater,在编译的时候,打包到升级包安装组件中。
# device/board/hys/oriole/updater/config/fstab.updater #<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags> /dev/block/platform/soc/soc:ap-ahb/22000000.ufs/by-name/system /usr ext4 ro,barrier=1 wait,required /dev/block/platform/soc/soc:ap-ahb/22000000.ufs/by-name/vendor /vendor ext4 ro,barrier=1 wait,required /dev/block/platform/soc/soc:ap-ahb/22000000.ufs/by-name/userdata /data f2fs discard,noatime,nosuid,nodev wait,check,fileencryption=software,quota /dev/block/platform/soc/soc:ap-ahb/22000000.ufs/by-name/misc /misc none none wait,required
5、升级包安装组件启动
updater分区的init 进程有单独的配置文件 init.cfg,升级包安装进程启动配置在该文件中。
文件路径:device/board/hys/oriole/updater/config/init.cfg
6、升级包安装组件编译
a、在build/subsystem_config.json文件中的updater子系统配置项。
如下:
"updater": { "path": "base/update", "name": "updater" },
b、 产品中添加需要编译的组件
如果产品是标准系统,产品的config.json的inherit项需要关联 "productdefine/common/inherit/rich.json",在rich.json 中添加了updater部件:
"subsystem": "updater", "components": [ { "component": "updater", "features": [] }
7、updater界面ui适配
参考社区rk3568,updater/resources下实现开发者手机的资源适配,否则无法正常显示升级界面。新增产品名资源目录,如图:
8、updater分区镜像
updater.img镜像是ramdisk格式且没有内核,需要uboot先拉起内核,然后加载updater.img到内存,作为根文件系统挂载到内核。如果芯片不支持ramdisk格式,需要进一步适配。
编译配置在build仓下,使能镜像编译选项,编译脚本会将out/rk3568/packages/phone/updater文件夹作成updater.img镜像。先使用gzip工具压缩,然后使用cpio工具制作镜像。out/rk3568/packages/phone/updater目录结构与根文件系统结构一致。过多添加文件到updater.img会导致镜像超过32M编译失败。
9、 init服务启动
根文件系统挂载完成,会启动init服务,参考内核启动[内核启动]。 init启动引导组件对应的进程为init进程,是内核完成初始化后启动的第一个用户态进程。init进程启动之后,读取init.cfg配置文件,依次启动各关键系统服务进程。updater模式下的init组件功能与正常模式一致,但是updater模式会根据自身业务对配置文件进行精简,只保留必须的命令。 启动配置文件由以下配置文件组成:
-
与产品相关的配置文件 updater模式的init.cfg文件位于产品目录device/board/厂商/产品/updater下。init.cfg是启动的入口,通过import方式导入其他配置文件。init.rk3568.usb.cfg主要是USB和HDC相关的配置,与产品特性有关。
-
复用正常模式的配置文件 为了降低耦合复用正常模式的配置文件。这部分配置文件适用于正常模式和updater模式,不需要针对性适配。通过BUILD.gn设置复制到updater.img,通过import方式调用。 init.usb.cfg:HDC相关的配置 init.usb.configfs.cfg :USB相关的配置 faultloggerd.cfg:faultloggerd服务配置文件,用于捕获updater模式的crash异常 hilogd.cfg:hilogd配置文件,用于打印OpenHarmony所有组件的日志。
配置文件执行顺序:默认依序执行执行pre-init,init,post-init。 常见的设置:
-
ueventd服务:pre-init阶段启动,所有组件的依赖项,不同产品ueventd配置不一样,建议放产品目录
-
软连接:通过软连接方式将产品的路径转换为openharmony的路径。
-
挂载分区:updater模式启动阶段不挂载分区,升级流程中根据业务场景选择性挂载。
-
设置文件权限:如果二进制没有执行权限,服务会无法正常启动,需要在服务启动前设置权限。
-
执行脚本:updater模式部分场景不挂载data分区,出现异常无法保存日志,会调用脚本保存日志。
10、升级服务启动
完成配置文件的适配,单板运行时会根据配置文件顺序依次执行配置中的命令。最终拉起升级子系统核心服务updater进程。updater服务启动以后,屏幕会显示UI界面,进行安装包升级,恢厂,重启等功能。升级服务功能如下所示:
初次适配会出现进程功能缺失等情况,参考如下方法进行调试
-
使用ps -A命令查询进程是否启动。
-
使用dmesg查看内核日志。
-
使用hilog和faultlogger查看进程是否出现crash。
-
手动拉起服务,如果服务能启动,检查启动配置文件是否正确。
11、OTA升级适配修改
升级过程会检测产品名,通过GetBoardId返回的产品名和BOARD.list中的产品名做匹配,建议此处将产品名调整为编译的产品。
如果涉及OTA服务器,则需要对updater子系统做适配修改,以满足对OTA服务器的请求操作,包括但不限于:
-
修改服务器ip及端口
-
涉及ssl认证则需要添加证书配置
证书路径参考:
安装证书参考:
3. base/update/updateservice/services/firmware/check/include/firmware_icheck.h中的DoAction()函数修改服务器请求,例如添加ssl认证和自定义请求数据 。
4. base/update/updateservice/services/engine/src/progress_thread.cpp的DownloadThread::ProcessThreadExecute()函数修改下载请求,例如添加ca证书信息。
更多推荐
所有评论(0)