鸿蒙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文件:
刚开始我和大家一样也是看的一头雾水,但是等大家通读完这篇文件就知道如何看GN文件啦!
1.1 GN的目的和设计理念
首先GN是一个为Ninja生成构建文件的构建系统,目的是为了工程师更高效的makefile
由于想要使它具备高效性,所以当初设计的理念如下:
- 理想情况下,相同需求应该生成相同的构建文件
- 不是必须的情况下,不需要具备灵活性
1.2 语法
- 五种类型变量:
- bool
- signed 64 bit int
- string :使用双引号和反斜线使用作为转义字符
- list:我们无法获取list的航都,列表支持类似的附加:
a = ["first"]
a += ["second"]
b = a + ["third","fourth"]
b -= ["second"]
- 作用域
- 条件语句:
if(is_Linux || target_cpu == "x86"){
sources -= ["lite.c"]
}else if(……){
……
}
类似C语言的条件分支
- 循环
使用foreach遍历每个列表
foreach(i, list){
print(i)
}
一般来说构建的大多数事情是不需要循环来表达的,所以不建议使用循环
- 函数调用
类似C语言,接收{}括起来的代码块 - 作用域
文件和函数调用后{}引入新的作用域,作用域是嵌套的
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中的实践使用
由于知识水平的有限以及对鸿蒙研究不够深入,所以贴上别的研究者的一篇博客分析的比较清楚:
1.9 尝试读一读
首先我们找到外围的build.gn
可以看的这是用于test的构建文件目录,我们顺着路径再往下找
可以看到给出了很多测试的文件和目录,下面也给出了其依赖的目标deps
通过.gn文件我们很方便的将整个文件结构组织起来
2. RC文件
除了.gn文件这里还有一个.rc文件——是做什么的呢?
首先这是一个资源文件,里面包括了引入的位图文件,窗口,图标,光标等等。
拿EXE文件举例,如果要生成一个.exe文件,文件的图标是我们自定义的图标,我们就需要添加该图标并保存到.rc中
.rc文件实质上是一类txt文本文件与.h文件配合使用
我们来看看huks_services.rc
里面定义了shell、system、auth_service等资源