1.##:用于拼接操作 实例: #include<stdio.h> #include<iostream> #define CONCAT(parm1,parm2)...
使用一些宏跟踪调试 A N S I标准说明了五个预定义的宏名。...记住编译程序也许还提供其它预定义的宏名。 _ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论,这里讨论其余的宏名。..._ D AT E _宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。 源代码翻译到目标代码的时间作为串包含在_ T I M E _中。串形式为时:分:秒。...可以定义宏,例如: 当定义了_DEBUG,输出数据信息和所在文件所在行 1#ifdef _DEBUG 2#define DEBUGMSG(msg,date) printf(msg);printf(“%d...宏定义防止使用时错误用小括号包含。
Android.bp 文件格式 Android.bp 的设计非常简单,没有条件判断或控制流语句。在 Go 语言中编写的构建逻辑没有任何复杂度。...模块 模块在 Android.bp 文件中以一个模块类型开始,后面跟着一组属性,以名值对(name: value)表示。...注释 Android.bp 文件可以使用 C 风格的多行 /* */ 和 C++ 风格的单行 // 注释。...使用以下命令来递归格式化当前目录中的所有 Android.bp 文件: bpfmt -w。...构建逻辑 构建逻辑使用 Go 语言编写,并使用 blueprint 框架。构建逻辑接收模块定义,并利用反射和构建规则解析为 Go 数据结构。
文章目录 一、主函数逻辑结构 1、启动无限循环 2、接收用户操作值 3、主函数代码示例 二、宏定义声明 三、显示操作菜单 一、主函数逻辑结构 ---- 在 main 函数中 , 启动一个无限循环 ,...显示用户输入菜单选项 , 提醒用户输入操作值 ; 2、接收用户操作值 接收用户操作值 : 然后根据用户的不同输入 , 进行不同的操作 ; 用户输入 0 则退出程序 ; 用户输入 1 向配置文件...写出 / 更新 键值对数据 ; 用户输入 2 从配置文件 中 根据 键 查询 键值对数据 ; 3、主函数代码示例 主函数代码示例 : /** * @brief main 主函数入口...n"); break; } } // 执行完毕会后暂停 system("pause"); return ; } 二、宏定义声明...---- 在程序中 , 常用的值 , 推荐使用宏定义进行声明 , 这样可以避免魔法数出现 ; // 配置文件名称 #define CONFIG_FILE_NAME "D:/File/config.ini
aosp”是 Android 源码中已经定义好的一种产品,是为模拟器而设置的。而编译类型会影响最终系统中包含的模块。...C++文件执行grep(即grep的时候只搜寻C/C++文件类型,注意这里也包括.h文件类型) jgrep 对Java文件执行grep(即grep的时候只搜寻Java文件类型) resgrep 在所有res.../out/dist目录下,这个命令在实际中用的比较少 make all 编译所有内容,不管当前产品的定义中是否会包含,官方解释如下:builds everything make droid does,...转换成Android.bp,但是只针对没有分支、循环等流程控制的Android.mk才有效,如果对于有控制流的就必须手动了具体可以想见博客Android.bp正确姿势添加宏控制编译指南 通过Blueprint...2.2 Kati简介 Kati是专为Android开发的一个基于Golang和C++的工具,主要功能是把Android中的Android.mk文件转换成 Ninja文件。
进行 mk 文件和 ninja 转换的工具叫做 kati,C++ 实现的版本为 ckati,在 Android 10 中使用的是预编译的 ckati。...搜了一下网上的方法,有人给出方法,修改 build/core/config.mk 中的 FIND_LEAVES_EXCLUDES 变量定义。...没办法,还是从 Soong 源码入手。...在解决问题的过程中,中科院软件所的汪辰写的一系列文章对我帮助很大,加深了我对 Android 构建系统的理解。...对了,在折腾 Android 构建系统时,我又快速入门了一门 Go 语言,但我并没有打算深入研究它,后续还是会继续研究 RUST 语言。
至今还是有很多人觉得C语言依然是编程行业最基础的东西,毕竟现在很多上了年龄的人在当时大学阶段初级的入门编程语言就是用的C语言,在很多人心中都有个编程梦,有些甚至年过半百了还琢磨自己这辈子没有玩编程而遗憾...,也有很多上了年纪的人拿起C语言的书籍一步步跟着网络上的教材进行学习,随着编程语言在国内的普及,编程语言的生态已经发生了很大的变化,特别是高级语言的普及化,倒是显得很多底层语言在编程领域的影响力在下降,...但是其重要性还是在加强,就拿C语言来讲是很多编程语言的基础而存在,主流很多编程语言的底层实现就是利用的C语言或者汇编来完成,C语言在编程领域的角色在发生变化,在早期一个很简单的功能模块可能都需要C语言实现很长时间才能稳定...最好的学习编程的方式就是在掌握一定理论的基础上再去实践能够取得意想不到的效果。 ?...对于掌握编程的理论这个阶段对于大部分学习者来讲可能都能克服,最关键的实践对于绝大部分的自学者来讲就是一种极大的挑战,之所以存在挑战找不到匹配自己能力的实践机会,即使专门的培训机构也很难找到匹配的实践项目,这在编程属于混沌阶段一种思维在艰难认知的过程中
kati kati是谷歌专门为了Android而开发的一个小项目,基于Golang和C++。 目的是把Android中的Makefile,转换成Ninja文件。...Blueprint负责解析Android.bp文件内容,Blueprint类似一个处理相关语法的库文件,Soong则是定义具体如何处理相应的语法以及命令实现。...通俗来讲就是Soong借助于Blueprint定义的Android.bp语法,完成Android.bp的解析,最终转换成Ninja文件。 Makefile文件会通过kati转换为Ninja文件。...1.初始化环境 在AOSP的根目录,输入如下的命令: source build/envsetup.sh // 编译前删除build文件夹A make clobber 使用 build目录中的envsetup.sh...userdata.img:用户镜像,是Android系统中存放用户数据的,通过init.c进行解析并mount挂载到/data目录下。
对于Ninja,最初的印象是用在了Chromium open source code的编译中,在chromium的编译环境中,使用ninja -C out/Default chrome命令,就可以利用源码编译出...,Ninja就是汇编语言 主要有两个特点: 可以通过其他高级的编译系统生成其输入文件; 它的设计就是为了更快的编译; 使用Kati把makefile转换成Ninja files,然后用Ninja编译 在不久的将来...将来需要写Blueprint文件(Android.bp),转换为Android.soong.mk(也可以直接写),然后转换为Ninja文件(build.ninja)然后用Ninja编译。...如果Android.bp的同级目录下有Android.soong.mk也会被include ckati可执行文件的生成 在android系统中,目前还未完全切换到Ninja编译,编译的入口仍然是make...$(shell rm -f $(OUT_DIR)/ninja_build) endif 在include build/core/ninja.mk的语句执行后,我们就可以看到真正定义ninja的地方了。
Android.bp是用来替换Android.mk的配置文件,它使用Blueprint框架来解析。Blueprint是生成、解析Android.bp的工具,是Soong的一部分。...Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义,最终转换成Ninja文件。...1、模块 定义一个模块从模块的类型开始,模块有不同的类型,如下例子中的“cc_binary”,模块包含一些属性格式为“property-name: property-value”,其中name属性必须指定...工具目录为:build/blueprint/bpfmt/ 在当前目录下执行以下命令: 7、Android.mk转为Android.bp androidmk工具可以把mk文件转换为bp文件,但一些复杂的用法和自定义的规则需要手动转换...9、支持预编译类型 Android.bp可以支持5种预编译类型,如下图所示: ? 10、模块名称解析 soong提供了可以在不同目录中配置相同的模块名称,只要每个模块的名称在不同的命令空间中声明。
变量是不可变的,但有一个例外情况:可以使用+=赋值将变量附加到别处,但只能在引用它们之前附加 Android.bp文件可能包含顶级变量赋值: // 定义变量 gzip_srcs = ["src/test...注释 Android.bp因为本质上是go语言,所以文件可以包含C样式的多行/* */注释以及C++样式的单行//注释 ---- 2.4.2.6....条件语句 Soong不支持Android.bp文件中的条件语句。 但是,编译规则中需要条件语句的复杂问题将在Go在这种语言中,您可以使用高级语言功能,并且可以跟踪条件语句引入的隐式依赖项)中处理。...每个 Soong 模块都会被视为处于 Android.bp(位于当前目录或最近的父级目录中的 soong_namespace 文件内)定义的命名空间中。...在构建相应产品时,应将源路径下的文件复制到目标路径。config/makefile 中定义了针对复制步骤的规则 PRODUCT_DEVICE 工业设计的名称。
前言 SQLite是移动端常用的数据库,我们就来简单介绍一下SQLite在Android上的体系结构。...h ├── OWNERS ├── README.version └── UPDATE-SOURCE.bash 1.1 libsqlite3_android 增加了一些手机号码比较的功能在sqlite3中,...简单来说就是Android在orig目录下的sqlite3代码基础上加了一些定制化的功能,可以查看Android.patch,查看修改点。...for x in orig/*; do diff -u -d $x ${x#orig/}; done) > Android.patch 1.3 小结 会有人说,原来sqlite3实现那么简单,就这么4个文件...总结 我们可以想办法将一部分WCDB或者SQLCipher的功能移植到Android上的SQLite,来提升SQLite的读写速度,提升手机性能。
1)eBPF bytecode:将C语言写的钩子代码,通过clang编译成二进制字节码,通过程序加载到内核中,钩子触发后在kernel "虚拟机"中运行。...1. android系统对eBPF的编译支持 目前android编译系统已经对eBPF进行了集成,通过android.bp就能很方便的在android源代码中编译eBPF的字节码。...函数定义在include/trace/events/syscalls.h文件中 ? 1)sys_enter的trace参数是id 和长度为6的数组。...1)定义map保存系统调用统计信息,在DEFINE_BPF_MAP声明map的同时,也会生成删,改,查的宏函数,例如本例中会生成如下函数 bpf_pid_syscall_map_lookup_elem...3)将fd包装成BpfMap,android在BpfMap.h中定义了很多方便的函数。 4)遍历map回调函数。
前言 函数调用要开辟栈帧,如果是一些稍微复杂的递归问题或者排序问题(含有交换比较多,例如快排)就会导致开辟的函数栈帧的数量太多了,那么有没有什么办法可以优化一下这个函数栈帧呢?...---- 一、宏 对于前言中的问题,C语言给出的办法是——宏。 宏定义的函数,在预处理阶段就会将函数与程序中对应的语句进行替换,进而优化了多次调用函数所开辟的函数栈帧。...既然C语言中有优化这个问题的方法,那么我们的C++为什么还要创造一种新方法呢? 我们先来回顾一下宏的优缺点: 1.宏的优缺点 (1)优点 ①增强代码的复用性。 ②提高性能。...2.C++中替代宏的方法 由于宏有这三个缺点,C++中给出了替代宏的方法: (1)常量定义换用const enum (2)短小函数定义换用内联函数 其中的const enum是C语言中就有的,内联函数却是...(3)内联函数不建议声明和定义分离 内联函数的声明和定义分离会导致链接错误,所以使用内联函数就直接在该源文件中定义即可。 为什么内联函数不能声明和定义分离?
Soong 在 Android 中扮演了这个角色,并直接调用 rustc。这是基于如下原因: 在 Cargo 中,C 语言的依赖项,通过 build.rs 脚本,以 ad-hoc 模式处理。...Soong 已经提供了一种构建 C 语言库,并将其定义为依赖项的机制。而 Android 谨慎地控制编译器版本和全局编译标记,以确保库是以特定的方式构建的。...依靠 Cargo,将引入第二个 non-Soong 机制,以定义/构建 C 语言库,该机制不会受到 Soong 中精心选择的编译控制的限制。...Android 同样避免了其它语言的构建脚本,而是简单地使用它们,以告知 Android.bp 文件的结构。 为什么支持过程宏(proc_macro),而非构建脚本(build.rs)?...过程宏(proc_macro)也是一种语言特性,而不是构建代码的方法。 在 Android 构建系统中,编译器插件支持也有优先权。例如,参阅 Soong 构建系统中的模块 java_plugin。
) case ONE : … break; case TWO : … break; case THREE : … break; } 请注意,如果您尝试访问枚举中大于枚举元素数的索引(例如,在上面的示例中,...我将表达式Index.values()[getIndex()]封装到类似于valueOf(int index)的枚举方法中,类似于默认的valueOf(String s).然后,您还可以在那里处理有效的数组索引检查
发布服务保存在SystemServer中,可以看到这个服务对应的接口是 IFingerprintService.Stub 可以看到是在用了个线程池在调用这个run方法,接下来去看看这个Runnable...首先需要讲下Android.bp文件: Android.bp的出现就是为了替换Android.mk文件,随着Android越来越庞大,module越来越多,编译时间也越来越长,而使用ninja在编译的并发处理上较...Ninja的配置文件就是Android.bp,Android系统使用Blueprint和Soong工具来解析Android.bp转换生成ninja文件 详细内容及自定义文件可参考这篇博客 Android.bp...:编译成可执行文件,类似于Android.mk中的BUILD_EXECUTABLE name :编译出的模块的名称,类似于Android.mk中的LOCAL_MODULE srcs:源文件,类似于Android.mk...中的LOCAL_SRC_FILES local_include_dirs:指定路径查找头文件,类似于Android.mk中的LOCAL_C_INCLUDES shared_libs:编译所依赖的动态库
HIDL制作步骤 定义接口文件 使用工具,根据接口文件生成代码 完善接口函数 编译 HIDL 接口文件定义 进入hardware/interfaces/目录下建立新的接口文件....IBase follow. }; // FIXME: most likely delete, this is only for passthrough implementations extern "C"...// namespace android #endif // ANDROID_HARDWARE_XIAOQING_V1_0_XIAOQING_H 去掉注释.采用直通模式. // extern "C"...defaultPassthroughServiceImplementation; int main() { return defaultPassthroughServiceImplementation(); } 在Android.bp...中添加对服务器的编译: vim hardware/interfaces/xiaoqing/1.0/default/Android.bp Android.bp中添加: cc_binary { name
如果一个inline函数会在多个源文件中被用到,那么必须把它定义在头文件中。...编译源文件为汇编代码或者反汇编查看有没有相关的函数调用call,如果没有就是被inline了。具体可以参考here。 (7)C++类成员函数定义在类体内为什么不会报重定义错误?...类成员函数定义在类体内,并随着类的定义放在头文件中,当被不同的源文件包含,那么每个源文件都应该包含了类成员函数的实体,为何在链接的过程中不会报函数的重定义错误呢?...6.小结 可以将内联理解为C++中对于函数专有的宏,对于C的函数宏的一种改进。对于常量宏,C++提供const替代;而对于函数宏,C++提供的方案则是inline。...[6]C语言inline详细讲解 [7]C++中的作用域与生命周期 [8]内联函数到底有没有被嵌入到调用处呢?
领取专属 10元无门槛券
手把手带您无忧上云