Android.bp语法

Post on Jul 12, 2021 by Wei Lin

概述

Android.bp说明

Android.bp 文件是 Android 系统中使用的构建文件,用于描述 Android 项目的模块、依赖关系、编译选项等信息。Android.bp 文件是 Soong 构建系统的一部分,而不同于传统的 makefile 格式。

Soong 构建系统是 Android 在构建过程中使用的现代构建系统,用于替代之前的 make 构建系统。Soong 构建系统更加灵活、可扩展,并提供更高效的构建速度。Android.bp 文件是 Soong 构建系统使用的一种配置文件。

官方文档

Soong 构建系统—source.android

基本类型

模块定义

Android.bp文件结构是以模块为基本单位的,一个模块通常包含以下部分:

  • 模块类型:如cc_binary、cc_library、filegroup、java_library等;
  • 模块名称:通过name字段定义,是模块的唯一标识符;
  • 模块属性:这些属性可以控制模块的构建行为,如src属性指定源代码文件。
常用模块类型 说明
cc_binary  
cc_defaults  
cc_library  
cc_library_headers  
cc_library_shared  
cc_library_static  
   
filegroup filegroup 通常用于组织一些文件,以便在其他模块中引用。
java_defaults 在项目中定义一组默认属性,然后在多个 java_library 模块中引用这些默认值,而不必在每个模块中重复相同的配置。
java_library 构建Java库,生成jar文件
license 指定代码的许可证信息。这个属性通常用于声明代码的开源许可证,以确保代码的合法使用。
   
常用模块属性 说明
cflags cppflags 分别用于指定 C 和 C++ 编译器的编译标志。 cflags: [“-Wall”], cppflags: [“-std=c++11”],
include_dirs 指定头文件的搜索路径。 include_dirs: [“include”]
resource_dirs 指定资源目录的路径,用于包含项目的资源文件。 如:resource_dirs: [“res”],
srcs 指定源代码文件的路径 如:srcs: [“src/*/.java”]
shared_libs 列出该模块依赖的其他共享库。 如:shared_libs: [“libcommon”]
static_libs 列出该模块依赖的其它静态库。 如:static_libs: [“libcommon”]

注释

Android.bp 文件可以包含 C 样式的多行 /* */ 注释以及 C++ 样式的单行 // 注释。

Glob 模式

使用路径时(例如 srcs属性)可以采用 glob 模式。

  • 使用*匹配文件名,例如 *.java。
  • 使用**匹配零个或多个路径。例如,java/**/*.java 同时匹配 java/Main.java 和 java/com/android/Main.java 。

其它

filegroup

filegroup 通常用于组织一些文件,以便在其他模块中引用。例如,一个 cc_library 模块可能依赖于一个 filegroup,以包含一些额外的源文件。

示例1:展示了如何在 cc_library 中引用 filegroup

filegroup {
    name: "myfiles",
    srcs: ["file1.txt", "file2.txt"],
}

cc_library {
    name: "mymodule",
    srcs: ["main.c"],
    filegroup: "myfiles",
}

以上示例中,mymodule 使用了 filegroup 中定义的文件,使得这些文件成为 mymodule 的一部分。这种方式有助于更清晰地组织和管理项目中的文件。

示例2:在一个filegroup中引用另一个filegroup

filegroup {
    name: "myfiles",
    srcs: ["file1.txt", "file2.txt", ":otherfilegroup"],
}

说明:

  • name 属性定义了该文件组的名称。
  • srcs 属性定义了该文件组包含的文件列表。这可以是具体的文件路径或其他文件组的引用。
  • :otherfilegroup 表示引用了另一个名为 otherfilegroup 的文件组。

java_library

Android.bp入门教程—阿里云

java_library用于将源代码构建到.jar文件中。默认情况下,java_library只有一个变量,它生成一个包含根据设备引导类路径编译的.class文件的.jar包。生成的jar不适合直接安装在设备上,通过会用作另一个模块的static_libs依赖项。

属性 说明
host_supported host_supported:true将产生两个变量,一个根据device的bootclasspath编译,另一个根据host的bootclasspath编译。
installable installable:true将生成一个包含classes.dex文件的.jar文件,适合在设备上安装。
static_libs 该模块依赖的其它静态库
apex_available  
stem  
sdk_version  
visibility  

示例:来自frameworks/base/Android.bp

java_library {
    name: "framework-minus-apex",
    defaults: ["framework-minus-apex-defaults"],
    installable: true,
    // For backwards compatibility.
    stem: "framework",
    apex_available: ["//apex_available:platform"],
    visibility: [
        "//frameworks/base",
        // TODO(b/147128803) remove the below lines
        "//frameworks/base/apex/blobstore/framework",
        "//frameworks/base/apex/jobscheduler/framework",
        "//frameworks/base/packages/Tethering/tests/unit",
        "//packages/modules/Connectivity/Tethering/tests/unit",
    ],
    lint: {
        extra_check_modules: ["AndroidFrameworkLintChecker"],
    },
    errorprone: {
        javacflags: [
            "-Xep:AndroidFrameworkBinderIdentity:ERROR",
            "-Xep:AndroidFrameworkCompatChange:ERROR",
            "-Xep:AndroidFrameworkUid:ERROR",
        ],
    },
}

java_library {
    name: "framework-all",
    installable: false,
    static_libs: [
        "all-framework-module-impl",
        "framework-minus-apex",
    ],
    apex_available: ["//apex_available:platform"],
    sdk_version: "core_platform",
    visibility: [
        // DO NOT ADD ANY MORE ENTRIES TO THIS LIST
        "//external/robolectric-shadows:__subpackages__",
        "//frameworks/layoutlib:__subpackages__",
    ],
}

xx_defaults

Android.bp入门教程—阿里云

soong提供了一系列xx_defaults模块类型,例如:cc_defaults, java_defaults, doc_defaults, stubs_defaults等等。

xx_defaults的模块提供了一组可由其它模块继承的属性,避免在每个模块中重复相同的配置。其它模块可以通过defaults:[”<:default_module_name>”]来继承xx_defaults类型模块中定义的属性。

示例:在cc_binary模块中使用名为”gzip_defaults”的配置

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}