前提

进行系统升级功能适配,需要保证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服务器的请求操作,包括但不限于:

  1. 修改服务器ip及端口

  2. 涉及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证书信息。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