摘要:Android.bp由Blueprint进行解析翻译,最终通过soong build编译成ninja文件,那么Blueprint是什么呢?

阅读本文大约需要花费10分钟。

文章首发微信公众号:IngresGe

专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢!

欢迎关注我的公众号!

[Android取经之路] 的源码都基于Android-Q(10.0) 进行分析

[Android取经之路] 系列文章:

《系统启动篇》

  1. Android系统架构
  2. Android是怎么启动的
  3. Android 10.0系统启动之init进程
  4. Android10.0系统启动之Zygote进程
  5. Android 10.0 系统启动之SystemServer进程
  6. Android 10.0 系统服务之ActivityMnagerService
  7. Android10.0系统启动之Launcher(桌面)启动流程
  8. Android10.0应用进程创建过程以及Zygote的fork流程
  9. Android 10.0 PackageManagerService(一)工作原理及启动流程
  10. Android 10.0 PackageManagerService(二)权限扫描
  11. Android 10.0 PackageManagerService(三)APK扫描
  12. Android 10.0 PackageManagerService(四)APK安装流程

《日志系统篇》

  1. Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性
  2. Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化
  3. Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析
  4. Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现​

《Binder通信原理》

  1. Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要
  2. Android10.0 Binder通信原理(二)-Binder入门篇
  3. Android10.0 Binder通信原理(三)-ServiceManager篇
  4. Android10.0 Binder通信原理(四)-Native-C\C++实例分析
  5. Android10.0 Binder通信原理(五)-Binder驱动分析
  6. Android10.0 Binder通信原理(六)-Binder数据如何完成定向打击
  7. Android10.0 Binder通信原理(七)-Framework binder示例
  8. Android10.0 Binder通信原理(八)-Framework层分析
  9. Android10.0 Binder通信原理(九)-AIDL Binder示例
  10. Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式
  11. Android10.0 Binder通信原理(十一)-Binder总结

  《HwBinder通信原理》

  1. HwBinder入门篇-Android10.0 HwBinder通信原理(一)
  2. HIDL详解-Android10.0 HwBinder通信原理(二)
  3. HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)
  4. HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)
  5. HwServiceManager篇-Android10.0 HwBinder通信原理(五)
  6. Native层HIDL服务的注册原理-Android10.0 HwBinder通信原理(六)
  7. Native层HIDL服务的获取原理-Android10.0 HwBinder通信原理(七)
  8. JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)
  9. JAVA层HIDL服务的获取原理-Android10.0 HwBinder通信原理(九)
  10. HwBinder驱动篇-Android10.0 HwBinder通信原理(十)
  11. HwBinder原理总结-Android10.0 HwBinder通信原理(十一)

《编译原理》

  1. 编译系统入门篇-Android10.0编译系统(一)
  2. 编译环境初始化-Android10.0编译系统(二)
  3. make编译过程-Android10.0编译系统(三)
  4. Image打包流程-Android10.0编译系统(四)
  5. Kati详解-Android10.0编译系统(五)
  6. Blueprint简介-Android10.0编译系统(六)
  7. Blueprint代码详细分析-Android10.0编译系统(七)

1 概述

blueprint没有一个官方的文档,代码中有build/buleprint/doc.go 和 build/blueprint/README.md两个简要介绍可供参考。

