首页 > 其他分享 >Openharmony的编译构建--进阶篇1

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

时间:2023-04-23 11:33:41浏览次数:56  
标签:Openharmony account -- 部件 进阶篇 base 模块 ohos os

上一篇中说明了Openharmony V3.1的编译构建流程,如何在标准系统即L2设备添加一个模块呢,在Openharmony上如何编译与运行HelloWorld此篇中有所提及,此篇对此进行详细的说明。

一、标准系统添加一个模块

在Openharmony中添加模块可以分以下三种情况,对原有的配置文件时行不同程度的修改

  • 在原有的部件中添加一个模块
  • 新建部件并在其中添加模块
  • 新建子系统并在该子系统的部件下添加模块

以下分三种方式对添加一个模块的过程来分别分析。

二、 在原有部件中添加一个模块

1.在模块目录下配置BUILD.gn,根据类型选择对应的模板

支持的模板类型:

ohos_executable		#可执行程序
ohos_shared_library #动态库
ohos_static_library #静态库

# 预编译模板
ohos_prebuilt_executable 		#预编译可执行程序
ohos_prebuilt_shared_library 	#预编译动态库
ohos_prebuilt_etc				#预编译配置

以下例子中对BUILD.gn文件中各模板的属性及配置项的注释说明

例子:

ohos_shared_library示例

import("//build/ohos.gni")
ohos_shared_library("helloworld") {
  source = ["",""]		# 包含的C或C++文件
  include_dir = ["",""] # 包含的头文件
  cflags = []			# 编译选项
  cflags_c = []
  cflags_CC = []
  ldflags = []
  configs = []
  deps = []				# 部件内模块依赖
  
  external_deps = [
    "part_name:module_name",
  ]
  # 跨部件模块依赖定义
  # 定义格式为 "部件名:模块名称"
  # 这里依赖的模块必须是部件声明在inner_kits中的模块
  
  defines += ["",""]	# 宏定义
  
  output_name = "" 		# 可选,模块输出名
  output_extension = "" # 可选,模块名后缀
  module_install_dir = ""	# 可选,缺省在/system/lib64或/system/lib下,模块安装路径,模块安装路径,从system/,vendor/后开始指定
  relative_install_dir = ""	# 可选,模块安装相对路径,相对于/system/lib64或/system/lib;如果有module_install_dir配置时,该配置项不生效
  
  part_name = ""		# 必选,所属部件名称
  subsystem_name = ""	# 可选,子系统名称
}

ohos_executable示例

ohos_executable模板属性和ohos_shared_library基本一致。

ohos_executable("helloworld") {
  source = ["",""]		# 包含的C或C++文件
  include_dir = ["",""] # 包含的头文件
...
  install_enable = true	# 编译后的镜像烧录后,可执行模块默认是不安装在开发板内,如果要安装需要指定install_enable为true.
}

ohos_prebuilt_etc示例

ohos_prebuilt_etc就是将预编译的文件安装在开发板内,一般会是配置文件,例如xml,cfg等。

ohos_prebuilt_etc("helloworld") {
  source = ""		
  deps = [] 	# 部件内模块依赖
  module_install_dir = ""	# 可选,模块安装路径,从system/,vendor/后开始指定
  relative_install_dir = ""	# 可选,模块安装相对路径,相对于/system/etc;如果有module_install_dir配置时,该配置项不生效
  part_name = ""		# 必选,所属部件名称
}

2.修改包含该模块所属部件的bundle.json

以base/account/os_account/bundle.json为例:

此模块的BUILD.gn文件所在目录为//base/account/os_account/,

则在“sub_component”中添加"//base/account/os_account:helloworld"。

{
  "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"
  },
...
  "component": {
    "name": "os_account_standard",
    "subsystem": "account",
...
    "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:helloworld"
      ],
...
   }
  }
}

此时再在Openharmony里执行

./build.sh --product-name rk3568

编译完成后,在//out/rk3568/account/os_account_standard/目录下可以找到编译完成的可执行文件与动态库。

三、新建部件并在其中添加模块

  1. 在模块目录下配置BUILD.gn,根据类型选择需要的模板

​ 此步与在原部件中添加一个模块的方法基本上一致,只需要注意该模块对应BUILD.gn文件中的part_name为新建部件的名称即可。

​ 2.修改或者新建bundle.json

在原有子系统中添加一个新的部件,有两种方法,一种就是如第二点所述,在原有的bundle.json文件中添加该部件。另一种就是新建一个。注意无论哪种方式该bundle.json文件均在对应子系统所在的文件目录下。除非你修改了//build/subsystem_config.json中关于此子系统对应的路径信息。参考Openharmony的编译构建--基础篇

以account子系统为例,添加新的子部件os_account_test.

  • 首先base/account下创建目录os_account_test,此目录下新建bundle.json。内容如下
{
  "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"
  },
...
  "component": {
    "name": "os_account_test",		# 新建的部件名称
    "subsystem": "account",			# 所属的子系统
...
    },
    "build": {
      "sub_component": [			# 部件包含的模块的gn目标
...                                  
      ],
      "inner_kits": [
...
     ],
     "test": [
...
     ]
   }
  }
}
  • 添加BUILD.gn

如果在base/account/os_account_test新建BUILD.gn,则sub_component添加如下

"//base/account/os_account_test:helloworld"
  • inner_kits与test

假如有提供给其它部件的接口,需要在inner_kits说明,假如有测试用例,需要在test中说明,inner_kits与test不是必选项,可以不添加。

​ 3.//productdefine/common/products/rk3568.json文件添加部件"account:os_account_test":{}

{
  "product_name": "rk3568",
  "product_company": "hihope",
  "product_device": "rk3568",
  "version": "2.0",
  "type": "standard",
  "product_build_path": "device/hihope/build",
  "parts":{
    "ace:ace_engine_standard":{},
    "ace:napi":{},
    "account:os_account_standard":{},
    "account:os_account_test":{},
    "barrierfree:accessibility":{},
......
    }
}

至此,重新编译。在//out/rk3568/account/os_account_test/目录下会得到新增的模块下可执行文件或动态库。

后续更精彩

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

标签:Openharmony,account,--,部件,进阶篇,base,模块,ohos,os
From: https://blog.51cto.com/u_15304012/6216924

相关文章

  • 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),游刃有余地驾驭了众多品牌和客户的复杂数据。那么问......
  • 会话跟踪技术
    会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开链接,会话结束。在一次会话中可以包含多次请求和响应。会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。HTTP协议是无状态的,每次浏览器向服......