android.bp_android.bp hidl - CSDN
精华内容
参与话题
  • Android.bp基于Android 10学习笔记

    千次阅读 2020-03-16 14:19:01
    Android.bp简介 Android 7.0之后希望用Android.bp替换Android.mk,bp简单的配置更方便Ninja 文件的产生,而Blueprint和Soong 就此产生。Android 利用Blueprint和Soong 来解析bp文件,经过最终转换为ninja files。 ...

    Android.bp简介

    Android 7.0之后希望用Android.bp替换Android.mk,bp简单的配置更方便Ninja 文件的产生,而Blueprint和Soong 就此产生。Android 利用Blueprint和Soong 来解析bp文件,经过最终转换为ninja files。 Blueprint和Soong都是由Golang写的项目。 从Android Nougat开始,prebuilts/go/目录下新增了Golang所需的运行环境,在编译时使用。Android.bp以及相关支持,从Android Nougat开始加入,从 Android Oreo(8.0)开始默认开启。 如果需要在Android Nougat的版本使用,需要在执行编译时添加变量: make ‘USE_SOONG=true’ Soong是以前Android基于make的编译系统的替代品。它以Android.bp文件替代Android.mk,Android.bp文件用类似JSON的简洁声明来描述需要构建的模块。

    参考文档:

    再来说一说跟着Android版本相应的发展演变过程:

    1. Android 7.0引入ninja和kati
    2. Android 8.0使用Android.bp来替换Android.mk,引入Soong
    3. Android 9.0强制使用Android.bp

    转换关系

    在这里插入图片描述

    通过Kati将Android.mk转换成ninja格式的文件,通过Blueprint+Soong将Android.bp转换成ninja格式的文件,通过androidmk将将Android.mk转换成Android.bp,但针对没有分支、循环等流程控制的Android.mk才有效。

    这里涉及到Ninja, kati, Soong, bp概念,接下来分别简单介绍一下。

    • Ninja

    ninja是一个编译框架,会根据相应的ninja格式的配置文件进行编译,但是ninja文件一般不会手动修改,而是通过将Android.bp文件转换成ninja格文件来编译。

    • Android.bp

    Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。

    • Soong

    Soong类似于之前的Makefile编译系统的核心,负责提供Android.bp语义解析,并将之转换成Ninja文件。Soong还会编译生成一个androidmk命令,用于将Android.mk文件转换为Android.bp文件,不过这个转换功能仅限于没有分支、循环等流程控制的Android.mk才有效。

    • Blueprint

    Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong负责Android编译而设计的工具,而Blueprint只是解析文件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目,从Android 7.0,prebuilts/go/目录下新增Golang所需的运行环境,在编译时使用。

    • Kati

    kati是专为Android开发的一个基于Golang和C++的工具,主要功能是把Android中的Android.mk文件转换成Ninja文件。代码路径是build/kati/,编译后的产物是ckati。

    Android.bp语法初识

    • 例子1
    cc_library_shared {				//编译成动态库,类似于Android.mk中的BUILD_SHARED_LIBRARY
        name: "libbluetooth_jni",	//编译出的模块的名称,类似于Android.mk中的LOCAL_MODULE
        srcs: [ 					//源文件,类似于Android.mk中的LOCAL_SRC_FILES
            "com_android_bluetooth_btservice_AdapterService.cpp",
            "com_android_bluetooth_hfp.cpp",
            "com_android_bluetooth_hfpclient.cpp",
            "com_android_bluetooth_a2dp.cpp",
            "com_android_bluetooth_a2dp_sink.cpp",
            "com_android_bluetooth_avrcp.cpp",
            "com_android_bluetooth_avrcp_controller.cpp",
            "com_android_bluetooth_hid.cpp",
            "com_android_bluetooth_hidd.cpp",
            "com_android_bluetooth_hdp.cpp",
            "com_android_bluetooth_pan.cpp",
            "com_android_bluetooth_gatt.cpp",
            "com_android_bluetooth_sdp.cpp",
        ],
        include_dirs: [				//用户指定的头文件查找路径,类似于Android.mk中的LOCAL_C_INCLUDES
            "libnativehelper/include/nativehelper",
            "system/bt/types",
        ],
        shared_libs: [				//编译所依赖的动态库,类似于Android.mk中的LOCAL_SHARED_LIBRARIES
            "libandroid_runtime",
            "libchrome",
            "libnativehelper",
            "libcutils",
            "libutils",
            "liblog",
            "libhardware",
        ],
        static_libs: [				//编译所依赖的静态库,类似于Android.mk中的LOCAL_STATIC_LIBRARIES
            "libbluetooth-types",
        ],
        cflags: [					///编译flag,类似于Android.mk中的LOCAL_CFLAGS
            "-Wall",
            "-Wextra",
            "-Wno-unused-parameter",
        ],
    }
    
    
    • 例子2
    cc_binary {             //编译成可执行文件,cc_library_shared编译成动态库
        name: "bt_test",    //编译出的可执行文件的名字为bt_test
        vendor: true,       //编译出来放在/vendor目录下(默认是放在/system目录下)
        srcs: ["bt_test.cpp"], //源文件,格式["a.cpp", "b.cpp"]
        cflags: [
            "-Wall",
            "-Werror",
            "-Wno-unused-parameter",
        ],                    //编译flag
        include_dirs: [
            "hardware/interfaces/halnode/1.0/default",    //用户值定的头文件查找路径
        ],
        shared_libs: [       //编译依赖的动态库
            "liblog",
            "libutils",
            "libhidltransport",
            "android.hardware.halnode@1.0",
            "libhidlbase",
            "libbase",
        ],
    }
    
    • 例子3

    srcs 属性以字符串列表的形式指定用于编译模块的源文件。您可以使用模块引用语法 “:” 来引用生成源文件的其他模块的输出,如 genrule 或 filegroup。是不是感觉一头雾水,好吗,还是上实例说明:

    ~/ssd/qcom_64/msm8953-9$ cd frameworks/base/core/java/
    ~/ssd/qcom_64/msm8953-9/frameworks/base/core/java$ vi Android.bp
    
    filegroup {
        name: "IKeyAttestationApplicationIdProvider.aidl",
        srcs: ["android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl"],
    }
    
    filegroup {
        name: "IDropBoxManagerService.aidl",
        srcs: ["com/android/internal/os/IDropBoxManagerService.aidl"],
    
    ~/ssd/qcom_64/msm8953-9/frameworks/base/core$ cd ..
    ~/ssd/qcom_64/msm8953-9/frameworks/base$ vi libs/services/Android.bp
    
    cc_library_shared {
        name: "libservices",
        srcs: [
            ":IDropBoxManagerService.aidl",
            "src/os/DropBoxManager.cpp",
            "src/os/StatsDimensionsValue.cpp",
            "src/os/StatsLogEventWrapper.cpp",
        ],  
    
        shared_libs: [
            "libbinder",
            "liblog",
            "libcutils",
            "libutils",
        ],
    
    

    模块

    从前面的列子可以看出定义一个模块从模块的类型开始,模块有不同的类型,如前面例子中的cc_library_shared,当然类型还有很多种,譬如cc_binary android_app cc_library_static等等。模块包含一些属性格式为“property-name:property-value”,其中name属性必须指定,其属性值必须是全局唯一的。

    其中默认模块可用于在多个模块中重复相同的属性,是不是用文字表达很模糊,好吗,上实例:

    cc_defaults {//		//默认模块名称
        name: "default_module",
        shared_libs: ["libz"],
        stl: "none",
    }
    cc_binary {
        name: "test1",
        defaults: ["default_module"],	//引用默认模块名称
        srcs: ["src/test/test.c"],
    }
    
    

    类型

    变量和属性是强类型,变量根据第一项赋值动态变化,属性由模块类型静态设置。支持的类型为:

    • 布尔值(true 或 false)
    • 整数 (int)
    • 字符串 (“string”)
    • 字符串列表 ([“string1”, “string2”])
    • 映射 ({key1: “value1”, key2: [“value2”]})
    • 映射可以包含任何类型的值,包括嵌套映射。列表和映射可能在最后一个值后面有终止逗号。

    其它可用选项

    • subdirs = [“ndk”]   //指定进入下层ndk目录进行编译

    • export_include_dirs: [   //从其他模块添加头文件检索路径 “include”, “include/camera” ],

    • export_shared_lib_headers: [“libcamera_metadata”],

    • local_include_dirs: [“aidl”],   //如果从当前目录添加路径时使用,将./aidl目录加入头文件的搜索路径

    • static_libs: [“libupdater”],   //指定对库libupdater进行静态链接 static_executable: true,

    变量

    Android.bp文件可包含顶级变量赋值:

    test_srcs = ["src/test.c"],
    cc_binary {
        name: "test",
        srcs: test_srcs,
    }
    

    变量范围限定为声明它们的文件的其余部分,以及任何子蓝图文件。变量是不可变的,但有一个例外 —— 它们可以附上+= 赋值,但仅在变量被引用之前。

    注释

    我们知道Android.mk中可以进行注释,当然Android.bp里面也可以,Android.mk中使用"#"然后添加注释,Android.bp使用单行注释//和多行注释/* */两种方式。

    运算符

    可以使用 + 运算符附加字符串、字符串列表和映射。可以使用 + 运算符对整数求和。附加映射会生成两个映射中键的并集,并附加在两个映射中都存在的所有键的值。

    ###条件语句
    Soong 不支持 Android.bp 文件中的条件语句。但是,编译规则中需要条件语句的复杂问题将在 Go(在这种语言中,您可以使用高级语言功能,并且可以跟踪条件语句引入的隐式依赖项)中处理。大多数条件语句都会转换为映射属性,其中选择了映射中的某个值并将其附加到顶级属性。

    例如,要支持特定于架构的文件,请使用以下命令:

    cc_library {
        ...
        srcs: ["generic.cpp"],
        arch: {
            arm: {
                srcs: ["arm.cpp"],
            },
            x86: {
                srcs: ["x86.cpp"],
            },
        },
    }
    
    system/core/libusbhost$ cat Android.bp 
    
    cc_library {
        name: "libusbhost",
        vendor_available: true,
        vndk: {
            enabled: true,
        },
        host_supported: true,
        srcs: ["usbhost.c"],
        cflags: ["-Werror"],
        export_include_dirs: ["include"],
        target: {   //相当于if
            android: {    //编译Android上运行的程序 相当于if
                cflags: [
                    "-g",
                    "-DUSE_LIBLOG",
                ],
                shared_libs: ["liblog"],
            },
            darwin: {    //编译darwin上运行的程序
                enabled: false,
            },
        },
    }
    

    支持模块类型

    Android.bp可以支持android_app、cc_binary、cc_binary_host等多种类型,具体定义在Android源码的build/soong/androidmk/cmd/androidmk/android.go可以查看,具体如下:

    var moduleTypes = map[string]string{
        "BUILD_SHARED_LIBRARY":        "cc_library_shared",
        "BUILD_STATIC_LIBRARY":        "cc_library_static",
        "BUILD_HOST_SHARED_LIBRARY":   "cc_library_host_shared",
        "BUILD_HOST_STATIC_LIBRARY":   "cc_library_host_static",
        "BUILD_HEADER_LIBRARY":        "cc_library_headers",
        "BUILD_EXECUTABLE":            "cc_binary",
        "BUILD_HOST_EXECUTABLE":       "cc_binary_host",
        "BUILD_NATIVE_TEST":           "cc_test",
        "BUILD_HOST_NATIVE_TEST":      "cc_test_host",
        "BUILD_NATIVE_BENCHMARK":      "cc_benchmark",
        "BUILD_HOST_NATIVE_BENCHMARK": "cc_benchmark_host",
    
        "BUILD_JAVA_LIBRARY":             "java_library",
        "BUILD_STATIC_JAVA_LIBRARY":      "java_library_static",
        "BUILD_HOST_JAVA_LIBRARY":        "java_library_host",
        "BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",
        "BUILD_PACKAGE":                  "android_app",
    }
    

    支持预编译类型

    Android.bp可以支持多种预编译类型,具体定义在Android源码的build/soong/androidmk/cmd/androidmk/android.go可以查看,如下图所示:

    var prebuiltTypes = map[string]string{
        "SHARED_LIBRARIES": "cc_prebuilt_library_shared",
        "STATIC_LIBRARIES": "cc_prebuilt_library_static",
        "EXECUTABLES":      "cc_prebuilt_binary",
        "JAVA_LIBRARIES":   "prebuilt_java_library",
    }
    

    常用工具

    (1)bpfmt 一个是格式化工具bpfmt。 与gofmt类似,可以格式化Blueprint文件。 (其实,代码基本上都是从gofmt复制而来。)eg 格式化当前目录及其递归子目录下的所有Android.bp:

    wugn # bpfmt -w .
    

    (2)androidmk 另一个是androidmk,负责转换Android.mk为Android.bp。

    wugn: # androidmk Android.mk > Android.bp
    
    展开全文
  • Android.bp相关介绍

    2020-03-23 10:48:04
    早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp。很明显Android.bp的出现就是为了替换掉Android.mk。 再来说一说跟着Android版本相应的发展演变过程: Android 7.0引入...

    一、简介

    早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp。很明显Android.bp的出现就是为了替换掉Android.mk。

    再来说一说跟着Android版本相应的发展演变过程:

    • Android 7.0引入ninja和kati
    • Android 8.0使用Android.bp来替换Android.mk,引入Soong
    • Android 9.0强制使用Android.bp

    转换关系图如下:

    《理解Android.bp》;

    通过Kati将Android.mk转换成ninja格式的文件,通过Buleprint+ Soong将Android.bp转换成ninja格式的文件,通过androidmk将Android.mk转换成Android.bp,但针对没有分支、循环等流程控制的Android.mk才有效。

    这里涉及到Ninja, kati, Soong, bp概念,接下来分别简单介绍一下。

    1. Ninja

    ninja是一个编译框架,会根据相应的ninja格式的配置文件进行编译,但是ninja文件一般不会手动修改,而是通过将Android.bp文件转换成ninja格文件来编译。

    2. Android.bp

    Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。

    3. Soong

    Soong类似于之前的Makefile编译系统的核心,负责提供Android.bp语义解析,并将之转换成Ninja文件。Soong还会编译生成一个androidmk命令,用于将Android.mk文件转换为Android.bp文件,不过这个转换功能仅限于没有分支、循环等流程控制的Android.mk才有效。

    4. Blueprint

    Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong负责Android编译而设计的工具,而Blueprint只是解析文件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目,从Android 7.0,prebuilts/go/目录下新增Golang所需的运行环境,在编译时使用。

    5. Kati

    kati是专为Android开发的一个基于Golang和C++的工具,主要功能是把Android中的Android.mk文件转换成Ninja文件。代码路径是build/kati/,编译后的产物是ckati。

    二、Android.bp语法

    Android.bp是一种纯粹的配置文件,设计简单,没有条件判断或控制流语句,采用在Go语言编写控制逻辑。

    Android.bp文件记录着模块信息,每一个模块以模块类型开始,后面跟着一组模块的属性,以名值对(name: value)表示,每个模块都必须有一个 name属性。基本格式,以frameworks/base/services/Android.bp文件为例

    java_library {
        name: "services",
    
        dex_preopt: {
            app_image: true,
            profile: "art-profile",
        },
    
        srcs: [
            "java/**/*.java",
        ],
    
        static_libs: [
            "services.core",
            "services.accessibility",
            "services.appwidget",
            "services.autofill",
            "services.backup",
            "services.companion",
            "services.coverage",
            "services.devicepolicy",
            "services.midi",
            "services.net",
            "services.print",
            "services.restrictions",
            "services.usage",
            "services.usb",
            "services.voiceinteraction",
            "android.hidl.base-V1.0-java",
        ],
    
        libs: [
            "android.hidl.manager-V1.0-java",
            "miuisdk",
            "miuisystemsdk"
        ],
    
    }
    
    cc_library_shared {
        name: "libandroid_servers",
        defaults: ["libservices.core-libs"],
        whole_static_libs: ["libservices.core"],
    }
    展开全文
  • Android编译系统中的Android.bp

    万次阅读 2018-05-14 16:34:19
    转自:http://note.qidong.name/2017/08/android-blueprint/Android编译系统中的Android.bp、Blueprint与Soong本文简单介绍Android Nougat(7.0)中引入的Android.bp,及其相关工具链。简介Android.bp,是用来替换...

    转自:http://note.qidong.name/2017/08/android-blueprint/

    Android编译系统中的Android.bp、Blueprint与Soong

    本文简单介绍Android Nougat(7.0)中引入的Android.bp,及其相关工具链。

    简介

    Android.bp,是用来替换Android.mk的配置文件。 它使用Blueprint框架来解析,最终转换成Ninja文件。

    与Android.mk不同的是,Android.bp是纯粹的配置文件,不包含分支、循环等流程控制,也不能做算数、逻辑运算。 与此同时,Ninja文件也是如此。 这就产生了一些新的问题与需求——在Android项目上进行选择编译、解析配置、转换成Ninja等——Soong应运而生。 Soong其实就相当于Makefile编译系统的核心,即build/make/core/下面的内容。 它负责提供Android.bp的含义定义与解析,并将之转换为Ninja文件。。

    此外,Soong还会编译产生一个androidmk命令,可以手动把Android.mk转换成Android.bp。 这只对无选择、循环等复杂流程控制的Android.mk生效。

    BlueprintSoong都是由Golang写的项目。 从Android Nougat开始,prebuilts/go/目录下新增了Golang所需的运行环境,在编译时使用。

    Android.bp以及相关支持,从Android Nougat开始加入,从Android Oreo(8.0)开始默认开启。 如果需要在Android Nougat的版本使用,需要在执行编译时添加变量。

    make 'USE_SOONG=true'
    

    单独编译blueprint

    启用Soong以后,在Android编译最开始的准备阶段,会执行build/soong/soong.bash进行环境准备。 其中会先编译、安装Blueprintout目录下。 也就是说,在编译Android项目时,Android.bp相关工具链会自动编译,无需费神。

    Soong是与Android强关联的一个项目,而Blueprint则相对比较独立,可以单独编译、使用。

    编译Blueprint,首先要具备Golang环境。 然后,按照以下步骤执行命令。

    go get github.com/google/blueprint
    cd $GOPATH/src/github.com/google/blueprint
    ./bootstrap.bash
    ./blueprint.bash
    ls bin
    

    在新生成的bin目录中,包含4个可执行文件:

    • bpfmt
    • bpmodify
    • microfactory
    • minibp

    由于文档较少,甚至连帮助命令都不包括命令的描述,所以其作用只能望文生义。

    工具链关系

    Android.mk、Android.bp、Soong、Blueprint、Ninja,它们之间到底有什么关系? 以下用简单的方式表达这几个概念之间的作用关系。

    Android.bp --> Blueprint --> Soong --> Ninja
    Makefile or Android.mk --> kati --> Ninja
    
    (Android.mk --> Soong --> Blueprint --> Android.bp)
    

    Blueprint是生成、解析Android.bp的工具,是Soong的一部分。 Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义。

    Android.mk可以通过Soong提供的androidmk转换成Android.bp,但仅限简单配置。 目前Oreo的编译流程中,仍然是使用kati来做的转换。

    现存的Android.mk、既有的Android.bp,都会分别被转换成Ninja。 从Android.mk与其它Makefile,会生成out/build-<product_name>.ninja文件。 而从Android.bp,则会生成out/soong/build.ninja。 此外,还会生成一个较小的out/combined-<product_name>.ninja文件,负责把二者组合起来,作为执行入口。

    最终,Ninja文件才是真正直接控制源码编译的工具。

    Android.bp

    样例与基本概念

        // Android.bp sample
        cc_defaults(
            deps = [
                "libc",
            ],
        )
    
        cc_library(
            name = "cmd",
            srcs = [
                "main.c",
            ],
        )
    
        subdirs = ["subdir1", "subdir2"]
    

    前面的样例中,cc_library这种()前面的,就是模块(module)。 这里module的概念,直接对应Android.mk中module的概念。 而=前面的namesrcs等,就是该模块的属性(property)。

    subdirs是一个文件级的顶层属性,指定后会查找次级目录下的Android.bp。 类似于Android.mk中常用的include $(call all-subdir-makefiles)

    模块是可以继承属性的。 cc_defaults就是一个文件中所有模块的父模块,可以指定公用的属性。 在以上代码中,cc_library模块虽然没有指定,但已经包含了deps属性。

    语法

    Blueprint文件的语法比较简单,毕竟只是配置文件。

    变量与属性都是动态强类型的,赋值时确定。 变量类型只有四种。

    1. Bool(truefalse
    2. 字符串Strings(”string”)
    3. 字符串列表(["string1", "string2"]
    4. 映射关系Map({key1: "value1", key2: ["value2"]}

    注释方式,与Golang类似。 支持行注释// line与块注释/* block */

    操作符除了赋值的=以外,只有+

    常用工具

    虽然编译过程中的相关很多,不过在开发过程中可能需要手动执行的命令却不多。

    一个是格式化工具bpfmt。 与gofmt类似,可以格式化Blueprint文件。 (其实,代码基本上都是从gofmt复制而来。)

    例如,格式化当前目录及其递归子目录下的所有Android.bp:

    bpfmt -w .
    

    另一个是androidmk,负责转换Android.mk为Android.bp。 其实,现阶段没有必要学会写Android.bp,通过写Android.mk来转换也行。

    androidmk Android.mk > Android.bp
    

    Android.mk转换Android.bp实例

    下面,以一个AOSP上的简单模块,system/core/sdcard/Android.mk,来做为案例。

        LOCAL_PATH := $(call my-dir)
    
        include $(CLEAR_VARS)
    
        LOCAL_SRC_FILES := sdcard.cpp fuse.cpp
        LOCAL_MODULE := sdcard
        LOCAL_CFLAGS := -Wall -Wno-unused-parameter -Werror
        LOCAL_SHARED_LIBRARIES := libbase libcutils libminijail libpackagelistparser
    
        LOCAL_SANITIZE := integer
    
        include $(BUILD_EXECUTABLE)
    

    这是一个编译二进制可执行文件的小模块,内容非常简单。 通过执行androidmk Android.mk > Android.bp,可以转换成Android.bp。

        cc_binary {
            srcs: [
                "sdcard.cpp",
                "fuse.cpp",
            ],
            name: "sdcard",
            cflags: [
                "-Wall",
                "-Wno-unused-parameter",
                "-Werror",
            ],
            shared_libs: [
                "libbase",
                "libcutils",
                "libminijail",
                "libpackagelistparser",
            ],
            sanitize: {
                misc_undefined: ["integer"],
            },
        }
    

    可以看出,虽然行数变多,但其实含义更明确了。 这个名为sdcard的模块,源码有两个cpp文件,依赖库有四个。 cc_binary,就相当于include $(BUILD_EXECUTABLE)。 转换前后,该有的信息都在,只是表达方式变化了而已。

    注意:如果Android.mk中包含复杂的逻辑,则转换结果会有问题,详见结果文件中的注释

    至于Android.bp支持多少像cc_binarycc_library这样的模块,每个模块又支持多少像namecflags这样的属性, 则只能去查找Soong的文档。

    文档

    目前(2017年),整个Android.bp工具链,都处于文档极度缺失的阶段。 除了官方那点可怜的README以外,基本只能去看代码与注释,参考其它已经存在的Android.bp。

    另外,在已经使用Soong编译的项目中,out/soong/.bootstrap/docs/soong_build.html描述了所有的可用模块及其属性。 这多少缓解了两眼一抹黑症状,不算太过难受。 实际上,整个Soong仍然处于发展期,Google肆无忌惮地修改,完全没考虑兼容。 在8.0.0写的Android.bp,也许在8.0.1就会编译失败。 这或许是文档与编译绑定的真意吧。 等Soong完全成熟了,也许Android开发官网,就会有详尽的信息。

    本站提供了从AOSP的android-8.0.0-r9,编译出来的一个soong_build.html,仅供参考。

    展开全文
  • Android.bp文件说明.pdf

    2020-06-22 10:51:07
    Android新编译规则Android.bp文件语法规则详细介绍,条件编译的配置案例。 Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk 文件的。在 Android7.0 以前,Android 都是使用 ...
  • Android.bp文件来认识一下

    千次阅读 2018-12-08 18:59:29
    Soong Soong is the replacement for the old Android make-based build system....replaces Android.mk files with Android.bp files, which are JSON-like simple declarative descriptions of modules to build...

    Soong

    Soong is the replacement for the old Android make-based build system. It
    replaces Android.mk files with Android.bp files, which are JSON-like simple
    declarative descriptions of modules to build.

    Android.bp file format

    By design, Android.bp files are very simple. There are no conditionals or
    control flow statements - any complexity is handled in build logic written in
    Go. The syntax and semantics of Android.bp files are intentionally similar
    to Bazel BUILD files
    when possible.

    Modules

    A module in an Android.bp file starts with a module type, followed by a set of
    properties in name: value, format:

    cc_binary {
        name: "gzip",
        srcs: ["src/test/minigzip.c"],
        shared_libs: ["libz"],
        stl: "none",
    }
    

    Every module must have a name property, and the value must be unique across
    all Android.bp files.

    For a list of valid module types and their properties see
    $OUT_DIR/soong/.bootstrap/docs/soong_build.html.

    Variables

    An Android.bp file may contain top-level variable assignments:

    gzip_srcs = ["src/test/minigzip.c"],
    
    cc_binary {
        name: "gzip",
        srcs: gzip_srcs,
        shared_libs: ["libz"],
        stl: "none",
    }
    

    Variables are scoped to the remainder of the file they are declared in, as well
    as any child blueprint files. Variables are immutable with one exception - they
    can be appended to with a += assignment, but only before they have been
    referenced.

    Comments

    Android.bp files can contain C-style multiline /* */ and C++ style single-line
    // comments.

    Types

    Variables and properties are strongly typed, variables dynamically based on the
    first assignment, and properties statically by the module type. The supported
    types are:

    • Bool (true or false)
    • Integers (int)
    • Strings ("string")
    • Lists of strings (["string1", "string2"])
    • Maps ({key1: "value1", key2: ["value2"]})

    Maps may values of any type, including nested maps. Lists and maps may have
    trailing commas after the last value.

    Operators

    Strings, lists of strings, and maps can be appended using the + operator.
    Integers can be summed up using the + operator. Appending a map produces the
    union of keys in both maps, appending the values of any keys that are present
    in both maps.

    Defaults modules

    A defaults module can be used to repeat the same properties in multiple modules.
    For example:

    cc_defaults {
        name: "gzip_defaults",
        shared_libs: ["libz"],
        stl: "none",
    }
    
    cc_binary {
        name: "gzip",
        defaults: ["gzip_defaults"],
        srcs: ["src/test/minigzip.c"],
    }
    

    Name resolution

    Soong provides the ability for modules in different directories to specify
    the same name, as long as each module is declared within a separate namespace.
    A namespace can be declared like this:

    soong_namespace {
        imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
    }
    

    Each Soong module is assigned a namespace based on its location in the tree.
    Each Soong module is considered to be in the namespace defined by the
    soong_namespace found in an Android.bp in the current directory or closest
    ancestor directory, unless no such soong_namespace module is found, in which
    case the module is considered to be in the implicit root namespace.

    When Soong attempts to resolve dependency D declared my module M in namespace
    N which imports namespaces I1, I2, I3…, then if D is a fully-qualified name
    of the form “//namespace:module”, only the specified namespace will be searched
    for the specified module name. Otherwise, Soong will first look for a module
    named D declared in namespace N. If that module does not exist, Soong will look
    for a module named D in namespaces I1, I2, I3… Lastly, Soong will look in the
    root namespace.

    Until we have fully converted from Make to Soong, it will be necessary for the
    Make product config to specify a value of PRODUCT_SOONG_NAMESPACES. Its value
    should be a space-separated list of namespaces that Soong export to Make to be
    built by the m command. After we have fully converted from Make to Soong, the
    details of enabling namespaces could potentially change.

    Formatter

    Soong includes a canonical formatter for blueprint files, similar to
    gofmt. To recursively reformat all Android.bp files
    in the current directory:

    bpfmt -w .
    

    The canonical format includes 4 space indents, newlines after every element of a
    multi-element list, and always includes a trailing comma in lists and maps.

    Convert Android.mk files

    Soong includes a tool perform a first pass at converting Android.mk files
    to Android.bp files:

    androidmk Android.mk > Android.bp
    

    The tool converts variables, modules, comments, and some conditionals, but any
    custom Makefile rules, complex conditionals or extra includes must be converted
    by hand.

    Differences between Android.mk and Android.bp

    • Android.mk files often have multiple modules with the same name (for example
      for static and shared version of a library, or for host and device versions).
      Android.bp files require unique names for every module, but a single module can
      be built in multiple variants, for example by adding host_supported: true.
      The androidmk converter will produce multiple conflicting modules, which must
      be resolved by hand to a single module with any differences inside
      target: { android: { }, host: { } } blocks.

    Build logic

    The build logic is written in Go using the
    blueprint framework. Build
    logic receives module definitions parsed into Go structures using reflection
    and produces build rules. The build rules are collected by blueprint and
    written to a ninja build file.

    Other documentation

    FAQ

    How do I write conditionals?

    Soong deliberately does not support conditionals in Android.bp files.
    Instead, complexity in build rules that would require conditionals are handled
    in Go, where high level language features can be used and implicit dependencies
    introduced by conditionals can be tracked. Most conditionals are converted
    to a map property, where one of the values in the map will be selected and
    appended to the top level properties.

    For example, to support architecture specific files:

    cc_library {
        ...
        srcs: ["generic.cpp"],
        arch: {
            arm: {
                srcs: ["arm.cpp"],
            },
            x86: {
                srcs: ["x86.cpp"],
            },
        },
    }
    

    See art/build/art.go
    or external/llvm/soong/llvm.go
    for examples of more complex conditionals on product variables or environment variables.

    Contact

    Email android-building@googlegroups.com (external) for any questions, or see
    go/soong (internal).

    展开全文
  • Android.bp文件

    千次阅读 2019-05-06 10:00:03
    Android.bp,是用来替换Anddroid.mk的配置文件。使用Blueprint框架来解析,最终转换成Ninja文件。与Android.mk不同的是,Android.bp是纯粹的配置文件,不包含分支、循环等流程控制,也不能做算数、逻辑运算 ...
  • Android 编译系统之Android.bp

    万次阅读 2017-08-17 17:31:16
    Android 7.0 (N)开始, Google开始逐步使用Android.bp代替原来的Android.mk进行编译. Google称之为soong, 具体可以参考: https://android.googlesource.com/platform/build/soong使用Android.bp编译时, 目前还...
  • Android.bp文件详解

    千次阅读 2020-06-22 10:16:23
    Android.bp文件是什么? Android.bp文件首先是Android系统的一种编译配置文件,是用来代替原来的Android.mk文件的。在Android7.0以前,Android都是使用make来组织各模块的编译,对应的编译配置文件就是Android.mk。...
  • Android.bpAndroid.mk

    千次阅读 2018-11-16 18:13:56
    AndroidO开始,Android开始使用Android.bp来管理代码的编译,Android通过soong和blueprint将Android.bp转换为ninja文件(保存在out/soong/build.ninja),通过ckati将Android.mk转换为ninja文件(保存在out/buil-$...
  • Android.bp入门指南之浅析Android.bp语法

    千次阅读 2020-02-20 11:15:54
          Android.bp入门指南之语法初识 前言   在前面的章节初始Android.bp里面我们对Android.bp有了一个基本的认识,知道了它是干啥的。算了吗,还是再介绍一遍它吗!Android.bp是用来替换Android.mk的配置...
  •     Android.bp入门指南之Android.mk转换成Android.bp 前言   在前面的篇章初识Android.bpAndroid.bp入门指南之语法初识我们对Android.bp是啥和基本语法都有了一个初步层次的认识。Android的妈咪谷歌当然也...
  • android.bp

    千次阅读 2017-10-24 10:40:42
    最近更新了Android Nougat源码,无意间发现Android的编译系统已经发生了巨大改变,到处是“Android.bp”文件,下面就来看一下这个bp文件到底是何方神圣。首先从Soong说起,Soong是Android中对基于GNU make的编译系统...
  •        Android.bp正确姿势添加宏控制指南 前言 随着Android版本的迭代,
  • Android.bp条件编译

    千次阅读 2019-10-30 14:10:15
    我们修改代码的时候经常会有一些共线的机器,我们只想进指定的机器或者指定的分支,在Android.mk中可以直接使用if来做判断,但是到了Android.bp中就无法在bp文件中使用条件编译了,本文将教会你怎么让bp文件也支持...
  • Android.mk 转换为 Android.bp简介

    千次阅读 2019-04-10 10:15:08
    There is a tool called androidmk to generate Android.bp file out of Android.mk file androidmk工具在编译后生成所在目录out/soong/host/linux-x86/bin/androidmk 工具使用方法: 1. cdout/soong/host/linux-...
  • android.mk转换为android.bp

    万次阅读 2018-05-09 20:00:29
    android.mk大家都很熟悉了,就是android下编译模块的配置文件,可以理解为android makefile。从android N之后,我们发现好多模块下面没有了android.mk文件,多了一个android.bp文件。这个是google在android N之后新...
  • Android.bp

    千次阅读 2018-04-04 13:08:20
    subdirs = ["ndk"]cc_library_shared { name: "libcamera_client", aidl: { export_aidl_headers: true, local_include_dirs: ["aidl"], include_dirs: [ "...
  • Android.bp 添加宏开关

    千次阅读 2018-12-11 17:52:12
    以前在android系统控制编译的Android.mk不是纯文本形式,里面还有流控制,而Android.bp是类似JSON的纯文本形式. 对于Android.mk里面流控制部分,在Android.bp里要借助使用go语言文件去进行控制. 这里的添加宏开关两种...
  • 【Bash百宝箱】从Android.mk到Android.bp

    万次阅读 2017-01-24 14:01:15
    最近更新了Android Nougat源码,无意间发现Android的编译系统已经发生了巨大改变,到处是“Android.bp”文件,下面就来看一下这个bp文件到底是何方神圣。首先从Soong说起,Soong是Android中对基于GNU make的编译系统...
  • 前言: 随着android工程越来越大,包含的module越来越多,以makefile组织的项目编译花费的时间越来越多。谷歌在7.0开始引入了ninja...Android 7.0 之后再很多地方出现了Android.bp的文件,也不清楚这个后缀是什么意...
1 2 3 4 5 ... 20
收藏数 7,439
精华内容 2,975
关键字:

android.bp