Android Build 系统是 Android 源码的一部分,是用来编译 Android 系统,Android SDK 以及相关文档的一套框架。众所周知,Android 是一个开源的操作系统。Android 的源码中包含了许许多多的模块。 不同产商的不同设备对于 Android 系统的定制都是不一样的。如何将这些模块统一管理起来,如何能够在不同的操作系统上进行编译,如何在编译时能够支持面向不同的硬件设备,不同的编译类型,且还要提供面向各个产商的定制扩展,是非常有难度的。 但 Android Build 系统很好的解决了这些问题.
Android Build系统中,主要的处理逻辑都在Make文件中;
Make文件可以分为三大类:
第一类,Build系统核心文件:此类定义了整个Build系统的框架,而其他Make文件就是在此框架的基础上编写出来的,它位于Build/core目录下;
第二类,针对某个产品的Make文件:通常位于devices目录下;
第三类,针对某个模块的Make文件:整个系统中有大量的mokuai,每个模块中都有一个Make文件,统一名称为Android.mk,该文件定义了如何编译当前模块。Build系统会在整个系统中扫描名为Android.mk的文件,并根据其中的内容执行模块的编译;
编译Android系统(Android5.0以上版本):
1.source build/envsetup.sh
引入了 build/envsetup.sh脚本。该脚本的作用是初始化编译环境,并引入一些辅助的 Shell 函数,提供一些额外的方法;
2.lunch full-eng
调用 lunch 函数,并指定参数为“full-eng”;
lunch 函数的参数用来指定此次编译的目标设备以及编译类型。在这里,这两个值分别是“full”和“eng”;
“full”是 Android 源码中已经定义好的一种产品,是为模拟器而设置的。而编译类型会影响最终系统中包含的模块;
3.make -j8
真正开始执行编译;
make 的参数“-j”指定了同时编译的 Job 数量.这是个整数,该值通常是编译主机 CPU 支持的并发线程总数的 1 倍或 2 倍(例如:在一个 4 核,每个核支持两个线程的 CPU 上,可以使用 make -j8 或 make -j16)。
Build结果的目录结构:
所有的编译产物都将位于 /out 目录下,该目录下主要有以下几个子目录:
/out/host/:该目录下包含了针对主机的 Android 开发工具的产物。即 SDK 中的各种工具,例如:emulator,adb,aapt 等;
/out/target/common/:该目录下包含了针对设备的共通的编译产物,主要是 Java 应用代码和 Java 库;
/out/target/product/<product_name>/:包含了针对特定设备的编译结果以及平台相关的 C/C++ 库和二进制文件。其中,<product_name>是具体目标设备的名称;
/out/dist/:包含了为多种分发而准备的包,通过“make disttarget”将文件拷贝到该目录,默认的编译目标不会产生该目录。
Build生成的镜像文件:
Build 的产物中最重要的是三个镜像文件,它们都位于 /out/target/product/<product_name>/ 目录下。
这三个文件是:
system.img:包含了 Android OS 的系统文件,库,可执行文件以及预置的应用程序,将被挂载为根分区。
ramdisk.img:在启动时将被 Linux 内核挂载为只读分区,它包含了 /init 文件和一些配置文件。它用来挂载其他系统镜像并启动 init 进程。
userdata.img:将被挂载为 /data,包含了应用程序相关的数据以及和用户相关的数据。