以前在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:

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

被折叠的 条评论
为什么被折叠?



