安卓bp文件详解

概念

Android.bp文件是安卓构建系统(Android Build System)中使用的构建描述文件,它用于定义Android项目中的模块、库、应用等构建规则,该文件使用 Blueprint 语言,是 Soong 构建系统的一部分。
Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义,最终转换成Ninja文件。Android.bp文件用类似JSON的简洁声明来描述需要构建的模块。
Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。
Android.mk可以引用Android.bp中的模块,反之Android.bp不能引用Android.mk中的模块。
Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk文件的。在 Android7.0 以前,Android都是使用make来组织各模块的编译,对应的编译配置文件就是Android.mk。
在 Android7.0 开始,Google 引入了 ninja 和 kati 来编译,为啥引入ninja因为随着 Android 越来越庞大,module 越来越多,编译时间也越来越久,而使用 ninja 在编译的并发处理上较 make 有很大的提升。Ninja 的配置文件就是Android.bp,Android 系统使用 Blueprint 和 Soong 工具来解析 Android.bp 转换生成 ninja文件。为了兼容老的 mk 配置文件,Android 当初也开发了 Kati 工具来转换 mk 文件生成ninja。

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

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

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

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

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

Android.bp的主要作用

模块定义
Android.bp 文件用于定义 Android 项目中的模块,这些模块可以是共享库、可执行文件、静态库等。每个模块都有其自己的属性和规则,用于描述模块的构建过程和依赖关系。

依赖关系
在 Android.bp 文件中,你可以指定一个模块依赖于其他模块,定义了模块之间的依赖关系。这包括依赖于其他库、系统库、源代码文件等。

构建规则
通过 Android.bp 文件,你可以指定模块的构建规则,包括编译选项、链接选项、源文件列表等。这使得开发者可以配置模块的构建过程。

模块属性
对每个模块,你可以定义一系列属性,这些属性包括模块的名称、类型、源文件列表、编译选项、依赖项等。这些属性在构建过程中用于指导构建系统。

插件支持
Android.bp 文件支持插件,这使得开发者可以自定义构建规则,添加额外的构建步骤或其他功能。

模块的可配置性
通过 Android.bp 文件,你可以定义模块的可配置属性,允许构建系统在不同的场景或设备上使用不同的配置。
在整个 Android 构建系统中,Android.bp 文件是非常重要的一部分,它提供了一种灵活且可扩展的方式来定义和配置 Android 项目的构建过程。这样的设计使得 Android 构建系统能够适应不同的硬件、设备和项目需求。

Android.mk 文件转换成 Android.bp

一.在工程源码中:
1.source build/envsetup.sh
2.lunch  xxx 
3.make  androidmk 

生成androidmk转换工具,路径为:/out/soong/host/linux-x86/bin/androidmk

二.直接把你要转换的Android.mk 文件放置到此目录下,然后执行命令:
androidmk   Android.mk  >  Android.bp

编译不同类型的模块

1.1、编译成Java库
会把aidl java 等文件编译成 .jar 库

Android.mk
include $(BUILD_JAVA_LIBRARY)

Android.bp
java_library {
......
}
1.2、编译成Java静态库
Android.mk
include $(BUILD_STATIC_JAVA_LIBRARY)

Android.bp
java_library_static {
......
}
1.3、编译成App应用
Android.mk
include $(BUILD_PACKAGE)

Android.bp
android_app {
......
}
1.4、编译成Native动态库
Android.mk
include $(BUILD_SHARED_LIBRARY)

Android.bp
cc_library_shared {
......
}
1.5、编译成Native静态库
Android.mk
include $(BUILD_STATIC_LIBRARY)

Android.bp
cc_library_static {
......
}
1.6、编译成Native执行程序
Android.mk
include $(BUILD_EXECUTABLE)

Android.bp
cc_binary {
......
}
1.7、编译成头文件库
Android.mk
include $(BUILD_HEADER_LIBRARY)

Android.bp
cc_library_headers {
......
}

文件路径

2.1、本地头文件路径
Android.mk
LOCAL_C_INCLUDES := 

Android.bp
local_include_dirs: ["xxx", ...]
2.2、导出的头文件路径
Android.mk
LOCAL_EXPORT_C_INCLUDE_DIRS := 

Android.bp
export_include_dirs: ["xxx", ...]
2.3、资源文件路径
Android.mk
LOCAL_RESOURCE_DIR := 

Android.bp
resource_dirs: ["xxx", ...]

库依赖

3.1、依赖的静态库
Android.mk
LOCAL_STATIC_LIBRARIES := 

Android.bp
static_libs: ["xxx", "xxx", ...]
3.2、依赖的动态库
Android.mk
LOCAL_SHARED_LIBRARIES := 

Android.bp
shared_libs: ["xxx", "xxx", ...]
3.3、依赖的头文件库
Android.mk
LOCAL_HEADER_LIBRARIES := 

Android.bp
header_libs: ["xxx", "xxx", ...]
3.4、依赖的Java库
Android.mk
LOCAL_STATIC_JAVA_LIBRARIES := 

Android.bp
static_libs: ["xxx", "xxx", ...]

安装到不同分区中

4.1、安装到vendor中
Android.mk
LOCAL_VENDOR_MODULE := true
        or
LOCAL_PROPRIETARY_MODULE := true

Android.bp
proprietary: true
    or
vendor: true

