最近在项目中接触到libchrome这一开源库, 发现了其中一些有价值的内容,想着将其它独立编译成第三方的动态库,然后在其它的项目中也能用到。所以开始了解它是怎么编译的,但在实际熟悉编译相关的规则发现libchrome的编译是依赖Android系统的编译环境. 所以就开始琢磨怎么能够独立编译该第三方库呢?于是乎就先不管怎么独立的编译而是先开始了解libchrome中提供的编译规则文件Android.bp. 接下来的系列文章会记录并分享学习以及应用Android.bp的过程.

开始了解Android 系统的编译框架

Android 7以前的版本,Android是基于GNU Make进行构建的,相关的编译规则文件 **.mk. 由于基于Make的编译规则和构建方式我们已经很熟悉,在这里就不在过多描述. 在之后的Android系统的版本中开始推出了一个名为 “Soong”的编译(构建)框架, 相对Make更加的高效.

那什么是Soong呢?Google官网中有关于它的描述What is Soong? 这里在补充说明几点:

  1. Soong这一新的构建系统是为了替代之前的GNU Make
  2. 由于当前的Android版本(这里指的是Android P)中还有由.mk定义编译规则的代码仓库,导致目前Android系统是Soong和GNU Make共存的一个状态
  3. Soong是由Kati、Ninja等组件构成,Kati是负责将*.mk 文件转换为bp文件, 而ninja是一个高效的构建工具-相关的文件是.ninja, 而当前Google在新的代码仓库中使用了Android.bp 定义了模块的构建规则,而Android.bp是通过blueprint/soong 转换为*.ninja格式文件

摘自英文的一篇文章中的说明:
Ninja is a process to really handle the final build manifest(Build.ninja) which is made by Blueprint or Kati (translate Android.mk to Android.bp).
Blueprint is like GNU Make grammar, so called “framework for build system”. it made by Go language, hence it better provides multi-processing. Blueprint translate “hand-writing build manifest”(*.bp) to final manifest(build.ninja) which is ninja format.

什么是Android.bp

在设计上Android.bp文件的编写规则是是非常简单的,不包含Android.mk中一些条件或者控制语句.

简单的示例如下:

cc_binary {
    name: "gzip",
    srcs: ["src/test/minigzip.c"],
    shared_libs: ["libz"],
    stl: "none",
}

详细的内容请在Google官网中继续学习Android.bp file format

总结

网络上有很多关于Android.bp/Soong 的文章,但很多都是关于规则相关的,并没有过多的讲述实际怎么用它. 在接下来的文章中希望能够一步一步讲清楚在实际的工程中是如何应用的.

相关文档:
Android 编译之android.bp深入浅出Android.bphow-the-soong-android-bp-build-works