Blueprint是一个meta-build系统,它读取描述需要构建的模块的bp文件,并生成[Ninja](http://martine.github.io/ninja/)描述需要运行的命令及其依赖项的清单。

大多数构建系统使用内置规则或特定域的语言来描述模块如何转换为构建规则的逻辑,Blueprint将其委托给Go中编写的每个项目构建逻辑。

对于大型、异构的项目,这使得构建逻辑的内在复杂性可以用高级语言来维护,同时仍然允许通过修改易于理解的Blueprint文件对单个模块进行简单的更改。

Blueprint使用引导过程来允许Blueprint的代码、构建逻辑的代码和正在编译的项目的代码都在项目中。

层之间的依赖关系被完全跟踪-对逻辑代码的更改将导致重新编译逻辑,重新生成项目生成清单,并运行修改后的项目规则。

对Blueprint本身的更改将导致Blueprint重新构建,然后重新构建逻辑,等等。

Blueprint文件是一个伪python数据格式的模块列表,其中模块类型看起来像函数调用,模块的属性看起来像可选参数。例如,一个简单的模块可能看起来像:

 cc_library {name: "cmd",srcs: ["main.c",],deps: ["libc",],}subdirs = ["subdir1", "subdir2"]

Blueprint读取顶层Blueprint文件中的模块以及递归地通过“subdirs”变量列出的任何子目录的模块,它们的属性按模块类型存储到属性结构中。

一旦读取了所有模块,Blueprint将按注册顺序调用任何已注册的赋值函数(Mutators)。

赋值函数(Mutators)可以自上而下或自下而上访问每个模块,并根据需要修改它们。

常见的修改包括设置模块的属性以将信息从依赖项传播到从属项(例如,告诉模块哪些父类依赖于它),或者将模块拆分为多个变量(例如,正在编译的每个体系结构一个变量)。

在所有的赋值函数(Mutators)运行之后,每个模块都被要求根据属性值生成构建规则,然后单例可以从所有模块的输出生成任何构建规则。

每个项目的构建逻辑定义了一个顶层命令,在文档中称为“主构建器”。

此命令负责注册项目所需的模块类型以及任何单例或赋值函数,然后使用根Blueprint文件的路径调用Blueprint。

2 代码位置

代码位置:

build/blueprint

Google代码托管路径:

 https://github.com/google/blueprint

3 Soong编译系统家族成员

Blueprint负责解析Android.bp生成规则,翻译成*.ninja文件。Soong_build生成out/soong/build.ninja编译。

4. blueprint-soong的执行过程

android需要先将blueprint和soong进行编译,然后才能识别项目中的android.bp文件,如何生成blueprint和soong,就在bootstarp中实现,具体的实现步骤如下:

  1)通过build/blueprint/bootstrap.bash    生成out/soong/.minibootstrap/build.ninja

[out/soong/.minibootstrap/build.ninja]内容如下:
bootstrapBuildDir = out/soong
topFile = ./Android.bp
extraArgs =  -t -l out/.module_paths/Android.bp.list
builddir = out
include ./build/blueprint/bootstrap/build.ninja

2)生成minibp 和bpglob

运行build/blueprint/microfactory/microfactory.bash,

加载out/soong/.minibootstrap/build.ninja 来生成minibp,同时,生成bpglob。

BUILDDIR="${BUILDDIR}/.minibootstrap" build_go minibp github.com/google/blueprint/bootstrap/minibp
BUILDDIR="${BUILDDIR}/.minibootstrap" build_go bpglob github.com/google/blueprint/bootstrap/bpglob

3) 生成out/soong/.bootstrap/build.ninja

minibp解析Android.bp用来生成out/soong/.bootstrap/build.ninja。其中的语法如下:

[build/blueprint/bootstrap/build.ninja]
rule build.ninjacommand = ${builder} ${extraArgs} -b ${bootstrapBuildDir} -n ${builddir} -d ${out}.d -globFile ${myGlobs} -o ${out} ${in}deps = gccdepfile = ${out}.ddescription = ${builder} ${out}bootstrapNinja = ${bootstrapBuildDir}/.bootstrap/build.ninjabuild ${bootstrapNinja}: build.ninja ${topFile} | ${builder}builder = ${bootstrapBuildDir}/.minibootstrap/minibp
default ${bootstrapNinja}

命令展开后:

out/soong/.minibootstrap/minibp -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d build.ninja.d -globFile out/soong/.minibootstrap/build-globs.ninja -o build.ninja ${in}
build out/soong/.bootstrap/build.ninja:  build.ninja ./Android.bp out/soong/.minibootstrap/minibp

mibp最终编译生成out/soong/.bootstrap/build.ninja

4)生成out/soong/build.ninja文件从下面可知:

通过out/soong/.bootstrap/bin/soong_build 编译out/.module_paths/Android.bp.list 及out/soong/.bootstrap/build-globs.ninja 来生成out/soong/build.ninja其中out/.module_paths/Android.bp.list 包含了工程中所有的Android.bp

[out/soong/.bootstrap/build.ninja]
g.bootstrap.BinDir = out/soong/.bootstrap/bin
g.bootstrap.buildDir = out/soong
g.bootstrap.srcDir = .build ${g.bootstrap.buildDir}/build.ninja: g.bootstrap.build.ninja $${g.bootstrap.srcDir}/Android.bp | ${builder}builder = ${g.bootstrap.BinDir}/soong_buildextra = -t -l out/.module_paths/Android.bp.listglobFile = out/soong/.bootstrap/build-globs.ninja
default ${g.bootstrap.buildDir}/build.ninja

