下载代码

YodaOS 的代码使用 GitHub 和 Gerrit 分别进行管理,开发者可以参考官方下载教程具体了解。

目录介绍

接下来先按照字母顺序,介绍下一级目录如下:

子节点 是否目录 描述
3rd 第三方软件包,包括一些从 Android 和 Linux 继承下来的包
applications 应用目录,存放一些内置或示例应用,开发者的应用也应建在该目录下
frameworks 框架目录,存放 OS 中核心的代码
hardware 硬件抽象层代码,也包括主芯片和外设的硬件抽象
kernel Linux 内核代码
openwrt 编译目录
products 产品目录,存放每个产品所需的若干配置与定义
toolchains 编译工具链目录
tools 系统工具,一般用于打包、调试和版本相关的工具
uboot uboot 目录,子目录按照支持的芯片区分
vendor 第三方厂家文件
build.sh 编译镜像的主入口,包括编译每个 ipk 软件包、系统镜像和 OTA 镜像

接下来对几个比较重要的目录分别介绍。

openwrt

YodaOS 使用 OpenWRT 编译系统,下面会做一个简单的介绍,需要深入了解可以到官网深入了解。

代码目录
  • ./scripts 存放了一些脚本,使用了 bash、python、perl 等多种脚本语言。编译过程中,用于第三方软件包管理的 feeds 文件也是在这个目录当中。在编译过程中,使用到的脚本也统一放在这个目录中。
  • ./tools 编译时,主机需要使用一些工具软件,tools 里包含了获取和编译这些工具的命令。软件包里面有 Makefile 文件,有的还包含了 Patch。每个 Makefile 当中都有一句 $(eval $(call HostBuild)),这表明编译这个工具是为了在主机上使用的。
  • ./config 存放着整个系统的配置文件
  • ./configs 存放各个板级的默认配置
  • ./docs 包含了整个宿主机的文件源码的介绍,里面还有 Makefile 为目标系统生成文档。使用make -C docs/可以为目标系统生成文档。
  • ./toolchain 交叉编译链,这个文件中存放的就是编译交叉编译链的软件包.包括 binutils、gcc、libc 等等。
  • ./target OpenWrt 的源码可以编译出各个平台适用的二进制文件,各平台在这个目录里定义了固件和内核的编译过程。
  • ./package 存放了系统中适用的软件包,包含针对各个软件包的 Makefile。OpenWrt 定义了一套 Makefile 模板。各软件参照这个模板定义了自己的信息,如软件包的版本、下载地址、编译方式、安装地址等。在二次开发过程中,这个文件夹我们会经常打交道。事实上,通过 ./scripts/feed update -a./scripts/feed install -a 的软件包也会存放在这个目录之中。
    • ./rokid 存放了 YodaOS 所需要的package。
    • ./include OpenWrt 的 Makefile 都存放在这里。文件名为 *.mk。这里的文件上是在 Makefile 里被包含的,类似于库文件,这些文件定义了编译过程。
    • ./feeds OpenWrt 的附加软件包管理器的扩展包索引目录。简单来说就是下载管理软件包的。默认 feeds 下载有 packages、management、luci、routing、telephony。如要下载其他的软件包,需打开源码根目录下面的 feeds.conf.default 文件,去掉相应软件包前面的#号,然后更新源:./scripts/feeds update -a,安装下载好的包:./scripts/feeds install -a
  • ./dl 在编译过程中使用的很多软件,刚开始下载源码并没有包含,而是在编译过程中从其他服务器下载的,这里是统一的保存目录。
  • Makefile 在顶层目录执行make命令的入口文件。
  • rules.mk 定义了Makefile中使用的一些通用变量和函数。
  • Config.ininclude/toplevel.mk 中我们可以看到,这是和 make menuconfig 相关联的文件。
  • feeds.conf.default 是下载第三方一些软件包时所使用的地址。
