接下来就进行源码编译的过程,这里会按照一个正规的流程往下走,并说说某些阶段所做的事情以及一些常见的错误

一、目录结构

在编译之前,我们先了解了解android源码的目录结构,先看下面的图:

Android编译按钮 android编译过程详解_android

目录解析

abi

应用程序二进制接口,生成libgabi++.so相关库文件

vendor

各个厂商定制的相关文件,如驱动等

boinic

Android的C library,即C库文件

bootable

Android系统启动引导相关代码

build

存放系统编译规则及generic等基础开发包配置

cts

Android兼容性测试套件标准

tool

一些工具的

developers

开发者目录(包含一些事例)

development

应用程序开发相关的工具等

device

设备相关的抽象

docs

指导文档

external

android使用到的一些开源的东西

frameworks

android核心框架,包含了java代码以及c代码

hardware

硬件相关的HAL代码

libcore

核心库

libnativehelper

JNI调用相关的库

ndk

ndk开发相关

out

编译后资源输出文件夹

packges

应用程序包

sdk

sdk以及模拟器存放目录

        其实这些东西大家随意看看就好,因为大部分目录都不需要我们去动,而android开发人员动得比较多的可能也就frameworks跟packges。其他的可以等到有具体需求的时候再去研究。


二、编译过程简介

1、下面的链接是官方的编译过程介绍

网址:http://source.android.com/source/building.html

2、首先这里要说明的是,官方所给出的编译过程仅仅是告诉你如何去编译一个通用型的系统而已,如果你需要根据自己的产品进行定制的话,还是需要对整个编译的过程有比较深入的了解的。

3、google给出的几个编译步骤其实很明确,我们接下来就根据这几个步骤进行,并展开说明

  • source build/envsetup.sh:初始化编译环境,加载相关命令
  •  lunch:选择平台编译选项
  •  make -j8:执行编译(其中-j参数表示指定编译线程数,建议cpu核心数乘2即可)

三、envsetup.sh都做了些什么?

在分析envsetup.sh之前,我们先看看两个小问题:

1、执行该脚本时有些退linux不是很熟悉的朋友经常会碰到envsetup.sh文件无可执行权限问题,使用下面命令加上即可:

      $chmod a+x envsetup.sh

2、还有一个问题是经常出现的build/envsetup.sh: 1: Syntax error: "(" unexpected,别慌,由于我们使用的是Ubuntu,而Ubuntu默认使用的shell环境是dash,而envsetup.sh默认是指定bash的,所以我们只需要将dash切换到bash即可:

     执行$sudo dpkg-reconfigure dash命令,并选择“否”,最好重新打开终端

3、我们先看看,执行了source build/envsetup.sh后有什么效果:

Android编译按钮 android编译过程详解_编译过程_02

我们很直观的看到,直接includ了很多shell脚本,光看这里看不出什么,我们不妨看看源码!

# Execute the contents of any vendorsetup.sh files we can find.
for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
         `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
do
    echo "including $f"
    . $f
done
unset f

上面的脚本代码依次查找{device, vendor, product}目录下的vendorsetup.sh文件,并分别导入到当前环境中来!至于这些sh到底有什么用,在编译第二阶段的时候再将!

4、我们继续翻envsetup.sh的源码你会发现,一直在定义函数而这些函数有很多我们会是我们后面直接用到的,比如说lunch、mm、mmm等等。

总结:所以综合来说,android源码编译的第一个阶段主要做了两件事,第一就是加载相关的vendorsetup.sh文件,第二就是定义后续编译相关的函数。