+86-755-89202795

华为开放鸿蒙OpenHarmony认证

OpenHarmony兼容性认证主要是验证合作伙伴的设备和业务应用满足OpenHarmony开源兼容性定义的技术要求,确保运行在OpenHarmony上的设备和业务应用能稳定、正常运行,同时使用OpenHarmony的设备和业务应用有一致性的接口和业务体验。

企业级合规

OpenHarmony标准系统的开发,移植与适配

在当今物联网和智能设备高速发展的时代,OpenHarmony作为一款开源操作系统,为开发者提供了丰富的资源和平台。本文将介绍从移植、开发、适配,到兼容性测试、驱动集成等整个流程。

一、项目背景与准备工作

在着手进行OpenHarmony系统的移植与开发之前,我们需要了解针对设备开发的部分,包括系统移植指南、应用开发文档、UX设计规范等。搭建开发环境:根据项目需求,配置了相应的开发工具链,并搭建了基于OpenHarmony的集成开发环境(IDE)。
定义开发板与产品:在OpenHarmony的源码仓库中,我们为对应的开发板创建了专属的产品目录,并编写了config.json配置文件,详细描述了产品的相关信息,如CPU类型、操作系统版本、设备厂商名等。
例:假定MyProduct是P1Vendor公司的开发板,使用SoCVendor公司生产的SOC芯片作为处理器。

定义产品
在//vendor/P1Vendor/{product_name}名称的目录下创建一个config.json文件,该文件用于描述产品所使用的SOC 以及所需的子系统。配置如下:
//vendor/P1Vendor/P1/config.json


二、系统移植与内核编译

1. 移植验证
根据标准系统移植经验,我们首先启动了对应产品的构建。通过执行构建命令,我们验证了系统的基本框架是否能够成功构建,并在指定目录下生成了OpenHarmony的镜像文件。
启动产品构建:./build.sh --product-name MyProduc 


构建完成后,可以在//out/{device_name}/packages/phone/images目录下看到构建出来的OpenHarmony镜像文件。

2. 内核移植
为了让Linux内核在相关芯片上成功运行,我们进行了内核的移植工作。这包括为相关芯片添加内核构建的子系统,并在子系统的定义中描述了内核构建的路径。接下来,我们修改了相关的配置文件,将新添加的子系统加入到产品中。最后,我们编译了Linux 4.19版本的内核,并生成了内核镜像和bootloader镜像。

期望的构建结果:


三、用户态启动引导与HDF驱动移植

1. 用户态启动引导
在系统上电加载内核后,用户态的启动引导过程至关重要。我们详细研究了init进程的启动流程,以及它如何挂载根文件系统、启动ueventd监听内核热插拔事件等。同时,我们为MyProduct开发板编写了平台相关的初始化配置文件,以确保系统能够正确识别和加载硬件设备。

用户态进程启动引导总览:


2. HDF驱动移植
OpenHarmony提供了HDF(Hardware Driver Foundation)框架来支持硬件驱动的移植和开发。我们为MyProduct开发板移植了LCD、触摸屏和WLAN等关键硬件的驱动。
  • LCD驱动:我们编写了LCD驱动的代码,并在驱动中生成了模型的实例并完成注册。同时,我们在配置文件中添加了LCD驱动的相关配置,以确保系统能够正确加载和识别LCD设备。
  • 触摸屏驱动:我们创建了触摸屏驱动的代码文件,并实现了必要的接口和方法。同样地,我们在配置文件中添加了触摸屏驱动的相关配置。
其中ChipDevice中要提供若干方法:



  • WLAN驱动:我们为WLAN芯片编写了ChipDriver驱动的代码,并实现了HDF_WLAN_CORE和NetDevice提供的接口。同时,我们编写了配置文件来描述驱动支持的设备信息,并在系统配置中添加了WLAN驱动的相关配置。
WLAN芯片:



3.遇到的问题和方案
OpenHarmony系统解决方案 - 锁屏引起的卡开机动画

Q:在open harmony开发中遇到开机时,卡在开机logo,无法正常进入系统。
系统版本为:open harmony-4.0
分析问题后,发现是在设备开发过程中,某个需求需要删除锁屏应用,让系统直接进入桌面,但删除锁屏应用后并没有移除锁屏服务,导致锁屏服务监听到事件,无法正常使开机动画正常关闭。

解决方案:

此时我们发现锁屏服务会检测一个系统属性 bootevent.lockscreen.ready。 
代码如下,此段代码为属性检测的过程
// foundation/graphic/graphic_2d/frameworks/bootanimation/src/boot_animation.cpp
void BootAnimation::CheckExitAnimation()
{
    LOGI("CheckExitAnimation enter");
    if (!setBootEvent_) {
        LOGI("CheckExitAnimation set bootevent parameter");
        system::SetParameter("bootevent.bootanimation.started", "true");
        setBootEvent_ = true;
    }
    std::string windowInit = system::GetParameter("bootevent.boot.completed", "false");
    if (windowInit == "true") {
        PostTask(std::bind(&AppExecFwk::EventRunner::Stop, runner_));
        LOGI("CheckExitAnimation read windowInit is true");
        return;
    }
}

