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 ...
随机推荐
- ubuntu修改时区
1.网上大部分解决办法是命令tzselect,然后选择亚洲-->中国->上海,但很遗憾,一点效果没有: 2.后找到解决办法,运行命令dpkg-reconfigure tzdata,选择As ...
- java中的锁之Lock接口与Condition接口
一.Lock源码. 1.是一个接口.一共有6个方法. 2.方法详细如下: (1)当前线程尝试获取锁.结果分两种情况,一是成功获取到锁,则返回:二是获取锁失败,则一直等待.不响应中断请求. (2)当前线 ...
- Rigid Frameworks (画图二分图规律 + DP + 数学组合容斥)
题意:方格n*m,然后对于每一个格子有3种画法1左对角线2右对角线3不画,求让图形稳定的画法有多少种? 思路:通过手画二分图可以发现当二分图联通时改图满足条件,然后我们对于一个dp[n][m]可以利用 ...
- 网易新网 spider
# -*- coding: utf-8 -*- import os import sys import urllib.request import requests import re from lx ...
- java 序列化和反序列化的实现原理
老是听说序列化反序列化,就是不知道到底什么是序列化,什么是反序列化?今天就在网上搜索学习一下,这一搜不要紧,发现自己曾经用过,竟然不知道那就是JDK类库中序列化和反序列化的API. ----什么是序列 ...
- 设计模式之Observer(观察者)(转)
Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...
- 配置开发环境2——eclipse配置
纯手动配置eclipse, Eclipse配置 配置工作空间的编码方式 General—Workspace:改成Other:UTF-8 配置property的编码方式 配置maven Window — ...
- JAVA基础2---深度解析A++和++A的区别
我们都知道JAVA中A++和++A在用法上的区别,都是自增,A++是先取值再自增,++A是先自增再取值,那么为什么会是这样的呢? 1.关于A++和++A的区别,下面的来看个例子: public cla ...
- 转:三值逻辑与NULL的处理方式
来自:<Microsoft SQL SERVER 2008技术内幕 T-SQL查询>P7 在SQL中谓词(逻辑表达式)的可能值为TRUE.FALSE和UNKNOWN.这就是所谓的三值逻辑, ...
- Google自动广告,将广告代码放置在 HTML 中的什么位置?
Google自动广告,将广告代码放置在 HTML 中的什么位置? 为自动广告生成广告代码后,您需要将此代码放置在要展示广告的每个网页中.您应将广告代码放置在网页的 <head> 标记(或正 ...