我这里以3518的开发板为例进行讲解,3516的也是通用的。

下面是之前全量编译的脚本

python build.py ipcamera_hi3518ev300 -b debug

HarmonyOS最初只能支持全量编译的方式,这种方式最大的弊端就是我们在系统源码上开发一个用户态程序,每次都需要全量编译好系统之后进行镜像的烧录,每次编译加烧录少说需要15分钟时间,对于我们开发测试及其消耗时间,试想下每次就是想加入一行log调试下这么费劲会多么麻烦。

还好,后面随着HarmonyOS的源码更新,开始支持用户态程序的单模块编译了,编译的脚本如下:

python build.py ipcamera_hi3518ev300 -T //applications/sample/camera/app:camera_app

这里以单独编译HarmonyOS自带的HelloWorld项目为例,这个-T参数非常重要,它就是代表单模块编译的,//applications/sample/camera/app只的要编译的模块的绝对路径,camera_app为要编译的模块名称。

这里先结合HarmonyOS源码讲下-T参数的由来,如果各位是通过下载压缩包的方式下载的官方的code1.0的源码压缩包解压的话,肯定是不支持该参数的,也就是说不支持单模块编译。下面来看下该参数是在什么时候更新到源码库的吧,首先我们去gitee上找到编译构建框架所在的代码仓,如下图

然后,我们查看该仓库下的commit记录,然后就可以找到下面的关键记录

看commit的日志已经很明确了这里加入了单模块构建,下面我们打开该commit记录仔细看看具体修改了什么

看到这里,大家就知道这个-T参数怎么来的了吧,为了让你的代码支持单模块编译,赶紧去git更新下代码吧,如果下载code1.0离线代码的也不用着急,可以直接把build仓下的最新代码全部下载下来替换之前的build仓即可。

下面再来讲讲前面单模块编译最后面的那个模块名称camera_app怎么来的吧,关于用户态程序如何编译的,建议大家好好看看官方源码的“用户程序框架”仓下的介绍,绝对会受益良多。我这里挑重点讲,首先是在//build/lite/product/ipcamera_hi3518ev300.json这个文件中进行了用户程序编译的相关配置,可以理解为一个配置清单,告诉系统哪些用户态程序需要参与编译。我们可以在里面找到如下配置

    {
"name": "applications",
"component": [
{ "name": "camera", "dir": "//applications/sample/camera/app:camera_app", "features":[] },
{ "name": "communication", "dir": "//applications/sample/camera/communication:sample", "features":[] }
]
},

看到dir后面的配置就自然会联想到我们之前-T后面的参数为何要使用它了吧,那么最后的冒号后面的camera_app参数又从哪里来呢?

那么这里首先要对linux下的c语言编译有一定了解才行了,大家如果看不懂后面的可以先去补习下Makefile和gn的知识。

这里每个用户态程序都是通过gn文件配置进行编译的,我们先在源码目录下找到这个模块路径,如下图

哈哈,大家可能会疑惑我咋是用idea在看代码,因为本人电脑没安装source insight,加上本人最精通的技术是java和Android,所以使用idea习惯了,一个快速检索功能足够我阅读系统源码了。

这里我们看到了BUILD.gn脚本,打开瞅瞅,可以看到如下关键代码,

lite_component("camera_app") {
target_type = "executable" features = [
":hello_world",
]
}

之前调用的参数模块名称camera_app就是在这里配置的。

下面简单列举一个gn的一个标准的helloworld用法,如下

executable("hello_world") {
sources = [
"hello_world.c",
]
}

后面我在讲如何创建一个独立的用户态程序会编写这个gn文件和json文件。本篇已经够长了,就放在下一篇博客讲解了。

看系统源码确实还是很有意思的,只奈工作太忙没有时间看。。。

作者:软通夏德旺
想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