⚠️ 注意:
LOCAL_PROPRIETARY_MODUL,true控制生成路径到vendor/lib,false就是system/lib LOCAL_CLANG,clang:true来指定默认编译器为Clang,Android 8.0后不需要指定,默认是Clang
4.2、安装到product中
Android.mk
LOCAL_PRODUCT_MODULE := true

Android.bp
product_specific: true
4.3、安装到odm中
Android.mk
LOCAL_ODM_MODULE := true

Android.bp
device_specific: true

编译参数

5.1、C flags
Android.mk
LOCAL_CFLAGS := 

Android.bp
cflags: ["xxx", "xxx", ...]
5.2、Cpp flags
Android.mk
LOCAL_CPPFLAGS := 

Android.bp
cppflags: ["xxx", "xxx", ...]
5.3、Java flags
Android.mk
LOCAL_JAVACFLAGS := 

Android.bp
javacflags: ["xxx", "xxx", ...]

语法

Android.bp 文件是 Soong 构建系统中的构建描述文件,用于配置 Android 项目的构建规则。以下是 Android.bp 文件的主要语法要点:
模块类型定义:
使用 module_type 字段指定模块的类型,例如 module_type: “android_library” 或 module_type: “android_app”。
模块名定义:
使用 name 字段指定模块的名称,例如 name: “MyLibrary”。
模块属性:
使用各种字段来定义模块的属性,例如 srcs(源文件列表)、cflags(编译选项)、include_dirs(包含目录)等。
例如:

默认属性集:
使用 defaults 字段引用一个默认属性集,以便继承一组默认的属性。例如:

模块依赖关系:
使用 deps 字段指定模块的依赖关系,即依赖于其他模块。例如:

可选依赖关系:
使用 optional_uses_libs 字段指定可选的依赖关系。例如:

构建配置块:
使用 build 字段定义一个构建配置块,其中可以包含 target、host 或 device 等不同配置。例如:

构建工具配置:
使用 tool 字段配置构建过程中使用的工具。例如:

标记特定模块属性:
使用 tags 字段给模块打标签,以便在其他模块中引用。例如:

架构相关配置:
使用 arch 字段指定特定的架构相关配置。例如:

变量和函数:
可以使用变量和函数来简化配置。例如:

命名空间:

使用 namespace 字段来定义一个命名空间,将一组模块组织在同一个命名空间下。例如:

模块分隔:
使用 group 字段将一组模块组织在同一个分组中,以便对它们应用相同的配置。例如:

源文件通配符:
使用通配符指定源文件,例如 srcs: [“src/**/*.c”],表示匹配 src 目录及其所有子目录下的所有 .c 文件。

条件语句:
使用条件语句来根据不同的条件执行不同的配置。例如:

标签过滤:
使用 required 和 host_required 字段指定模块的标签过滤条件。例如:

模块替代:
使用 overrides 字段指定被当前模块替代的其他模块。例如:

私有模块属性:
使用 private 字段指定私有属性,这些属性只能在同一 Android.bp 文件中的其他属性块中使用。例如:

自动生成的源文件:
使用 generated_sources 字段指定由构建系统自动生成的源文件。例如:

构建工具:
使用 tool 字段指定使用的构建工具及其配置。例如:

举例

这个 Android.bp 文件是一个用于构建 Android 应用程序模
块的配置文件,采用 Soong 构建系统的语法。以下是对文件中的各个部分的详细解释:

android_app 模块类型:

android_app 是 Android 构建系统中用于定义 Android 应用程序模块的一种模块类型。
这个模块类型表示一个Android应用程序,它将编译成一个APK文件。
模块的基本信息:

name: “TvLocalMediaPlayer”:指定应用程序模块的名称为 “TvLocalMediaPlayer”。
defaults: [“xxx_DexPreOptVariant_defaults”]:引用了一个名为 “xxx_DexPreOptVariant_defaults” 的默认配置。
源代码和资源文件:

srcs: [“src//*.java", "src//*.kt”]:指定了Java和Kotlin源代码文件的路径,这些文件将被编译成应用程序的可执行代码。
resource_dirs: [“res”]:指定了资源文件的路径,这些资源文件将被包含在最终的APK中。
可选使用的库:

optional_uses_libs: [“javax.obex”]:指定了一个可选使用的库,即 javax.obex。如果该库可用,则将其链接到应用程序中。
静态库依赖关系:

static_libs 部分列举了应用程序依赖的静态库模块。这些库模块将被链接到应用程序中。
例如,“com.mediatek.exoplayerlib”、“com.mediatek.tv.oneworld.basic” 等。
证书和平台相关属性:

certificate: “platform”:指定应用程序使用平台证书进行签名,这是 Android 平台的标准做法。
platform_apis: true:表明该应用程序使用了 Android 平台的 API。
privileged: true:表明该应用程序是特权应用,可能需要更高的系统权限。
system_ext_specific: true:

system_ext_specific: true:表明该应用程序是专门为 System Ext 分区设计的,System Ext 是 Android 10 引入的一个扩展系统分区。

优化配置:
optimize 部分定义了一些优化配置。
proguard_flags_files: [“proguard.flags”]:指定了 ProGuard 优化的配置文件。

overrides: [“LiveTv”]:
overrides 部分列举了该应用程序覆盖的其他模块,这里是 “LiveTv”。这意味着当前应用程序可能包含或修改了 “LiveTv” 模块的一些功能。
                        
详情可以参考链接:https://blog.csdn.net/yikezhuixun/article/details/135992076

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值