Android的makefile越来越多的开始使用Android .bp,它的好处是编译速度快,计算依赖比Android.mk快速的多。

Android编译系统

但是,Android.bp添加条件编译是很麻烦的,需要借助go来实现。

无条件添加宏

Android.bp直接添加宏非常简单,只需要在cflags后面添加对应的宏就OK了。

1
2
3
4
5
 cflags: ["-DXXX"] + [ // ANDROIDMK TRANSLATION ERROR: endif from unsupported contitional
    // endif
        "-Wno-error=implicit-function-declaration",
        "-DPRINT",
    ], 

有条件添加宏

添加go脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package vold

import (
        "android/soong/android"
        "android/soong/cc"
        "fmt"
)

func init() {
    // for DEBUG
    fmt.Println("vold init start ")
    android.RegisterModuleType("vold_defaults", voldDefaultsFactory)
}

func voldDefaultsFactory() (android.Module) {
    module := cc.DefaultsFactory()
    android.AddLoadHook(module, voldDefaults)
    return module
}

func voldDefaults(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("BUILD_WITH_SDCARD_READONLY:",
        ctx.AConfig().IsEnvTrue("BUILD_WITH_SDCARD_READONLY"))

    if ctx.AConfig().IsEnvTrue("BUILD_WITH_SDCARD_READONLY") {
          cppflags = append(cppflags, "-DSDCARD_READONLY=1")
    }

    return cppflags
}

Android.bp修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
vold_defaults {
    name: "vold_defaults",
    defaults: [ "vold_default_flags" ],
}

bootstrap_go_package {
    name: "soong-vold",
    pkgPath: "android/soong/vold",
    deps: [
        "blueprint",
        "blueprint-pathtools",
        "soong",
        "soong-android",
        "soong-cc",
        "soong-genrule",
    ],  
    srcs: [
        "vold.go",
    ],  
    pluginFor: ["soong_build"],
}

cc_library_static {
    name: "libvold",
    defaults: [        
        "vold_default_libs",
        "vold_defaults",  // 添加依赖
    ],

go是从init开始运行的,它其实只是注册了XXXDefaultFactory对象,然后添加hook,在里面判断环境变量,然后赋值给cppflags,逻辑还是很清晰的。