Android编译系统中的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生效。
Blueprint和Soong都是由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
进行环境准备。 其中会先编译、安装Blueprint到out
目录下。 也就是说,在编译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的概念。 而=
前面的name
、srcs
等,就是该模块的属性(property)。
subdirs
是一个文件级的顶层属性,指定后会查找次级目录下的Android.bp。 类似于Android.mk中常用的include $(call all-subdir-makefiles)
。
模块是可以继承属性的。 cc_defaults
就是一个文件中所有模块的父模块,可以指定公用的属性。 在以上代码中,cc_library
模块虽然没有指定,但已经包含了deps
属性。
语法
Blueprint文件的语法比较简单,毕竟只是配置文件。
变量与属性都是动态强类型的,赋值时确定。 变量类型只有四种。
- Bool(
true
或false
) - 字符串Strings(”string”)
- 字符串列表(
["string1", "string2"]
) - 映射关系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_binary
、cc_library
这样的模块,每个模块又支持多少像name
、cflags
这样的属性, 则只能去查找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编译系统中的Android.bp【转】的更多相关文章
- Android编译系统中的Android.bp
https://www.cnblogs.com/bluestorm/p/10895005.html Android.bp,是用来替换Android.mk的配置文件. 它使用Blueprint框架来解析 ...
- 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)
第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...
- 在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7514559 在Android系统中修改android.mk使其同时编译rgb2565和rgb ...
- android应用中去android市场去评分的功能实现(吐槽一波个人应用上线...)
一般的app可能会有这中功能,在应用中去android商店评分来提高排名,前段时间也把我的博客园上传到商店,这里不得不吐槽一些android商店的开放平台. 酷派,vivo,oppo,联想不支持个人开 ...
- 在Android Studio中打开Android Device Monitor时报错的解决方法
在Android Studio中打开Android Device Monitor时报以下错误时(Android-SDK\tools\lib\monitor-x86_64\configuration\1 ...
- 【转】在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)
在Android Studio中下载Android SDK的两种方式(Android Studio3.0.windows) 方式一.设置HTTP Proxy1. 打开Settings2. 点击HTTP ...
- Android编译系统中的Kconfig,Makefile,.config编译系统浅析
在对Android进行编译时,用的就是Linux下的Makefile和Kconfig编译系统,对整个系统进行编译.当然还包括很多配置命令,比如make defconfig, make oldconfi ...
- Android: NDK中的Android.mk和Application.mk
1. 简介 Android.mk 可用来描述要编译的某个具体模块的相关信息.比如:指定编译该模块时所需要的源文件.编译该模块时要链接的库文件.该模块编译完成后生成的库的名字等等.Applicatio ...
- 手把手教android studio中安装Android Butterknife Zelezny (转)
原文地址:http://blog.csdn.net/xin917480852/article/details/51176524 用来快速生成findViewById() 安装方法: 打开Android ...
随机推荐
- Windows搭建react-native开发环境
一.目标平台 windows+android 1. 必须软件 python2+ nodejs npm 2. 安装react-native命令行 $ npm install -g react-nativ ...
- 有关Struts下载文件时报错问题
在学习文件下载的时候,我也是按照网络课程上面老师的代码一句一句敲得,和老师的一模一样:到最后测试下载的时候出现了如下的错误: 而老师的写的代码可以完美运行,以下是跟着老师敲的代码: package c ...
- docker tool
安装docker tool http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ 安装1.8.3 有把vbox等服务器地址加 ...
- Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现
https://blog.csdn.net/zouxy09/article/details/9993371 自己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一 ...
- sitecore中的两种编辑工具介绍
在Sitecore中,有两种编辑工具,您可以在其中创建和编辑网站上的内容: 内容编辑器 - 专为熟悉Sitecore及其包含的功能的经验丰富的内容作者而设计的应用程序. 体验编辑器 - 一种直观的编辑 ...
- Sitecore标准模板字段
在Sitecore中,数据模板定义数据类型.数据模板可以包含任意数量的节,其中每个节可视地分组一些字段.Sitecore标准模板为大多数其他数据模板定义了基本模板./ sitecore / templ ...
- sql server 中后缀为.mdf的文件是干什么用的??
在微软的SQL Server 2000 数据库有三种类型的文件: 1)主要数据文件(扩展名.mdf是 primary data file 的缩写) 主要数据文件包含数据库的启动信息,并指向数据库中的其 ...
- python 内置函数 sorted()
sorted() 函数对所有可迭代的对象进行排序操作. sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 s ...
- 配置开发环境2——eclipse配置
纯手动配置eclipse, Eclipse配置 配置工作空间的编码方式 General—Workspace:改成Other:UTF-8 配置property的编码方式 配置maven Window — ...
- foreach 语句
foreach 语句很适合用来枚举 如数组.列表.集合之类的数据结构中的元素. 不必准确知道元素个数.如果基数据不包含任何元素,则foreach循环不执行 foreach(<元素> ...