首页 > 其他分享 >Openharmony的编译构建--基础篇

Openharmony的编译构建--基础篇

时间:2023-04-23 11:33:49浏览次数:38  
标签:Openharmony account -- 编译 json base accountmgr os 子系统

一、编译构建简介

​ Openharmony的编译构建流程在鸿蒙的开源版本中以V3.1为分界线,流程略有变化。但其中都是ninja与python通过配置文件json,调用不同的交叉工具链来对源码进行编译,然后生成镜像文件。本文首先以Openharmony V3.1版本为例讲解下其编译构建的过程,并以实例的方式对如何添加子系统、模块等进行说明。

​ 后续会对Openharmony V3.2其及衍生的版本进行扩展说明。

二、Openharmony v3.1 L2设备整体编译流程

2.1 编译扫描说明

在编译的时候,需要扫描相应的子系统配置文件。子系统配置文件包含以下三个文件

  • subsystem_config.json
  • {产品名称}.json
  • {产品设备名称}.json

通过此三个文件,加载该产品需要参与编译的所有子部件及配置信息。

2.2 {产品名称}.json

product配置文件,在//productdefine/common/products目录下,以下编译rk3568为例:

当在Openharmony根目录下输入

./build.sh --product-name rk3568

此时首先进入preloader阶段,根据参数rk3568找到//productdefine/common/products/rk3568.json文件,

该配置文件主要包含产品名称,产品厂商,产品设备名,产品类型,产品对应子系统路径,产品所包含的部件等信息。配置该产品对应子系统时在该文件中添加product_build_path表示产品子系统目录。preloader阶段从该目录下加载对应子系统部件配置信息。

{
  "product_name": "rk3568",     				# 产品名称	
  "product_company": "hihope",					# 产品厂商
  "product_device": "rk3568",					# 产品设备名 ({产品设备名称}.json) 
  "version": "2.0",
  "type": "standard",							# 产品类型
  "product_build_path": "device/hihope/build",	# 产品子系统目录
  "parts":{										# 产品所包含的部件
    "ace:ace_engine_standard":{},
    "ace:napi":{},
    "account:os_account_standard":{},
    "barrierfree:accessibility":{},
......
  }
}

2.3 {产品设备名称}.json

device配置文件,根据2.2描述文件名也为rk3568.json,此文件完整路径即为//productdefine/common/device/rk3568.json,该配置文件主要包含设备名称,设备厂商,设备的目标os与目标cpu,设备对应子系统路径等信息。配置该设备对应子系统时在该文件中添加device_build_path表示设备子系统目录,preloader阶段从该目录下加载对应子系统部件配置信息。

{
    "device_name": "rk3568",					# 设备名称
    "device_company": "hihope",					# 设备厂商
    "target_os": "ohos",						# 设备的目标os
    "target_cpu": "arm",						# 设备的目标cpu
    "kernel_version": "",
    "device_build_path": "device/hihope/build",	# 设备子系统目录
    "enable_ramdisk": true,
    "build_selinux": true
}

根据设备子系统目录device/hihope/build,找到当前目录下的ohos.build,找到设备子系统与子部件。

{
    "subsystem": "rockchip_products",	#设备子系统 								
    "parts": {							#子部件
        "rockchip_products": {
            "module_list": [
                "//device/hihope/build:products_group",
                "//vendor/hihope/rk3568/bluetooth:libbt_vendor",
                "//vendor/hihope/rk3568/bluetooth:BCM4362A2.hcd"
            ]
        }
    }
}

2.4 subsystem_config.json

在//build/subsystem_config.json文件中,主要包含子系统名称与路径信息,在preloader阶段被加载,根据子系统名称和路径信息查找该路径下的ohos.build文件。

{
  "ace": {
    "path": "foundation/ace",
    "name": "ace"
  },
  "ai": {
    "path": "foundation/ai",
    "name": "ai"
  },
  "account": {
    "path": "base/account",
    "name": "account"
  },
......
}

在2.2的{产品名称}.json中,子部件"account:os_account_standard":{},根据subsystem_config.json的映射,扫描base/account此目录下的所有bundle.json文件,找到子组件名为os_account_standard的bundle.json(可以有多个),即参与编译的bundle.json文件为base/account/os_account/bundle.json。

bundle.json中包含子部件中参与的编译的所有模块。

三、编译部件与模块

3.1 bundle.json

编译部件配置文件。以base/account/os_account/bundle.json为例:

“component”描述子部件名称,所在子系统等信息。

“build”包含参与编译的子组件模块"sub_component"与内部组件"inner_kits"与测试模块"test"。

