背景:
学习上一篇Android.mk全局变量控制cpp文件blog:
android cpp源码中ifdef定义变量如何在Android.mk中进行控制-手把手实战成功
之后很多学员朋友反应,现在Android.mk在aosp中官方控制的编译的项目太少了,是否有可以支持Android.bp的项目。
其实这个调研了一下发现Androi.bp中同样有相关的cflags的标准可以自由配置:
本质难度在于怎么把Android.mk的FLAG变量传递到Android,bp中,这样bp才可以进行差异设置cflags。
源码查询方法
这里是通过去相关路径查一下google相关提交是否有相关需求刚好找到个类似的
路径:build/make
进行git log看到如下提交
Author: SzuWei Lin <szuweilin@google.com> 2023-05-15 15:38:58
Committer: SzuWei Lin <szuweilin@google.com> 2023-05-17 15:35:59
Parent: e4783d4b7a5e15f10e99a6042bd85010d3dd992a (Update Security String to 2023-07-05 am: d6c119bfaa)
Child: cd3752d1638006d4d63eeb0bddb15e3c0157249f (Merge "Support dynamic 64-bit drmserver" into udc-dev)
Branches: remotes/aosp/android14-s2-release, remotes/m/android-14.0.0_r15^{} and many more (22)
Follows: android-u-beta-1-gpl
Precedes: many (31)
Support dynamic 64-bit drmserver
64-bit GSI requires support both 64_32-bit and 64-bit devices at
the same time. Add a new variable TARGET_DYNAMIC_64_32_DRMSERVER
to put drmserver_dynamic.rc into GSI. Which starts 64-bit
drmserver if ro.zygote is zygote64. Otherwise, it keeps the
original behavior to start 32-bit drmserver.
Bug: 282603373
Test: make gsi_arm64-user; Check system/etc/init
Test: make gsi_arm-user; Check systen/etc/init
Change-Id: I874cee00a066086f565e044549ad40c6ab5d62b0
Merged-In: I874cee00a066086f565e044549ad40c6ab5d62b0
提交详情:
大概可以看出是mk变量通过call add_soong_config_var来设置到Android.bp中
开始实战
1、在自己的目标product的mk中加入全局变量,这个和原来没啥差别
定义了这个BP_FLAG_TEST :=true全局变量
2、core/android_soong_config_vars.mk 加入相关的设置
添加
$(call add_soong_config_var,ANDROID,BP_FLAG_TEST)
把BP_FLAG_TEST变量设置到soong config中,这里其实就是mk可以和bp沟通的最重要桥梁
3、到编译native的执行程序端设置
这里找个简单一点的项目screenrecord来做示例,Android.bp的项目很多,大家自己进行。
frameworks/av/cmds/screenrecord/Android.bp
3.1 定义一个soong_config_module_type
soong_config_module_type {
name: "screenrecord_cc_binary",
module_type: "cc_binary",
config_namespace: "ANDROID",
bool_variables: ["BP_FLAG_TEST"],
properties: [
"cflags",
],
}
注意这里我们config主要是给cc_binary编译二进制时候使用的,相关格式按上面编写。
3.2 同时把cc_binary这个改成上面定义的type:screenrecord_cc_binary
3.3 添加soong_config_variables,及设置相关cflags
soong_config_variables: {
BP_FLAG_TEST: {
cflags: [
"-DBP_FLAG_TEST"
],
},
},
完整bp修改patch如下:
diff --git a/cmds/screenrecord/Android.bp b/cmds/screenrecord/Android.bp
index d0b3ce074f..1395366050 100644
--- a/cmds/screenrecord/Android.bp
+++ b/cmds/screenrecord/Android.bp
@@ -20,8 +20,17 @@ package {
// SPDX-license-identifier-Apache-2.0
default_applicable_licenses: ["frameworks_av_license"],
}
+soong_config_module_type {
+ name: "screenrecord_cc_binary",
+ module_type: "cc_binary",
+ config_namespace: "ANDROID",
+ bool_variables: ["BP_FLAG_TEST"],
+ properties: [
+ "cflags",
+ ],
+}
-cc_binary {
+screenrecord_cc_binary {
name: "screenrecord",
srcs: [
@@ -60,5 +69,12 @@ cc_binary {
"-Wall",
"-Wno-multichar",
//"-UNDEBUG",
- ]
+ ],
+ soong_config_variables: {
+ BP_FLAG_TEST: {
+ cflags: [
+ "-DBP_FLAG_TEST"
+ ],
+ },
+ },
}
3.4 进行cpp代表修改
加入ifdef就行
#ifdef BP_FLAG_TEST
printf("BP_FLAG_TEST define ok \n");
#else
printf("BP_FLAG_TEST define not ok \n");
#endif
到此就修改完成,测试就只需要运行screenrecord看看输出的BP_FLAG_TEST define是不是ok
测试验证:
常规进行env,lunch
. build/envsetup.sh
lunch sdk_phone_x86_64
make
emulator
注意:修改定义mk后注意一定要重新lunch
验证成果:
也可以把mk的BP_FLAG_TEST相关标志变成false,再进行编译验证
运行结果如下:
投屏专题部分:
https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg
更多framework详细代码,关注如下“千里马学框架”