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

220 阅读4分钟

背景:

学习上一篇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,再进行编译验证

在这里插入图片描述运行结果如下: 在这里插入图片描述 投屏专题部分: mp.weixin.qq.com/s/IGm6VHMiA…

更多framework详细代码,关注公众号“千里马学框架”