{
  "name": "@ohos/os_account",
  "description": "Allowing apps to use OS account-related functions",
  "version": "3.1",
  "license": "Apache License 2.0",
  "publishAs": "code-segment",
  "segment": {
    "destPath": "base/account/os_account"
  },
  "dirs": {},
  "scripts": {},
  "component": {
    "name": "os_account_standard",								# 子部件名称
    "subsystem": "account",										# 子系统名称
    "syscap": [
      "SystemCapability.Account.AppAccount",
      "SystemCapability.Account.OsAccount"
    ],
    "features": [
      "os_account_standard_enable_app_account = true",
      "os_account_standard_enable_os_account = true"
    ],
    "hisysevent_config": [
      "//base/account/os_account/hisysevent.yaml"
    ],
    "adapted_system_type": [
      "standard"
    ],
    "rom": "4096KB",
    "ram": "82000KB",
    "deps": {
      "components": [
        "ability_base",
        "ability_runtime",
        "bundle_framework",
        "ces_standard",
        "distributeddatamgr",
        "hisysevent_native",
        "hiviewdfx_hilog_native",
        "ipc",
        "safwk",
        "samgr_standard",
        "startup_l2"
      ],
      "third_party": [
        "jsoncpp"
      ]
    },
    "build": {
      "sub_component": [
        "//base/account/os_account/services:services_target",
        "//base/account/os_account/services/accountmgr/src/appaccount:app_account_service_core",
        "//base/account/os_account/frameworks/appaccount/native:app_account_innerkits",
        "//base/account/os_account/frameworks/osaccount/core:os_account_core",
        "//base/account/os_account/frameworks/common:common_target",
        "//base/account/os_account/frameworks/osaccount/native:os_account_innerkits",
        "//base/account/os_account/interfaces/kits/napi/appaccount:appaccount",
        "//base/account/os_account/interfaces/kits/napi/distributedaccount:distributedaccount",
        "//base/account/os_account/interfaces/kits/napi/osaccount:osaccount",
        "//base/account/os_account/sa_profile:account_sa_profile",
        "//base/account/os_account/tools:os_account_tools",
        "//base/account/os_account:HelloOpenHarmony"
      ],
      "inner_kits": [
        {
          "header": {
            "header_base":"//base/account/os_account/interfaces/innerkits/ohosaccount/native/include",
            "header_files": [
              "account_info.h",
              "device_account_info.h",
              "iaccount.h",
              "ohos_account_kits.h"
            ]
          },
          "name": "//base/account/os_account/frameworks/ohosaccount/native:libaccountkits"
        },
        {
          "header":{
            "header_base":"//base/account/os_account/interfaces/innerkits/osaccount/native/include",
            "header_files": [
              "os_account_constants.h",
              "os_account_info.h",
              "os_account_manager.h",
              "os_account_subscribe_info.h",
              "os_account_subscriber.h"
            ]
          },  
          "name": "//base/account/os_account/frameworks/osaccount/native:os_account_innerkits"
        },
        {
          "header": {
            "header_base":"//base/account/os_account/interfaces/innerkits/appaccount/native/include",
            "header_files": [
              "app_account_manager.h"
            ]
          },
          "name": "//base/account/os_account/frameworks/appaccount/native:app_account_innerkits"
        }
     ],
     "test": [
       "//base/account/os_account/frameworks/common/test:unittest",
       "//base/account/os_account/services/accountmgr/test:unittest",
       "//base/account/os_account/frameworks/ohosaccount/test:moduletest",
       "//base/account/os_account/frameworks/osaccount/core/test:unittest",
       "//base/account/os_account/frameworks/osaccount/native/test/moduletest:moduletest",
       "//base/account/os_account/services/accountmgr/test/moduletest/os_account:moduletest",
       "//base/account/os_account/frameworks/ohosaccount/test:moduletest",
       "//base/account/os_account/frameworks/osaccount/native/test/unittest:unittest",
       "//base/account/os_account/tools:unittest",
       "//base/account/os_account/tools:moduletest",
       "//base/account/os_account/test/systemtest:systemtest",
       "//base/account/os_account/frameworks/appaccount/native/test:moduletest",
       "//base/account/os_account/frameworks/appaccount/native/test:unittest",
       "//base/account/os_account/services/accountmgr/test/moduletest/app_account:moduletest",
       "//base/account/os_account/services/accountmgr/test/unittest/app_account:unittest"
     ]
   }
  }
}

每一行模块可以找到相对应的BUILD.gn文件,以"sub_component"中第一行为例

"//base/account/os_account/services:services_target",

可以在//base/account/os_account/services目录下找到BUILD.gn。

3.2 BUILD.gn

模块文件,承接上文,以//base/account/os_account/services/BUILD.gn为例,

group("services_target") {
  deps = [ "accountmgr:accountmgr_target" ]
}

//base/account/os_account/services:services_target,即对应group("services_target")模板,此模板依赖"accountmgr:accountmgr_target",再接着往下查找BUILD.gn,得到//base/account/os_account/services/accountmgr/BUILD.gn。

import("//base/account/os_account/os_account.gni")
import("//build/ohos.gni")

ohos_prebuilt_etc("accountmgr.init") {
...
}

ohos_prebuilt_etc("osaccount_constraint") {
...
}

ohos_prebuilt_etc("constraints_list_collection") {
...
}

