如何让mk中全局变量控制Android.bp的编译参数-安卓项目定制化开发

背景:

学习上一篇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详细代码,关注如下“千里马学框架”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值