android 全局定义的宏开关控制不同的feature。android 包含c++ 和 java,
java只能通过全局属性作为判断,
c++,在android.bp中需要通过go语言定义协助,可以参考
Android.bp正确姿势添加宏控制编译指南_android.bp如何实现控制逻辑-CSDN博客
下面的例子是工程中在surfaceflinger里面用到的
1. Java 使用属性控制
static final boolean mIsMMxxx = SystemProperties.getBoolean("ro.vendor.xxx.sharing", false);
2. 在和android.bp同级目录下定义surface.go ,并且在同一级android.bp中引入xxx.go,这样当前文件夹下的cpp文件就可以识别到MULTIMEDIA_XXX_SUPPORT宏定义了
services/surfaceflinger/Android.bp
bootstrap_go_package {
name: "soong-xxxparser",
pkgPath: "android/soong/xxxparser",
deps: [
"blueprint",
"blueprint-pathtools",
"soong",
"soong-android",
"soong-cc",
"soong-genrule",
],
srcs: [
"surfaceflinger.go",
],
pluginFor: ["soong_build"],
}
xxxparser_defaults {
name: "xxxparser_defaults"
}
cc_defaults {
name: "libsurfaceflinger_production_defaults",
defaults: ["libsurfaceflinger_defaults",
"xxxparser_defaults",
],
Surfaceflinger.go
package xxxparser
import (
"android/soong/android"
"android/soong/cc"
"fmt"
)
func init() {
android.RegisterModuleType("xxxparser_defaults", xxxParserDefaultsFactory)
}
func xxxParserDefaultsFactory() (android.Module) {
module := cc.DefaultsFactory()
android.AddLoadHook(module, xxxParserDefaults)
return module
}
func xxxParserDefaults(ctx android.LoadHookContext) {
type props struct {
Cflags []string
}
p := &props{}
p.Cflags = globalDefaults(ctx)
ctx.AppendProperties(p)
}
func globalDefaults(ctx android.BaseContext) ([]string) {
var cppflags []string
fmt.Println("MULTIMEDIA_XXX_SUPPORT:", ctx.DeviceConfig().multimedia_xxx_support())
if ctx.DeviceConfig().multimedia_xxx_support() == "yes" {
cppflags = append(cppflags,"-DMULTIMEDIA_XXX_SUPPORT")
}
return cppflags
}
3. 全局定义开关
ProjectConfig.mk
MULTIMEDIA_XXX_SUPPORT=yes
device/xxx/device.mk
宏定义通过系统属性prop管理java文件,具体宏定义需要通过go语言定义去管理c++
ifeq ($(strip $(MULTIMEDIA_XXX_SUPPORT)),yes)
PRODUCT_PROPERTY_OVERRIDES += \
ro.vendor.multimedia.xxx=true
endif
4. 变量的值作为字符串添加到 JSON 对象中,键名为 multimedia_xxx_support。
$(call add_json_str, multimedia_xxx_support, $(MULTIMEDIA_XXX_SUPPORT))
5. 在go配置中增加multimedia_xxx_support方法,通过该方法获取deviceConfig类型的variale变量值multimedia_xxx_support
build/soong/android/config.go
func (c *deviceConfig) multimedia_xxx_support() string {
return String(c.config.productVariables.multimedia_xxx_support)
}
Build/soong/android/variable.go
multimedia_xxx_support *string `json:",omitempty"`