作者:HW-LXL
摘要:本文从安卓编译的关键流程来分析安卓编译系统
关键动作1:envsetup.sh 和 choosecombo
关键动作2:产品参数读取
关键动作3:模块配置表生成流程
[显示全部]
之前发过一篇文章,主要从架构,和文件间的关系分析了安卓编译系统。
本文则从另一个角度,即从安卓编译的关键流程来分析,相信对大家理解安卓编译系统会有帮助。
首先看一下安卓编译的总流程。
该总流程,描述了我们敲入编译脚本,到编译结束的关键动作。 最主要的关键动作有三个,包括'envsetup.sh 和 choosecombo'流程,'产品参数读取'流程和“模块配置表生成流程”。简单来说,安卓编译系统会载入环境参数,读取产品参数,并生成产品参数中所规定的模块的编译动作,并将模块注册到模块注册表中,被总编译目标所依赖。
通过这样的流程,即可根据产品不同,编译出不同的镜像出来。

在真正执行编译操作时,一定要先执行envsetup.sh和choosecombo来初始化编译环境,但是在执行过程中,它们到底具体做出了什么操作呢?请看下图。
从图中可以看到,主要的动作为根据用户输入,结合对AndroidProduct.mk的解析,生成一些非常重要的环境参数,并最后调用printconfig将它们打印出来。
这部分的动作主要是使用shell脚本实现的,其目的为配置环境参数。为后面的编译操作做准备。

编译参数配置完了,现在进入真正的编译过程中。首先include进来的就是main.mk,它可以说是一切编译行为的开始和结束。
编译过程中,最开始执行的动作,就是根据环境变量,进一步获得特有的产品配置,具体来说,就是获得重要的产品配置信息变量PRODUCTS变量。
PRODUCTS变量类似一个结构体,显示了其解析的mk文件的结果,其中有非常重要的变量,如PRODUCT_NAME和PRODUCT_COPY_FILES等等。

产品的信息载入好了之后,要找到产品定义的各个模块的安装方法。
此时需要读取产品的Android.mk,并将它们载入到模块配置表ALL_MODULES,ALL_MODULES中定义的模块,经过一次筛选,最终将载入安装模块列表modules_to_install,该模块列表将被droid依赖,在编译的时候会进行编译和安装。





































苏公安网备 32011402010933号