5)通过ninja来完成编译

编译命令:

 ./prebuilts/build-tools/linux-x86/bin/ninja -w dupbuild=err -f out/soong/build.ninja "$@"

5.总结

bluepring--soong的编译过程经历下面四个阶段:

1.运行microfactory.bash以建立minibp -

2.运行.minibootstrap / build.ninja来构建.bootstrap / build.ninja -

3.运行.bootstrap / build.ninja来构建和运行主构建器 -

4.运行build.ninja来构建您的代码

我的微信公众号:IngresGe

Blueprint简介-Android10.0编译系统(六)相关推荐

  1. Ninja简介-Android10.0编译系统(九)

    摘要:Ninja具体干了什么? 阅读本文大约需要花费16分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关注我的公众 ...

  2. Blueprint代码详细分析-Android10.0编译系统(七)

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

  3. 编译系统总结篇-Android10.0编译系统(十一)

    摘要:Android10.0编译系统总结 阅读本文大约需要花费20分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关 ...

  4. Ninja提升编译速度的方法-Android10.0编译系统(十)

    摘要:如何通过Ninja来提升Android编译速度 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢 ...

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

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

  6. Kati详解-Android10.0编译系统(五)

    摘要:本节主要来讲解Kati把Makefile编译成build-xxx.ninja,那么Kati是什么? 是如何工作的呢? 阅读本文大约需要花费24分钟. 文章首发微信公众号:IngresGe 专注于 ...

  7. Image打包流程-Android10.0编译系统(四)

    摘要:本节主要来进行Android10.0 Image打包流程,理解system.img是如何打包的 阅读本文大约需要花费28分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源 ...

  8. make编译过程-Android10.0编译系统(三)

    摘要:本节主要来进行Android10.0 编译系统的make过程 阅读本文大约需要花费29分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计, ...

  9. Android10.0系统启动之Zygote进程-[Android取经之路]

    [Android取经之路] 的源码都基于Android-Q(10.0) 进行分析 [Android取经之路] 系列文章: <系统启动篇> Android系统架构 Android是怎么启动的 ...

最新文章

  1. pytorch 加载模型报错:‘function‘ object has no attribute ‘copy‘
  2. mysql的服务器在什么模式下工作_MySQL服务器的SQL模式 (转)
  3. 《微软的梦工场》 笔记(1)
  4. 取消数据源的自动创建,使用Seata对数据源进行代理
  5. 关于Ecllipse
  6. switch case 遇到判断type分支的写法
  7. win10 打开注册表
  8. Linux操作系统——Linux 内核源码介绍内核升级
  9. goeasy+jquery+ckplayer实现动态实时视频弹幕
  10. ArcGIS jsAPI 本地部署字体符号乱码
  11. sci国外期刊投稿过程(已完结)
  12. win10升级系统版本的步骤,win10电脑如何升级系统版本
  13. 用python制作音乐_Python3使用PySynth制作音乐的方法
  14. Redis 部署方式(单点、master/slaver、sentinel、cluster) 概念与区别
  15. 如何设置谷歌浏览器在新窗口中打开链接
  16. 专业项目管理软件统御项目管理系统V7.0(oKit)试用感受
  17. CSDN博客论坛——读好书,畅想“我的IT成长路”活动【已完成】
  18. C/C++ 内使用贝塞尔函数
  19. BI是什么,BI的解释
  20. 中国科学院院士徐宗本:人工智能的基石是数学

热门文章

  1. MATLAB表白利器
  2. getCount()和getChildCount()区别
  3. dev 点击子控件触发panelcontrol事件_LINUX IIO子系统分析之二 IIO子系统数据结构分析...
  4. 二十五:设计模式的总结
  5. # 可视化工具资源汇总
  6. Spring3.x与jdk8兼容问题
  7. 《Visual Studio Hacks 》(十)
  8. Winform控件:打开文件对话框(OpenFileDialog)
  9. 使用敏捷回顾实施组织变革
  10. 很全的SQL注入语句,有SQL漏洞的都可以拿下