我这里以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. notapai++ 使用小技巧

    alt+鼠标右键 建 实现整体添加字符 例: 25001510153394032 25001510153394034 25001510153393963 25001510153392080 25001 ...

  2. llinux文件相关指令

    一---导读 首先我们来看这样一个小案例,假设张三要出差,按照 这样的路线进行 北京->上海,之后回到北京.再按照北京->天津->石家庄这样的路线进行出差(北京是根据地).假设现在张 ...

  3. 万字长文爆肝 DNS 协议!

    试想一个问题,我们人类可以有多少种识别自己的方式?可以通过身份证来识别,可以通过社保卡号来识别,也可以通过驾驶证来识别,尽管我们有多种识别方式,但在特定的环境下,某种识别方法可能比另一种方法更为适合. ...

  4. ctfhub技能树—sql注入—时间盲注

    打开靶机 查看页面信息 测试时间盲注 可以看到在执行命令后会有一定时间的等待,确定为时间盲注 直接上脚本 1 #! /usr/bin/env python 2 # _*_ coding:utf-8 _ ...

  5. Zabbix监控虚拟机服务-告警与自动恢复

    今天稍微空闲,使用下zabbix的5.0版本,目前生产环境是4.x版本 今天就只实现一个目的:监控任意一个服务(示例中监控的是docker.service),如果服务挂了,自动给恢复,先看一个动图 搭 ...

  6. vue中computed/method/watch的区别

    摘要:本文通过官方文档结合源码来分析computed/method/watch的区别. Tips:本文分析的源码版本是v2.6.11,文章中牵涉到vue响应式系统原理部分,如果不是很了解,建议先阅读上 ...

  7. 庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境

    庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境 一.介绍 说起微服务架构来,有一个环节是少不了的,那就是CI/CD持续集成的环境.当然,搭建CI/CD环境的工具很多, ...

  8. response返回特性

    1. response 返回特性 r=requests.get("http://www.baidu.com")print(r.text) #打印返回正文print(r.status ...

  9. js 前端词典对象的属性和值读取

    通常服务端返回比较奇葩的数据对象,不知道该怎么将这个对象转换为可用实体,想了很久,突发奇想想到了这么个方法. 需求是这样:企业有多个产品,产品有分为很几个种类.服务端有获取产品的接口,和单独获取产品种 ...

  10. 最佳的思维导图生成工具——markmap 使用教程

    前言 相信很多程序员朋友都有在用 Markdown 吧,我是大三找实习工作的时候接触到的,简历就是用 Markdown 写的. Markdown 的好处是专注码字的同时还能兼顾排版,不用像 word ...