OpenHarmony系统常见编译命令和参数(持续补充更新)
1. 背景 OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统,该系统提供以下基本功能: 以部件为最小粒度拼装产品和独立编译。支持轻量、小型、标准三种系统的解决方案级版本构建,以及用于支撑应用开发者使用IDE开发的SDK开发套件的构建。支持芯片解
1. 背景
OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统,该系统提供以下基本功能:
- 以部件为最小粒度拼装产品和独立编译。
- 支持轻量、小型、标准三种系统的解决方案级版本构建,以及用于支撑应用开发者使用IDE开发的SDK开发套件的构建。
- 支持芯片解决方案厂商的灵活定制和独立编译。
这里我们介绍常见的编译命令,对于编译环境和下载代码这里不做介绍,如何搭建编译环境和下载代码可以参考:
- 准备开发环境:https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-pkg-prepare.md
- 安装库和工具集:https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-pkg-install-package.md
- 获取源码:https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-pkg-install-package.md
2. 同步源码
一般情况下使用repo + https下载源码仓:
repo init -u https://gitee.com/openharmony/manifest -b master --no-repo-verify
这里面master
即为主干分支,可以改为想要的分支,如4.1release:
repo init -u https://gitee.com/openharmony/manifest -b OpenHarmony-4.1-Release --no-repo-verify
如果想下载某个tag节点的源码,如4.1-Release的OpenHarmony-v4.1-Release节点:
repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v4.1-Release --no-repo-verify
源码的版本和节点可以查看release-notes:https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes
在准备好编译环境和源码后,如果源码不是下载某个tag版本代码,而是下载的某个分支代码,后续可能需要进行源码更新。
使用下面的两条命令进行代码的同步更新,注意:第二条命令一定要记得执行,不执行可能存在某些大文件没更新。
repo sync -c
repo forall -c 'git lfs pull'
在源码根目录下执行prebuilts脚本,安装编译器及二进制工具。
注意:一般此命令在第一次编译前执行成功一次即可,如果没有修改代码,但是编译有问题,可以多执行几次确保编译工具下载完整。
build/prebuilts_download.sh
如果修改了代码,然后执行repo sync -c
下载代码有的仓失败的情况下,一般找到修改的代码回退一下再同步即可,但是如果修改了很多个仓库,一个个的去找回退可能比较麻烦,可以执行以下命令撤销所有修改。
# 撤销所有已经 add 的修改
repo forall -c "git reset HEAD"
# 撤销所有尚未 add 的修改
repo forall -c "git checkout -- ."
或者还可以直接简单粗暴的所有仓进行回退一次提交。
repo forall -c "git reset --hard"
然后再进行同步代码即可。如果还有其他便捷的操作欢迎补充。
3. 编译镜像与SDK
我们以rk3568
为例,编译镜像的时,只需在根目录下执行:
./build.sh --product-name rk3568
一般产品定义在源码根目录下的vendor
目录,每个产品都有自己的config.json
,里面定义了产品名称product_name
:
编译命令一般有很多参数,这里介绍几个常用的参数:
# --ccache ccache会缓存c/c++编译的编译输出,下一次在编译输入不变的情况下,直接复用缓存的产物可以大量减少编译时间
./build.sh --product-name rk3568 --ccache
# --no-prebuilt-sdk 不编译sdk文件,可以减少编译时间
./build.sh --product-name rk3568 --ccache --no-prebuilt-sdk
# --target-cpu arm64 编译64位系统,官方默认编译32位
./build.sh --product-name rk3568 --ccache --no-prebuilt-sdk --target-cpu arm64
# --fast-rebuild 编译流程主要分为:preloader->loader->gn->ninja这四个过程
# 在本地没有修改gn和产品配置相关文件的前提下,添加--fast-rebuild会直接从ninja编译开始
./build.sh --product-name rk3568 --ccache --no-prebuilt-sdk --fast-rebuild
如果仅编译SDK,可以使用以下命令,编译结果在out/sdk/packages/ohos-sdk/目录:
./build.sh --product-name ohos-sdk
4. 编译单个部件
# 单独编译 ace_engine 部件
./build.sh --product-name rk3568 --build-target ace_engine --ccache --no-prebuilt-sdk
待补充...
5. 编译单个文件
# 单独编译 libnative_appdatafwk.z.so 文件
./build.sh --product-name rk3568 --build-target foundation/distributeddatamgr/relational_store/interfaces/inner_api/appdatafwk:native_appdatafwk --ccache --no-prebuilt-sdk
待补充...
5. 编译单个img
# 单独编译 system.img 镜像
./build.sh --product-name rk3568 --build-target system_image -–ccache --no-prebuilt-sdk
待补充...
更多推荐
所有评论(0)