生成目录
  • ./build_dir 在前面的原始目录中,我们提到了 host 工具,toolchain 工具还有目标文件。OpenWrt 将在这个目录中展开各个软件包,进行编译,所以这个文件夹中包含3个子文件夹:
    • ./host 在该文件夹中编译主机使用的工具软件。
    • ./toolchain-<name> 在该文件夹中编译交叉工具链。
    • ./target-<name> 在此编译目标平台的目标文件,包括各个软件包和内核文件。
    • ./bin 保存编译完成后的二进制文件,包括完整的 bin 文件,所有的 ipk 文件。
  • ./staging_dir 用于保存在 build_dir 目录中编译完成的软件,所以这里也和 build_dir 有同样的子目录结构。比如,在 target-<name> 文件夹中保存了目标平台编译好的头文件,库文件。在我们开发自己的 ipk 文件时,编译过程中,预处理头文件,链接动态库,静态库都是到这个子文件夹中。
如何添加自己的包(Package)

参考 https://openwrt.org/docs/guide-developer/helloworld/chapter3

编译基础
  • 首先通过 cd openwrt 进入到 openwrt 目录
  • 然后拷贝你所需的 defconfig 到 .config 覆盖后,执行 make defconfig
  • 最后通过 make V=s 编译即可
使用 menuconfig 生成配置
  • 运行 make menuconfig 完成配置修改
  • 运行 ./scripts/diffconfig.sh > *_defconfig 生成脚本
编译单个包
  • 清理、编译、安装单个包使用:make package/<name>/{clean,compile,install}
  • 编译清理, 编译, 安装工具链使用:make toolchain/{clean,compile,install}
单独编译内核
$ make target/linux/compile
如何选择 Debug / Release
$ source envsetup.sh

You are building on Linux
Lunch menu... pick a image style:

1. debug(root filesystem bin is not striped)(目前受限于 k18 flash 的大小,debug 模式下也是不带符号表)
2. release(root filesystem bin is striped)

./build.sh 添加 -d 选项:

$ ./build.sh -p leo_k18_universal_node -n openwrt-leo-k18-universal -f leo-k18-universal  -j32 -r -d

Release 模式下,

  • 自己的调试程序不需要打包到镜像
  • 日志级别调到 info

Debug 模式下,

  • config 下 CONFIG_DEBUG 宏会被打开
  • 各软件包,根据宏定义拷贝相应的测试程序和工具到镜像中
  • 日志级别调到 debug

frameworks

框架目录中的结构相对比较复杂,这里只做第一层目录的介绍,如需了解更多可以在代码中具体查看:

子目录 描述
aial 算法库、神经网络库、语音激活库、离线自然语言处理等
native 系统功能库与服务,包括多媒体、蓝牙、音量等
vm 应用虚拟机,包括 Node.js 和 ShadowNode
jsruntime YodaOS 应用框架代码

yodart 介绍

yodaos-project/yodartYodaOS 的应用层框架,下面对其做简单介绍。

子目录 描述
include 构建时依赖的项目头文件
packages 通用模块接口,用于调用系统底层服务
res 资源文件包括灯光和音效
runtime 核心代码与服务
test 单元测试
tools 调试工具

yodaos-project/yodart 中源码目录与最终目标机器上的目录对应关系如下:

源码目录 设备目录
res /opt/res
apps /opt/apps
runtime /usr/yoda
packages /usr/lib/node_modules

下面简单介绍一下语音交互的流程,如下:

  1. 用户的语音在云端解析完后通过 MQTT 服务推送相应的 NLP 数据到 VUI
  2. VUI 服务选择对应的本地应用处理数据
  3. 如果应用的处理中包含灯光、播报等逻辑,会通过 VUI 来调用对应的服务来执行逻辑

products

Product 用于存放每个产品所需的一些配置,一个标准的产品(Product)项目需要包含以下文件或目录:

  • ./configs 当前产品的 defconfig 配置文件目录
  • ./workdir_asr_cn 语音前端的配置文件
  • ./manifest.json 该产品的配置文件,用于指定产品版本和特性
  • ./CMakeLists.txt 该产品的编译入口文件,通常用于安装资源、应用和配置等

如果想深入了解,可以查看示例项目:yodaos-project/product-kamino18

results matching ""

    No results matching ""