Android.bp 添加宏开关

本文详细介绍了如何将Android.mk中的宏开关转换到Android.bp,并讨论了在无流控制和有流控制情况下处理策略,包括使用Go语言控制条件编译的过程。还提到Android系统编译系统的变迁及其带来的挑战和解决方案。

以前在android系统控制编译的Android.mk不是纯文本形式,里面还有流控制,而Android.bp是类似JSON的纯文本形式. 对于Android.mk里面流控制部分,在Android.bp里要借助使用go语言文件去进行控制.
Android在7.0引入 ninja 编译系统,8.0引入Android.bp替代Android.mk,9.0强制使用Android.bp作为编译配置。
Google称之为soong, 具体可以参考:
https://android.googlesource.com/platform/build/soong

一、无流控制的宏开关

1 在已有的Android.bp中添加宏

首先找要添加的Android.bp文件中是否有cppflags或者’cflags’,基本上都是有的,例如:

cc_defaults {
   
   
    name: "fs_mgr_defaults",
    defaults: ["BBB"],// new add
    sanitize: {
   
   
        misc_undefined: ["integer"],
    },
    local_include_dirs: ["include/"],
    cppflags: ["-Werror", "-DMTK_FSTAB_FLAGS"],
}

例如要添加的宏:

LOCAL_CFLAGS += -DTEST1
LOCAL_CFLAGS += -DTEST2=1

将上面的宏补在原有的’cc_defaults’里面的’cppflags’后面:

cc_defaults {
   
   
    name: "fs_mgr_defaults",
    sanitize: {
   
   
        misc_undefined: ["integer"],
    },
    local_include_dirs: ["include/"],
    cppflags: ["-Werror",
               "-DMTK_FSTAB_FLAGS",
               "-DTEST1",
               "-DTEST2=1"],
}

1.2 androidmk命令
如果要转化的Android.mk内容没有流控制,可以使用Androidmk命令直接转换. 该命令在:out/soong/host/linux-x86/bin/androidmk,使用方法:

androidmk Android.mk > Android.bp

如果要转换的Android.mk里面没有复杂结构,就可以转换成功,如果报错就可能有复杂结构.需要手动转换.

二、有流控制的宏开关

在Android.mk中添加的宏开关:

ifeq ($(LANTONDA_S51NM_PROJECT_SUPPORT),yes)
LOCAL_CFLAGS += -DS51NM_PROJECT_SUPPORT
endif

如果要将以上的宏开关添加到Android.bp中去要通过使用go语言书写一个新文件。

Android.bp实际上是一个纯粹的json配置文件,没有条件、分支等流程结构,因此即便使用自带的androidmk工具想要将Android.mk快速转成Android.bp,也会发现流程语句并不起效果。为了解决此问题,google将条件编译进行分家,Android.bp负责纯粹配置,引入Go文件负责进行流程结构判断。

使用Android.bp编译时, 目前还存在一些问题:
1.对C/C++代码, 如果需要使用宏开关时, 由于android整个编译系统还没完全切换过来, 导致 在项目mk文件定义的开关, 还不能生效.
2.对于条件编译, 需要添加go文件进行控制.

对于问题1, 一是通过export命令, 把相应的开关设置到环境变量, go文件就能读取到了.
二是, 把开关集中放到某一个文件中, 然后在go文件中直接读取这个文件.
对于问题2, 下面会通过例子给出一个说明.

1. 法一:

实际测试:如果ProjectConfig.mk中,设置LANTONDA_S51NM_PROJECT_SUPPORT = yes,在frameworks_base_core_jni.go中打印LANTONDA_S51NM_PROJECT_SUPPORT:false,即宏不能传过来。如果设置export LANTONDA_S51NM_PROJECT_SUPPORT=yes,在frameworks_base_core_jni.go中打印LANTONDA_S51NM_PROJECT_SUPPORT:true,即宏可以传过来。而且在vc_cfg_data.h中也能正常使用宏。

如果在frameworks/base/core/jni目录下添加,方法如下:

diff --git a/frameworks/base/core/jni/Android.bp b/frameworks/base/core/jni/Android.bp
index 0e31ab9..aee5bcf 100644
--- a/frameworks/base/core/jni/Android.bp
+++ b/frameworks/base/core/jni/Android.bp
@@ -1,3 +1,26 @@
+// Android.bp condition compilation start
+bootstrap_go_package {
   
   
+    // name and pkgPath need to  according to your module
+    name: "soong-frameworks_base_core_jni",
+    pkgPath: "android/soong/frameworks_base_core_jni",
+    deps: [
+        "blueprint",
+        "blueprint-pathtools",
+        "soong",
+        "soong-android",
+        "soong-cc",
+        "soong-genrule",
+    ],
+    srcs: [
+          "frameworks_base_core_jni.go", // include new add .go file
+    ],
+    pluginFor: ["soong_build"],
+}
+
+frameworks_base_core_jni_defaults {
   
    // frameworks_base_core_jni_defaults is a module
+    name: 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值