android源码学习(1)-android编译过程分析

在历经“千辛万苦”之后,终于android源码学习的环境搭好了,真的是不容易啊。当然如果仅仅为了编译成功而编译,也是没有啥意思了,所以,今天就分析一下android编译期间到底做了些啥?

按照步骤一步步看,编译前的准备工作,包括下载源代码,设置编译环境,高速缓存啥的都没啥好说的,和编译过程真正有关系的就是三个命令,第一个,source build/envsetup.sh,第二个是lunch,最后一个就是make -j8了,主要弄清楚这三条命令到底做了些什么。

(1)source build/envsetup.sh

要知道做了什么,先看看它写了什么:

在终端使用vim build/envsetup.sh打开这个文件

首先看到的就是它加载了很多的命令到终端,其中就包括我们之后使用的lunch命令,我们可以测试一下,在没有执行source build/envsetup.sh命令之前,我们在终端还能不能执行lunch,

很明显,是不可以的,所以,我们可以知道,envsetup.sh第一个作用就是加载一些命令到终端供我们使用。

接下来,我们执行一下envsetup.sh命令

发现它导入了一堆脚本文件,我们再执行一下lunch

这个界面都不陌生,这些就是加载的一些lunch分支,之所以叫分支,是因为你可以自己去添加或删除一个lunch,这对从事android源码开发的人员非常重要,一个分支可以对应一个厂商,比如说,厂商A要求要在系统中预置一些应用,并且添加一些功能,你就可以添加一个lunch分支为A厂商开发,而厂商B要求删除一些不必要的功能,那么你也可以再开一个lunch去开发B的功能,个人理解和java的模块开发有点类似,根据不同要求去进行不同的开发,保证了源代码只有一份,便于去维护。

(2)lunch

我们进lunch去看看,这个函数是怎么写的?

可以很清晰的看见,lunch函数在进来时,首先做了一个判断,如果lunch后面带了参数,这个参数就是之后我们输入的数字,那么直接就执行lunch 1,就不会提供那些供我们选择的选项,如果没带参数,那么就打印出所有的可选项,所以lunch函数做的功能其实也很简单。

(3)make -j8

最后这条命令其实就是根据上述已经设置好的环境开始编译了,这里要提一点,如果我们不想去编译整个源代码,而是仅仅编译我们修改的模块,那么该怎么办呢,这里就牵扯到我们之前的mmm命令了,他可以帮助我们我编译一个模块;

做一个小例子:

首先要编译的模块需要做一些改动,才能让系统重新编译:

我们先找一个文件进行练习,在 external目录下


我们 的目标文件是external目录下的libpng里的libget.c文件,首先需要对它进行更新一下,

然后,再开始编译一下,使用mm命令进行编译,mmm和mm其实本质上没什么区别,只不过,mmm后面跟着是模块的路径,mm后面可以跳转到你想要编译模块目录下的路径。

最后总结一下,当我们执行了envsetup.sh之后做了些什么:

(1)加载命令和分支,这个主要是通过add_lunch_combo函数进行的

(2)得到mm,mmm,lunch一些命令;

(3)当执行lunch时,我们在其中可以选择自己的分支,并且配置了编译时的环境变量,同时也规定了编译后的输出目录;


猜你喜欢

转载自blog.csdn.net/pgg_cold/article/details/80050532