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 语法和使用相关推荐

  1. Android 10 根文件系统和编译系统(十八):Android.bp语法

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:AOSP Android10.0 设备:Android x86模拟器 前言 由于make在编译时表现出效率不够高.增 ...

  2. log+android+bp,第二章:Android.bp语法

    一. Android.bp语法初识 1.1 模块 从前面的列子可以看出定义一个模块从模块的类型开始,模块有不同的类型,如前面例子中的cc_library_shared,当然类型还有很多种,譬如cc_b ...

  3. Android.bp 语法浅析-Android10.0编译系统(八)

    摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...

  4. android bp文件_Android 基础 | Android.bp 语法浅析

    相关推荐: 随着 android 工程越来越大,包含的 module 越来越多,以 makefile 组织的项目编译花费的时间越来越多.Google 在 7.0 引入了 ninja 是 Google ...

  5. android bp文件_理解Android.bp

    介绍Android最新的编译系统 一.简介 早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp.很明显Android.bp的出现 ...

  6. android mk与bp,Android.bp你真的了解吗

    Android.bp你真的了解吗 前言 最近在捣鼓Android 9 和10的build系统,看到一篇比较好的博客,大名鼎鼎的gityuan的,奉上链接理解Android.bp,为了方便学习和更多的人 ...

  7. Android.bp编译提示ninja: error: unknown target ‘MODULES-IN-xxx‘终极指南

    Android.bp编译提示ninja: error: unknown target 'MODULES-IN-xxx'终极指南 Android.bp系列博客: Android.bp你真的了解吗 And ...

  8. Android.bp学习

    一. Android.bp概念 Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk文件的.在Android7.0 以前,Android 都 ...

  9. android bp文件_Android编译系统中的Android.bp【转】

    本文转载自: 转自:http://note.qidong.name/2017/08/android-blueprint/ Android编译系统中的Android.bp.Blueprint与Soong ...

最新文章

  1. 诺基亚主导Windows Phone手机市场 前景仍然堪忧
  2. TextBoxSuggest,输入框提示工具,输入建议,输入匹配,辅助输入,输入即时提示,文本编辑器,Visual Studio效果,高速查询引擎,哈希树,模糊匹配,百万条零毫秒
  3. 2018我的Java高级工程师面试总结
  4. 方向盘开极品飞车9很Hapyy
  5. centos7恢复mysql数据库_mysql数据库恢复过程记录
  6. vue 计算属性_lt;Vue 源码笔记系列6gt;计算属性 computed 的实现
  7. mysql偏差聚集_My SQL聚合函数
  8. vba 根据分辨率 调整窗口显示比例_2020 如何选择适合自己的显示器?小白选购电脑显示器必看,附各类型显示器高性价比选购指南分析...
  9. cortex_m0架构(顶层AHB_Lite接口)
  10. 1.6 Dropout 正则化
  11. cloud_config学习_1
  12. Spring 三种bean装配的方式
  13. rabbitMQ碰到了对象跨项目的时候,反序列化出了问题
  14. spark 运行自带python示例的方式
  15. VC中自动改变控件位置和大小的对话框类
  16. 解决 No utmpx entry. You must exec login from the lowest level shell.
  17. Redis 增加互斥锁
  18. C#开发工控上位机编程 csdn_5种将死的编程语言
  19. TSMaster1.4.2补丁包发布
  20. 开源一个简单的android手机音乐app

热门文章

  1. 小程序自动化测试框架原理剖析
  2. Kafka原理+操作+实战
  3. 关于前端导出文件打不开的问题
  4. 《魔兽世界》的魅力究竟在哪儿?
  5. Navicat for Oracle配置
  6. linux车牌识别,基于嵌入式Linux的电子车牌识别系统设计与实现
  7. 为什么我选择离开工作9年的腾讯?
  8. project Structure中的Artifacts是什么
  9. 蓝屏代码: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS bootsafe64.sys
  10. vmware 恢复快照时出错