group("accountmgr_target") {
  deps = [
    ":accountmgr",
    ":accountmgr.init",
    ":constraints_list_collection",
    ":osaccount_constraint",
  ]
}
......
ohos_shared_library("accountmgr") {
......
}

由此文件可以得出,此模块的group("accountmgr_target")会编译出一个动态库(accountmgr)及三个预编译配置项(accountmgr.init、osaccount_constraint、constraints_list_collection)。

关于BUILD.gn的介绍,在下一单对此作详细解释说明。此时生成的动态库名称为libaccountmgr.z.so。在Openharmony里的动态库一般会加上前缀lib以及后缀.z.so.

后续更精彩

1.Openharmony编译构建--进阶篇

标签:Openharmony,account,--,编译,json,base,accountmgr,os,子系统
From: https://blog.51cto.com/u_15304012/6216922

相关文章

  • Openharmony的编译构建--进阶篇1
    上一篇中说明了OpenharmonyV3.1的编译构建流程,如何在标准系统即L2设备添加一个模块呢,在Openharmony上如何编译与运行HelloWorld此篇中有所提及,此篇对此进行详细的说明。一、标准系统添加一个模块在Openharmony中添加模块可以分以下三种情况,对原有的配置文件时行不同程度的修改......
  • jmeter-跨线程组传参的两种方法
    jmeter的变量值不能跨线程组传递。如果变量在开始测试之前已经确定了,我们可以用参数化关联就可以实现。但是如果值时动态生成,每循环一次,值就变化一次,那么怎么办呢?以下两种方法可解决方法一:自定义属性法思路:jmeter中,属性是全局的,是可以动态设置的;而变量是独属于每个线程的第一步......
  • 手把手教你使用Python生成图灵智能小伙伴,实现工作助手/闲聊功能
    /1前言/在家闲着,做个小项目,基于Python,实现一个语聊小机器人,分享给大家。项目整体比较简单,官方文档介绍的非常详细,可快速上手。/2 目标/将图灵机器人放到桌面,实现工作助手/陪聊功能。/3 涉及的库/V1.0版本:requests、jsonV2.0版本:requests、json、selenium(实现功能:如图灵返回结果......
  • Openharmony的编译构建--进阶篇2
    承接上一篇Openharmony的编译构建--进阶篇1中说明了在OpenharmonyV3.1的如何在标准系统即L2设备一个模块的两种情况,此篇对第三种情况进行说明。四、新建子系统并在该子系统的部件下添加模块1.在模块目录下配置BUILD.gn,根据类型选择对应的模板2.新建包含该模块所属部件的bundle......
  • Cookie基本使用
    cookie是什么?是由服务器端生成,发送给User-Agent(一般指浏览器),浏览器将cookie以键值对的形式保存到某个目录下的文本文件内。下次请求该网站时就把cookie发送回服务器。(cookie就是一个小文件,浏览器对其大小一般限制在4k,用来记录一些信息(一般用作标识))为什么有cookie?web应用程......
  • c++第十天
    指针复习:  什么是指针:    数据类型定义指针变量整型内存编号访问对应内存  为什么使用指针:    1、函数之间共享变量      输入、输出    2、提高传参效率      指针变量4\8字节    3、使用堆内存时......
  • 手把手教你使用Flask搭建ES搜索引擎(预备篇)
    今日鸡汤我死国生,我死犹荣,身虽死精神长生,成功成仁,实现大同。--赵博生/1前言/    Elasticsearch是一个开源的搜索引擎,建立在一个全文搜索引擎库ApacheLucene™基础之上。    那么如何实现 Elasticsearch和Python 的对接成为我们所关心的问题了(怎么什么都要和Pyt......
  • 一篇文章带你用Python网络爬虫实现网易云音乐歌词抓取
    前几天小编给大家分享了数据可视化分析,在文尾提及了网易云音乐歌词爬取,今天小编给大家分享网易云音乐歌词爬取方法。本文的总体思路如下:找到正确的URL,获取源码;利用bs4解析源码,获取歌曲名和歌曲ID;调用网易云歌曲API,获取歌词;将歌词写入文件,并存入本地。本文的目的是获取网易云......
  • 优化配置Little Snitch for Mac的规则和设置
    LittleSnitchforMac是一款专业的macOS防火墙软件,它可以帮助你控制应用程序是否访问网络或者磁盘,并对系统不可信的进程和信息进行监控。如果你想保护你的Mac的网络安全,那么你需要了解如何配置和优化LittleSnitchforMac的规则和设置。本文将为你介绍一些基本的操作和技巧,让你能......
  • 3个迹象表明,企业是时候搭建CDP了!
    和过去任何时代相比,当下的数字化程度都更加深入,且还在持续加速的进程中。如今,客户数据的重要性已经毋庸置疑。企业应该如何应用数字化改进客户体验,以及由此产生的海量客户数据,已经成为新的焦点。许多企业通过使用客户数据平台(CDP),游刃有余地驾驭了众多品牌和客户的复杂数据。那么问......