Android_bp

Android.bp

理解Android Build系统

  • 前言 Android Build系统是Android源码的一部分,用来编译Android系统,Android SDK以及相关文档。众所周知,Android是一个开源的操作系统,包含着大量的开源项目以及许多模块。不同的生产厂商不同的设备对于Android系统的定制都是不一样的。 如何将这些项目和模块的编译统一管理起来,如何能够在不同的操作系统上进行编译,如何在编译时能够支持面向不同的硬件设备,不同的编译类型,还要提供面向各个厂商的定制扩展,是非常有难度的。 但是Android Build系统很好的解决了这些问题。
  • 概述 整个Build系统的Make文件可以分为三类:

    • Build系统核心文件 定义了整个Build系统框架,而其他所有的Make文件都是在这个框架的基础上编写出来的。 Android不同版本的build目录:

      Android6 Android7 Android8

    • 针对某个产品的Make文件

    • 针对某个模块的Make文件

背景

从Android 7.0 (N)开始, Google开始逐步使用Android.bp代替原来的Android.mk进行编译. Google称之为soong, 具体可以参考: soong

  • Makefile AOSP的==android-6.0.1_r9==分支,是最后一个纯Makefile的大版本。随着时间的发展,Android项目越来越庞大,纯Makefile编译系统已经越来越不堪。不仅扩展不便,而且执行效率也不太高。从7.0版本开始,Android已经用Ninja来替代Makefile。


What ?

目前还存在的问题

  • 1.对C/C++代码,如果需要使用宏开关时, 由于android整个编译系统还没完全切换过来, 导致 在项目mk文件定义的开关, 还不能生效. 解决: a.通过export命令, 把相应的开关设置到环境变量, go文件就能读取到了. b.把开关集中放到某一个文件中, 然后在go文件中直接读取这个文件.
  • 2.对于条件编译, 需要添加go文件进行控制. 解决: 下面是一个libsysutils模块Android.bp的内容: libsysutils_defaults以上及相关内容是新添加关键部分, 用来支持go文件进行条件编译. 如果想让TLV_FEATURE_ENABLED起作用, 需要export TLV_FEATURE_ENABLED=yes.

示例如下: Android.bp

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

libsysutils_defaults {
    name: "libsysutils_defaults",
}
cc_library_shared {
    name: "libsysutils",
    vendor_available: true,

    defaults: [
        "libsysutils_defaults",
    ],

    srcs: [
        "src/SocketListener.cpp",
        "src/FrameworkListener.cpp",
        "src/NetlinkListener.cpp",
        "src/NetlinkEvent.cpp",
        "src/FrameworkCommand.cpp",
        "src/SocketClient.cpp",
        "src/ServiceManager.cpp",
    ],

    logtags: ["EventLogTags.logtags"],

    cflags: ["-Werror"],

    shared_libs: [
        "libbase",
        "libcutils",
        "liblog",
        "libnl",
    ],

    export_include_dirs: ["include"],
}

下面是对应的libsysutils.go文件内容, fmt模块是用来调试的, 完成之后可以删除.

package libsysutils

import (
    "android/soong/android"
    "android/soong/cc"
    "github.com/google/blueprint"
    "fmt"
)

func globalDefaults(ctx android.BaseContext) ([]string) {
    var cflags []string

    fmt.Println("TLV_FEATURE_ENABLED:",
        ctx.AConfig().IsEnvTrue("TLV_FEATURE_ENABLED"))
    if ctx.AConfig().IsEnvTrue("TLV_FEATURE_ENABLED") {
            cflags = append(cflags, "-DTLV_FEATURE_ENABLED")
    }

    return cflags
}

func libsysutilsDefaults(ctx android.LoadHookContext) {
    type props struct {
    Cflags []string
    }
   p := &props{}
   p.Cflags = globalDefaults(ctx)
   ctx.AppendProperties(p)
}

func init() {
    fmt.Println("libsysutils: init")
    android.RegisterModuleType("libsysutils_defaults",
        libsysutilsDefaultsFactory)
}

func libsysutilsDefaultsFactory() (blueprint.Module, []interface{}) {
    module, props := cc.DefaultsFactory()
    android.AddLoadHook(module, libsysutilsDefaults)
    fmt.Println("libsysutils: libsysutilsDefaultsFactory")
    return module, props
}
 
comments powered by Disqus