鸿蒙OS——.gn和.rc知识总结(基于security_huks

  • 1. GN
  • 1.1 GN的目的和设计理念
  • 1.2 语法
  • 1.3 命名表示
  • 1.4 构建流程
  • 1.5 CONFIGS
  • 1.6 import
  • 1.7 模板
  • 1.8 GN在harmony中的实践使用
  • 1.9 尝试读一读
  • 2. RC文件



鸽了好久


由于每个项目都多多少少有这样一个文件:bulid.gn xxx.rc


所以这里简单学习并总结一下这两个文件的若干知识

1. GN

首先我们来看看.gn文件:

鸿蒙Record使用_鸿蒙Record使用


刚开始我和大家一样也是看的一头雾水,但是等大家通读完这篇文件就知道如何看GN文件啦!

1.1 GN的目的和设计理念

首先GN是一个为Ninja生成构建文件的构建系统,目的是为了工程师更高效的makefile

由于想要使它具备高效性,所以当初设计的理念如下:

  • 理想情况下,相同需求应该生成相同的构建文件
  • 不是必须的情况下,不需要具备灵活性

1.2 语法

  1. 五种类型变量:
  • bool
  • signed 64 bit int
  • string :使用双引号和反斜线使用作为转义字符
  • list:我们无法获取list的航都,列表支持类似的附加:
a = ["first"]
a += ["second"]
b = a + ["third","fourth"]
b -= ["second"]
  • 作用域
  1. 条件语句:
if(is_Linux || target_cpu == "x86"){
	sources -= ["lite.c"]
}else if(……){
	……
}

类似C语言的条件分支

  1. 循环
    使用foreach遍历每个列表
foreach(i, list){
	print(i)
}

一般来说构建的大多数事情是不需要循环来表达的,所以不建议使用循环

  1. 函数调用
    类似C语言,接收{}括起来的代码块
  2. 作用域
    文件和函数调用后{}引入新的作用域,作用域是嵌套的

1.3 命名表示

  • 文件和目录名:都是字符串,解释为相对于当前构建文件的目录或文件
  • 标识:有着预定格式的字符串,由唯一标识识别
    一般由三部分组成:source-tree 绝对路径,:,路径

1.4 构建流程

整个流程如下:首先在当前目录下查询.gn文件,不存在时像上级目录查询,直到找到一个设置为sourceroot,解析该gn文件获得bulid config文件名称。然后执行build config,根据root目录下的build.gn文件找到目标其依赖的其他目录下的bulid.gn文件——当所有的目标依赖都找到后编译出.ninja

其中涉及的目标时构造表中的一个节点,通常用于表示某个要产生的可执行或库文件,目标之间相互依赖,GN内置的一些目标类型:

  • action:运行一个脚本产生一个文件
  • bundle_data:产生iOS数据
  • executable:生成可执行文件
  • group:包含一个或多个目标的虚节点
  • shared_library:一个.dll或.so
  • source_set:一个轻量的虚拟静态库——指向真实库
  • static_library:一个.lib文件
  • component:基于构造类型
  • test:用于测试
  • app:可执行程序
  • android_apk:生成一个APK

1.5 CONFIGS

配置时指定标志集,包含目录和定义的命名对象,可以应用于目标并推送到依赖目标,比如第三方目标——需要一些定义或包含目录才能使其头文件正常导入

config("config"){
	includes = ["src/include"]
	defines = ["HUKS_MESSAGE"]
}

将其应用于目标:

executable("service"){
	configs += [":config"]
}

build config文件通常指定设置默认配置列表的目标默认值。所以实践中我们通常把自定义的config以configs += [":config"]的方式添加

1.6 import

在上面的例子中我们就可以看的import的使用,我们可以使用import将.gni导入当前文件中,这里的import机制与C中的不太一样,它是将import的文件执行完毕的内容复制到当前文件中

这里大家就要问了.gni文件是什么?不是只有.gn文件吗?——这就是接下来要讲的复用的template模板

1.7 模板

一般来说模板定义在.gni文件中,用户import该文件看的模板的定义并使用

//模板的定义
template("ipc"){
	ipc_target_name = "xxx"
	……
}

//模板的调用
import("//tools/ipc_utils.gni")
ipc("my_interfaces"){
	……
}

1.8 GN在harmony中的实践使用

由于知识水平的有限以及对鸿蒙研究不够深入,所以贴上别的研究者的一篇博客分析的比较清楚:

GN在harmony中的实际应用

1.9 尝试读一读

首先我们找到外围的build.gn

鸿蒙Record使用_安全模块_02


可以看的这是用于test的构建文件目录,我们顺着路径再往下找

鸿蒙Record使用_鸿蒙操作系统_03


可以看到给出了很多测试的文件和目录,下面也给出了其依赖的目标deps

通过.gn文件我们很方便的将整个文件结构组织起来

2. RC文件

鸿蒙Record使用_GN_04


除了.gn文件这里还有一个.rc文件——是做什么的呢?

首先这是一个资源文件,里面包括了引入的位图文件,窗口,图标,光标等等。
拿EXE文件举例,如果要生成一个.exe文件,文件的图标是我们自定义的图标,我们就需要添加该图标并保存到.rc中

.rc文件实质上是一类txt文本文件与.h文件配合使用

我们来看看huks_services.rc

鸿蒙Record使用_RC_05


里面定义了shell、system、auth_service等资源