Android.bp 语法和使用
1. Android.bp 文件是什么?
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,目前 Android Q 里边,还是支持 Android.mk 方式的。相信在将来的版本中,会彻底让 mk 文件废弃,同时 Kati 也就淘汰了,只保留 bp 配置方式,所以我们要提前学习
bp。
这里涉及到Ninja, kati, Soong, bp概念,接下来分别简单介绍一下。
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。
2. 语法对应规则
我们可能已经习惯了Android.mk 中的语法,现在要变更为 Android.bp, 为了便于理解,可以找到源码,查看Android.mk 与 Android.bp 语法对应规则:
源码位置: /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_installable", // will be rewritten to java_library by bpfix"BUILD_STATIC_JAVA_LIBRARY": "java_library","BUILD_HOST_JAVA_LIBRARY": "java_library_host","BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik","BUILD_PACKAGE": "android_app","BUILD_CTS_EXECUTABLE": "cc_binary", // will be further massaged by bpfix depending on the output path"BUILD_CTS_SUPPORT_PACKAGE": "cts_support_package", // will be rewritten to android_test by bpfix"BUILD_CTS_PACKAGE": "cts_package", // will be rewritten to android_test by bpfix"BUILD_CTS_TARGET_JAVA_LIBRARY": "cts_target_java_library", // will be rewritten to java_library by bpfix"BUILD_CTS_HOST_JAVA_LIBRARY": "cts_host_java_library", // will be rewritten to java_library_host by bpfix
}var prebuiltTypes = map[string]string{"SHARED_LIBRARIES": "cc_prebuilt_library_shared","STATIC_LIBRARIES": "cc_prebuilt_library_static","EXECUTABLES": "cc_prebuilt_binary","JAVA_LIBRARIES": "java_import","ETC": "prebuilt_etc",
}
3. 如何把Android.mk 文件转换成 Android.bp
1. 在工程源码中:
1. source build/envsetup.sh
2. lunch xxx
3. make androidmk
生成androidmk转换工具,路径为:/out/soong/host/linux-x86/bin/androidmk
2. 直接把你要转换的Android.mk 文件放置到此目录下,然后执行命令:
androidmk Android.mk > Android.bp
4. 语法讲解
为了便于理解,把Android.mk 和 Android.bp 的语法放在一起说明,更容易理解一点:
4.1 编译不同类型的模块
4.1.1 编译成 Java 库
Android.mk
include $(BUILD_JAVA_LIBRARY)Android.bp
java_library {
......
}
4.1.2 编译成 Java 静态库
Android.mk
include $(BUILD_STATIC_JAVA_LIBRARY)Android.bp
java_library_static {
......
}
4.1.3 编译成 App 应用
Android.mk
include $(BUILD_PACKAGE)Android.bp
android_app {
......
}
4.1.4 编译成 Native 动态库
Android.mk
include $(BUILD_SHARED_LIBRARY)Android.bp
cc_library_shared {
......
}
4.1.5 编译成 Native 静态库
Android.mk
include $(BUILD_STATIC_LIBRARY)Android.bp
cc_library_static {
......
}
4.1.6 编译成 Native 执行程序
Android.mk
include $(BUILD_EXECUTABLE)Android.bp
cc_binary {
......
}
4.1.7 编译成头文件库
Android.mk
include $(BUILD_HEADER_LIBRARY)Android.bp
cc_library_headers {
......
}
4.2 文件路径
4.2.1 本地头文件路径
Android.mk
LOCAL_C_INCLUDES := Android.bp
local_include_dirs: ["xxx", ...]
4.2.2 导出的头文件路径
Android.mk
LOCAL_EXPORT_C_INCLUDE_DIRS := Android.bp
export_include_dirs: ["xxx", ...]
4.2.3 资源文件路径
Android.mk
LOCAL_RESOURCE_DIR := Android.bp
resource_dirs: ["xxx", ...]
4.3 库依赖
4.3.1 依赖的静态库
Android.mk
LOCAL_STATIC_LIBRARIES := Android.bp
static_libs: ["xxx", "xxx", ...]
4.3.2 依赖的动态库
Android.mk
LOCAL_SHARED_LIBRARIES := Android.bp
shared_libs: ["xxx", "xxx", ...]
4.3.3 依赖的头文件库
Android.mk
LOCAL_JAVA_LIBRARIES := Android.bp
header_libs: ["xxx", "xxx", ...]
4.3.4 依赖的 Java 库
Android.mk
LOCAL_STATIC_JAVA_LIBRARIES := Android.bp
static_libs: ["xxx", "xxx", ...]
4.4 安装到不同分区中
4.4.1 安装到vendor中
Android.mk
LOCAL_VENDOR_MODULE := trueor
LOCAL_PROPRIETARY_MODULE := trueAndroid.bp
proprietary: trueor
vendor: true
4.4.2 安装到product中
Android.mk
LOCAL_PRODUCT_MODULE := trueAndroid.bp
product_specific: true
4.4.3 安装到odm中
Android.mk
LOCAL_ODM_MODULE := trueAndroid.bp
device_specific: true
4.5 编译参数
4.5.1 C flags
Android.mk
LOCAL_CFLAGS := Android.bp
cflags: ["xxx", "xxx", ...]
4.5.2 Cpp flags
Android.mk
LOCAL_CPPFLAGS := Android.bp
cppflags: ["xxx", "xxx", ...]
4.5.3 Java flags
Android.mk
LOCAL_JAVACFLAGS := Android.bp
javacflags: ["xxx", "xxx", ...]
4.6 后续再总结继续更新
Android.bp 语法和使用相关推荐
- Android 10 根文件系统和编译系统(十八):Android.bp语法
配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:AOSP Android10.0 设备:Android x86模拟器 前言 由于make在编译时表现出效率不够高.增 ...
- log+android+bp,第二章:Android.bp语法
一. Android.bp语法初识 1.1 模块 从前面的列子可以看出定义一个模块从模块的类型开始,模块有不同的类型,如前面例子中的cc_library_shared,当然类型还有很多种,譬如cc_b ...
- Android.bp 语法浅析-Android10.0编译系统(八)
摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...
- android bp文件_Android 基础 | Android.bp 语法浅析
相关推荐: 随着 android 工程越来越大,包含的 module 越来越多,以 makefile 组织的项目编译花费的时间越来越多.Google 在 7.0 引入了 ninja 是 Google ...
- android bp文件_理解Android.bp
介绍Android最新的编译系统 一.简介 早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp.很明显Android.bp的出现 ...
- android mk与bp,Android.bp你真的了解吗
Android.bp你真的了解吗 前言 最近在捣鼓Android 9 和10的build系统,看到一篇比较好的博客,大名鼎鼎的gityuan的,奉上链接理解Android.bp,为了方便学习和更多的人 ...
- Android.bp编译提示ninja: error: unknown target ‘MODULES-IN-xxx‘终极指南
Android.bp编译提示ninja: error: unknown target 'MODULES-IN-xxx'终极指南 Android.bp系列博客: Android.bp你真的了解吗 And ...
- Android.bp学习
一. Android.bp概念 Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk文件的.在Android7.0 以前,Android 都 ...
- android bp文件_Android编译系统中的Android.bp【转】
本文转载自: 转自:http://note.qidong.name/2017/08/android-blueprint/ Android编译系统中的Android.bp.Blueprint与Soong ...
最新文章
- 诺基亚主导Windows Phone手机市场 前景仍然堪忧
- TextBoxSuggest,输入框提示工具,输入建议,输入匹配,辅助输入,输入即时提示,文本编辑器,Visual Studio效果,高速查询引擎,哈希树,模糊匹配,百万条零毫秒
- 2018我的Java高级工程师面试总结
- 方向盘开极品飞车9很Hapyy
- centos7恢复mysql数据库_mysql数据库恢复过程记录
- vue 计算属性_lt;Vue 源码笔记系列6gt;计算属性 computed 的实现
- mysql偏差聚集_My SQL聚合函数
- vba 根据分辨率 调整窗口显示比例_2020 如何选择适合自己的显示器?小白选购电脑显示器必看,附各类型显示器高性价比选购指南分析...
- cortex_m0架构(顶层AHB_Lite接口)
- 1.6 Dropout 正则化
- cloud_config学习_1
- Spring 三种bean装配的方式
- rabbitMQ碰到了对象跨项目的时候,反序列化出了问题
- spark 运行自带python示例的方式
- VC中自动改变控件位置和大小的对话框类
- 解决 No utmpx entry. You must exec login from the lowest level shell.
- Redis 增加互斥锁
- C#开发工控上位机编程 csdn_5种将死的编程语言
- TSMaster1.4.2补丁包发布
- 开源一个简单的android手机音乐app
热门文章
- 小程序自动化测试框架原理剖析
- Kafka原理+操作+实战
- 关于前端导出文件打不开的问题
- 《魔兽世界》的魅力究竟在哪儿?
- Navicat for Oracle配置
- linux车牌识别,基于嵌入式Linux的电子车牌识别系统设计与实现
- 为什么我选择离开工作9年的腾讯?
- project Structure中的Artifacts是什么
- 蓝屏代码: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bootsafe64.sys
- vmware 恢复快照时出错