当系统属性bootevent.lockscreen.ready为true的时候会进行回调,并且锁屏服务会进行属性检查,若检查次数超过时,系统认定为失败,会一直卡在,代码如下

// base/theme/screenlock_mgr/services/src/screenlock_system_ability.cpp
void ScreenLockSystemAbility::OnSystemReady()
{
    SCLOCK_HILOGI("ScreenLockSystemAbility OnSystemReady started.");
    bool isExitFlag = false;
    int tryTime = 20; // 根据设备性能调整此处尝试次数
    int minTryTime = 0;
    while (!isExitFlag && (tryTime > minTryTime)) {
        if (systemEventListener_ != nullptr) {
            SCLOCK_HILOGI("ScreenLockSystemAbility OnSystemReady started1.");
            std::lock_guard<std::mutex> lck(listenerMutex_);
            SystemEvent systemEvent(SYSTEM_READY);
            systemEventListener_->OnCallBack(systemEvent);
            isExitFlag = true;
        } else {
            SCLOCK_HILOGE("ScreenLockSystemAbility OnSystemReady type not found., flag_ = %{public}d", flag_);
            sleep(1);
        }
    }
}
之后我们需要移除锁屏服务,删除编译组件即可
{
  "version": "4.0",
  "subsystems": [
    ···
    {
      "subsystem": "theme",
      "components": [
        {
          "component": "wallpaper_mgr",
          "features": []
        }
      ]
    },
    ···
  ]
}

四、open harmony应用开发
在开发第一个open harmony 应用,需要快速了解工程目录的主要文件,熟悉OpenHarmony应用开发流程。

应用模型
应用模型是OpenHarmony为开发者提供的应用程序所需能力的抽象提炼,它提供了应用程序必备的组件和运行机制。有了应用模型,开发者可以基于一套统一的模型进行应用开发,使应用开发更简单、高效。​

随着系统的演进发展,OpenHarmony先后提供了两种应用模型:
FA(Feature Ability)模型:OpenHarmony API 7开始支持的模型,已经不再主推。
Stage模型:OpenHarmony API 9开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。

FA模型和Stage模型的整体架构和设计思想等更多区别。
快速入门提供了一个含有两个页面的开发实例,并使用了不同的开发语言或不同的应用模型进行开发,以便开发者理解以上基本概念及应用开发流程。

官方开发语言为:arkUI
第一个应用:
需要下载开发平台 DevEco studio
首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择File>New>Create Project来创建一个新工程。选择OpenHarmony模板库,选择模板“Empty Ability”,点击next进行下一步配置。



进入配置工程界面,Compile SDK选择“12”,Model选择“Stage”,其他参数保持默认设置即可。
ArkTS工程目录结构(Stage模型)

五、软件定义信息填写
在兼容性测评中,首先需要填写软件定义信息。这些信息包括版本ID和版本hash等。

1.版本ID
版本ID由共计10个字段拼接而成,每个字段都有其特定的含义和填写要求:


2.版本hash

填写“default”即可。

六、授权验证管理

授权验证管理是授权验证开发的核心部分,包括软证书的申请与管理、调测设备的配置与验证等。

1.软证书申请与管理
软证书是授权验证的关键凭证。你需要按照《软证书申请指导》pdf文件的步骤,完成软证书的申请与解密工作。解密工具包括RsaDec.bat和RsaDec-2.1.0.jar文件。

2.管理调测设备
管理调测设备主要涉及修改系统源码中的相关文件,以匹配兼容性平台填写的信息。


3.获取可执行二进制文件与编译

在完成上述修改后,需要编译生成可执行二进制文件以进行授权验证测试。

3.1.打开编译开关:在../test/xts/device_attest/build/devattestconfig.gni文件中,将enable_attest_test_sample设置为true。
3.2.编译:使用编译命令(如./build.sh --product-name rk3568 --ccache)生成镜像文件。
3.3.获取可执行二进制文件:编译产物中会生成attesttestclient可执行文件,位于\xts\device_attest目录下。

4.导入软证书与调测
将软证书导入OH设备后,执行attesttestclient二进制文件进行授权验证测试。测试过程中需确保设备联网。若“管理调测设备”界面显示“验证通过”,则授权验证工作完成。

在完成系统移植和驱动移植后,我们进行了兼容性测试和驱动集成验证。这包括测试系统的基本功能是否正常、硬件设备是否能够被正确识别和驱动、系统在不同场景下的稳定性和性能表现等。通过全面的测试,我们确保了MyProduct开发板上的OpenHarmony系统能够满足项目的需求。

欢迎联系深光,我们从2022年开始至今已经协助很多客户完成开放鸿蒙兼容性测试认证服务,涵盖预测试服务,测试认证流程协助,测试失败fail case定位,整包项目的编译适配,内核移植,系统移植,驱动适配等工作。

深光现在配备了国内开放鸿蒙系统+国外谷歌安卓GMS双系统的测试能力;
面向国外市场,我们建立了成熟的谷歌安卓GMS测试认证;
面对国内市场,我们建立了开放鸿蒙兼容性测试认证;可以协助合作伙伴们、一套样品、一站式、完成国内外双系统2个市场测试认证服务。