目录
以下参考网上,结合3288进行整理
Android 编译系统的组成
参考网上
Android 和 Linux 的编译系统都是通过 Makefile 工具来组织编译源代码的。
Makefile 工具用来解释和执行 Makefile 文件,在 Makefile 文件里定义好工程源代码的编译规则,通过 make 命令即可以完成对整个工程的自动编译。
1、Makefile:编译系统的入口 Makefile 文件,在系统根目录下,只有一行代码,包含 build/core/main.mk。
2、build/core/main.mk:主要 Makefile,定义了 Android 编译系统的主线。
3、build/core/config.mk:根据用户输入的编译选项导出配置变量,影响编译目标。
4、build/core/envsetup.mk:定义大量全局变量,用户编译配置。
5、build/core/product_config.mk:根据用户选择的目标产品,定义编译结果输出目录。
6、device/*/$(TARGET_DEVICE)/BoardConfig.mk:根据用户选择的目标产品找到对应的设备 TARGET_DEVICE,加载设备的板级配置。
7、build/core/definitions.mk:定义编译过程中用到的大多数变量和宏,是编译系统的函数库。
8、MODULES_DIR/Android.mk:每个模块的规则定义文件,它出现在每个要编译的目录下,我们可以向 Android 系统中添加自己的模块,来达到定制系统的目的。
9、build/core/Makefile:Android 编译目标规则定义文件,最终编译结果在该文件中定义,如 system.img、boot.img 等。
准备编译
设置环境
使用 envsetup.sh 脚本初始化环境。请注意,将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。
source build/envsetup.sh
选择目标
使用 lunch 选择要编译的目标。确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整编译,并且所有调试功能均处于启用状态。
lunch aosp_arm-eng
直接运行 lunch
(没有参数),会列出所有支持的类型,输入对应的序号来进行选择。
所有编译目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一:
编译类型 | 使用情况 |
---|---|
user | 权限受限;适用于生产环境 |
userdebug | 与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型 |
eng | 具有额外调试工具的开发配置 |
如何查看源码的版本
1、 从代码中查看当前版本,找到如下文件
build/core/version_defaults.mk
搜索关键字 PLATFORM_VERSION
Android编译过程
当前目录下编译执行,相当于在android目录下执行make 本文介绍Android的编译过程及各种mk文件的导入
1.编译
a.编译步骤
$ source ./build/envetup.sh
# 这个命令是用来将envsetup.sh里的所有用到的命令加载到环境变量里去
选择编译目标
$ lunch aosp_arm-eng
编译
$ make -j16
参数N表示并行编译的任务数,一般N为cpu线程数的1-2倍.例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核 2 个线程)上,要实现最快的编译速度,可以使用介于 make -j16 到 make -j32 之间的命令
b.编译结果及目录
- out/ :所有的编译产物都将位于out目录下,该目录下主要有以下几个子目录
- -out/host/ :该目录下包含了针对主机的 Android 开发工具的产物。即 SDK 中的各种工具,例如:emulator,adb,aapt 等
- out/target/common/ :该目录下包含了针对设备的共通的编译产物,主要是 Java 应用代码和 Java 库。
- out/target/product// :包含了针对特定设备的编译结果以及平台相关的 C/C++ 库和二进制文件。其中,是具体目标设备的名称。
c.编译生成的主要镜像文件
ramdisk.img
- 是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件;
- 在启动时将被 Linux 内核挂载为只读分区,它包含了 /init 文件和一些配置文件。它用来挂载其他系统镜像并启动 init 进程
boot.img
- 由boot header、kernel和ramdisk三部分打包在一起组成
- 启动时,由bootloader解析后引导kernel启动
system.img
- 被挂载到/system目录下
- 包含了 Android OS 的系统文件,库,可执行文件以及预置的应用程序
userdata.img
- 被挂载到/data目录下
- 包含了应用程序相关的数据以及和用户相关的数据
- 可以预制一些可删除的应用软件
2.编译过程详解
a.source 过程
source命令:在当前bash环境下 读取并执行 FileName中的命令;$ source ./build/envsetup.sh
读取envsetup.sh 中的函数,并执行脚本 。
- 加载的函数有
- 执行脚本:
1.执行add_lunch_combo xxxxx
2.检查shell是否为bash,
3.查找 vendorsetup.sh,并 include ;
4.输出所有的include文件
5,执行addcompletions() 检查bash版本;
b. lunch过程
lunch <product_name>-<build_variant>,选择平台编译选项
c. Make 过程
makefile的相关语法请参考Makefile语法一文或其他书籍。
入口文件是源码树根目录下名称为Makefile的文件,当在源代码根目录上调用 make 命令时,make 命令首先将读取该文件。Makefile 文件的内容只有一行:include build/core/main.mk。作用仅为包含 build/core/main.mk文件。在 main.mk 文件中又会去包含其他的文件,其他文件中又会包含更多的文件,这样就引入了整个 Build 系统。
比较重要的make文件介绍:
devices/xxxxx/BoardConfig.mk,AndroidBoard.mk
BoardConfig.mk设备硬件配置及目标架构配置文件.
AndroidBoard.mk设备属性和键值映射配置文件.
TARGET_KERNEL_CONFIG/KERNEL_DEFCONFIG:定义默认kernelconfig文件;
编译得到:resource.img和kernel.img两个文件
android-3288
elif [ $2 == "android" -o $2 == "android/" ]
then
{
echo make clean android
source build.sh
make clean
pushd linux_update/rockdev/Image/
rm misc.img boot.img recovery.img system.img
popd
}
elif [ $1 == "android" -o $1 == "android/" ]
then
{
source build.sh
make -j $MAKE_THEARD
if [ $? -eq 0 ]; then
echo "Build android ok!"
else
echo "Build android failed!"
exit 1
fi
./mkimage.sh
}
结合这两处,编译得到:misc.img boot.img recovery.img system.img