HarmonyOS单模块编译与源码导读的更多相关文章

  1. 【转】模块编译Android源码方法

    原文网址:http://blog.csdn.net/androidlover1991/article/details/17014055 实际开发中,并不需要每次都编译所有源代码,只需要编译自己修改的模 ...

  2. Windows编译Nginx源码

    Windows下的Nginx战役,人不作就不会死!就像是拿着麦当劳的优惠券去买肯德基一样,别扭啊 Nginx是一款轻量级的Web 服务器.反向代理服务器.邮件服务器等等集一大串荣誉于一身的大牌人物!他 ...

  3. 重新编译jdk源码,启用debug信息

    我有一个不知道是好还是不好的习惯,搞不懂的一些玩意儿,喜欢调试然后单步执行看这玩意儿到底是怎么运行的. 今天看到正则表达式的时候,appendReplacement()这个方法怎么也看不明白它是怎么工 ...

  4. (转载)Linux如何编译安装源码包软件

    一.什么是源码包软件: 顾名思义,源码包就是源代码的可见的软件包,基于Linux和BSD系统的软件最常见:在国内源可见的软件几乎绝迹:大多开源软件都是国外出品:在国内较为出名的开源软件有fcitx;l ...

  5. 用VC编译lua源码,生成lua语言的解释器和编译器

    用VC编译lua源码,生成lua语言的解释器和编译器 1.去网址下载源码 http://www.lua.org/download.html 2.装一个VC++,我用的是VC6.0 3.接下来我们开始编 ...

  6. Android反编译(一)之反编译JAVA源码

    Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具  dex2jar   http://code.go ...

  7. [原]在win上编译 subversion 源码实践Tonyfield的专栏

    (百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...

  8. 在Mac mini上编译Android源码

    参考文章 1.Android 6.0 源代码编译实践 2.编译Android源码致命错误解决方案 实践过程 1.Mac下安装Ubuntu双系统 (1)Ubuntu版本:Ubuntu 15.10 注:实 ...

  9. 用vs2013编译lua源码方法(一)

    用vs2013编译lua源码方法 来源:网络    编辑:admin 1.下载lua源码:lua-5.2.3.tar.gz,解压 2.用vs2013建立一个win32工程: 1)下载后解压到一个目录下 ...

随机推荐

  1. Tensorflow创建已知分布的张量

    一.随机数 tf.random(num) 随机产生返回0----num-1的数 二.图变量 tf.Variable.init(initial_value, trainable=True, collec ...

  2. 为Github仓库添加Github Actions实现持续集成: Android apk自动编译发布以及github pages同步推送coding.net

    内容转载自我的博客 目录 说明 1. 编写Android项目的CI配置文件 2. 编写Jekyll项目的CI配置文件 2.1 配置coding.net 2.2 配置github 2.3 自动部署到co ...

  3. navicat for mysql 破解版

    Navicat for MySQL下载地址:Navicat for MySQL 软件和破解程序 第1步.安装Navicat软件,最后点击完成 第2步.安装成功之后还要进行破解.点击patchNavic ...

  4. C语言指针的大小

    C语言指针的大小 今天看到一道题目是这样的,写出以下变量在32位设备上的大小(占多少个字节) 然后其中就有一些指针类型的数据,那么我们知道在C语言中指针的大小都是一样的,不管是有数据类型的还是void ...

  5. 树莓派-4WD智能小车操作小结

    树莓派-4WD智能小车操作小结 树莓派4B-4WD智能小车,双层结构,第一层结构为:小车扩展板(底层)+树莓派主板,通过铜柱隔离固定,小车扩展板相当于计算机的外设扩展板:上面一层为第二层,是三个舵机承 ...

  6. 日常采坑:.NET Core SDK版本问题

    1..NetCore SDK版本问题 .NetCore3.1 webapi 部署linux,遇到一个坑,开启的目录浏览功能失效,几番尝试发现是版本问题.本地sdk版本与linux安装的sdk版本不对应 ...

  7. 用其他主机docker login登录Harbor仓库报错

    做微服务的时候,我准备把编译好的jar包,部署到我的Harbor仓库上,却登录不上去,出现以下报错: [root@k8s-master ~]# docker login 192.168.30.24Us ...

  8. oracle move表空间(分区表,索引)

    1.修改分区表分区表空间 SELECT 'ALTER TABLE ' || table_owner || '.' || TABLE_NAME || ' MOVE PARTITION ' || PART ...

  9. CVE-2018-1273 Spring Data Commons 远程命令执行漏洞复现

    一.漏洞描述 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架.Spring Data ...

  10. vue href url地址写法