android cpp源码中ifdef定义变量如何在Android.mk中进行控制-手把手实战成功

devtools/2024/9/23 8:12:36/

背景:

经常芯片厂商或者终端厂商会在aosp的基础上做一些额外的定制功能,这个定制功能往往是在/BoardConfig.mk或者其他mk中添加定义一个FLAG全局变量,然后在Android.mk进行编译目标时候,会通过相关编译参数传递到代码中。这样就实现了对mk中定义的变量FLAG最后控制代码上的差异。

在这里插入图片描述

具体实战

实战环境 aosp 14 ,目标sdk_phone_x86_64

在产品mk定义相关的FLAG

添加路径
build/make/target/product/sdk_phone_x86_64.mk

在这里插入图片描述
添加了USE_TEST_MK :=true这个flag

在编译目标输出的mk判断flag,修改编译参数

前提:得目标编译是使用Android.mk,不适合Android.bp方式

这里选定frameworks/native/cmds/flatland 作为修改点

修改路径frameworks/native/cmds/flatland/Android.mk

Change-Id: I31df5abd628f74938f648a81db6cdf6d187b95ca
---cmds/flatland/Android.mk | 4 ++++cmds/flatland/Main.cpp   | 6 +++++-2 files changed, 9 insertions(+), 1 deletion(-)diff --git a/cmds/flatland/Android.mk b/cmds/flatland/Android.mk
index 754a99caf6..490890b309 100644
--- a/cmds/flatland/Android.mk
+++ b/cmds/flatland/Android.mk
@@ -10,6 +10,10 @@ LOCAL_SRC_FILES:=   \LOCAL_CFLAGS := -Wall -Werror+ifeq ($(USE_TEST_MK),true)#这里是关键,判断FLAG后修改编译参数LOCAL_CFLAGS
+    LOCAL_CFLAGS +=-DUSE_TEST_MK
+endif
+LOCAL_MODULE:= flatlandLOCAL_LICENSE_KINDS:= SPDX-license-identifier-Apache-2.0LOCAL_LICENSE_CONDITIONS:= notice
diff --git a/cmds/flatland/Main.cpp b/cmds/flatland/Main.cpp
index 6d14d568a4..8f93253851 100644
--- a/cmds/flatland/Main.cpp
+++ b/cmds/flatland/Main.cpp
@@ -738,7 +738,11 @@ int main(int argc, char** argv) {showHelp(argv[0]);exit(0);}
-
+     #ifdef USE_TEST_MK //LOCAL_CFLAGS +=-DUSE_TEST_MK定义后就会有这个def这个USE_TEST_MK
+         printf(" TEST_USE_MK ok \n");
+     #else
+        printf(" TEST_USE_MK not ok \n");
+     #endifconst auto ids = SurfaceComposerClient::getPhysicalDisplayIds();if (ids.empty()) {fprintf(stderr, "Failed to get ID for any displays.\n");
-- 
2.25.1

核心就是编译参数加上-DUSE_TEST_MK
LOCAL_CFLAGS +=-DUSE_TEST_MK
这样就可以在编译代码时候就会有#define USE_TEST_MK
如果有定义USE_TEST_MK,那么就会有如下打印:

 printf(" TEST_USE_MK ok \n");

没有就打印

 printf(" TEST_USE_MK not ok \n");

到此就把整个mk中定义FLAG和代码使用FLAG就完成了。

编译验证

常规进行env,lunch

 . build/envsetup.sh 
lunch sdk_phone_x86_64

修改定义mk后注意一定要重新lunch

这里flatland因为没有自带打入系统,所以需要单独编译一下这个模块

make flatland
在这里插入图片描述

这里等运行后,push到设备的/data/local/tmp目录

在这里插入图片描述
可以看到正常打印了:TEST_USE_MK ok

投屏专题部分:
https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg

更多framework详细代码和资料参考如下链接

hal+perfetto+surfaceflinger

https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615

更多framework假威风耗:androidframework007


http://www.ppmy.cn/devtools/102424.html

相关文章

linux------数据结构

数据结构: 1.衡量一个程序是否优秀: 1.时间复杂度: 数据量增长与程序运行时间的比例关系以函数描述称为时间渐进复杂度函数,简称时间复杂度 O(c) > O(logn) > O(n) > O(nlogn) > O(n^2) > O(n^3) > O…

go+gin+vue入门

后端框架 1、安装go、goland 2、创建空项目 3、下载要用的包:命令行输入go get -u github.com/xxxx 4、安装mysql数据库,使用navicat创建数据库。 5、按照项目框架搭建目录、文件、代码:如router、model… 6、运行测试,go run ma…

免费分享:中国1平方公里以上湖泊形状数据(附下载方法)

我国是世界上湖泊数量最多的国家之一,共有湖泊24800多个。其中面积在1平方千米以上的天然湖泊就有2800多个。湖泊分布呈现出显著的区域性差异。东部季风区,特别是长江中下游地区,分布着我国最大的淡水湖群;西部以青藏高原湖泊较为…

PMP证书含金量如何?有什么作用?

在项目管理领域,PMP(项目管理专业人士)证书一直备受关注。但很多人在考虑投入时间和精力考取该证书时,都会思考一个问题:考PMP证书有用吗?其就业前景又如何? 在项目管理领域,PMP认证…

回车键实现登录

开发框架vue element ui 方法1: 在整个输入域的父标签上添加 keyup.enter“submitFunction”(推荐)。 这个父标签可以是一级的也可以是多级的,只要是上级标签能包裹整个输入模块就行,可以是div标签也可以是form标签&a…

jenkins 开启控制台详细日志

1、开启控制台详细日志,查看真正报错原因 开启后生成流水线语句: 2、根本问题 使用jenkins再次构建,查看控制台日志 报错: 意思是在执行ssh命令的时候, /root/apps/jenkins/portal/portal-server/Dockerfile 路径下没…

【数据结构|C语言】 二分算法 二分查找[初级]

二分查找 被查找的顺序表得有序效率提高了基本思想 二分查找 - 首先将target目标值与被查找的顺序表中的中间值进行比较,若相等则查找成功; - 若不等,则要查找的target在中间元素以外的左半部分或者右半部分, - 若target大于中间值,则在右半部分继续折半; - 反之则在左半…

从外贸转行AI绘画,我在逆境中重拾生活激情

一、突如其来的变故 我叫陈浩,今年40岁,曾是一名从事外贸工作的普通职员。前两年,一场突如其来的疫情打乱了我的生活节奏。公司因疫情影响,业务大幅下滑,无奈之下,我只能接受裁员的命运。失业后的我&#x…