每个模在编译的时候都会产生一个编译目录和一个安装目录,编译目录就是这个模块编译以后生成的目标文件,安装目录就代表着这个模块是否会编译进文件系统,就是是否编译进IMG。

Android makefile分为四种:

1、For config

这类文件主要用来配置product,board,以及根据你的Host和Target选择相应的工具以及设定相应的通用编译选项。

Borad主要是设计到硬件芯片的配置,比如是否提供硬件的某些功能,比如说GPU等等,或者芯片支持浮点运算等等。Product是指针对当前的芯片配置定义你将要生产产品的个性配置,主要是指APK方面的配置,哪些APK会包含在哪些product中,哪些APK在当前product中是不提供的。

2、 Module Compile

这类文件主要定义了如何来处理Module的Android.mk,以及采用何种方式来生成目标模块,这些模块生成规则都定义在config.mk里面。

3、Local Module

本地模块的Makefile文件就是我们在Android里面几乎随处可见的Android.mk。Android进行编译的时候会通过下面的函数来变量所有子目录中的Android.mk。一旦找到就不会再往层子目录继续寻找。

不同类型的本地模块具有不同的语法,但基本上是想通的,只有个别变量的不同。Android通过LOCAL_MODULE_TAGS来决定哪些本地模块不会编译进系统,通过PRODUCT和LOCAL_MODULE_TAGS来决定哪些应用包会编译进系统,如果用户不指定LOCAL_MODULE_TAGS,默认它的值是user。此外用户可以通过buildspec.mk来指定你需要编译进系统的模块。用户可以通过mm来编译指定模块,或者通过make clean-module_name来删除指定模块。

4、Package

这主要指的是build/core/Makefile这个文件,它定义了生成各种img的方式。生成的过程见图片1。

所有的Makefile都通过build/core/main.mk这个文件组织在一起,它定义了一个默认goals:droid,当我们在TOP目录下敲Make,实际上就等同于我们执行make droid。当Make include所有的文件,完成对所有make文件的分析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的img。

基本上Android building system就是以这样一种方式组织在一起的。

最后是扩展SDKAPI的问题,Android可以编译出自己的SDK,并扩展相应的SDK API,可以在frameworks/base/core/java中添加相应的类。

系统变量解析:

LOCAL_MODULE   编译的目标对象

LOCAL_SRC_FILES   编译的源文件

LOCAL_C_INCLUDES  需要包含的头文件目录

LOCAL_SHARED)LIBRARIES  链接时需要的外部库

LOCAL_PRELINK_MODULE  是否需要prelink处理

 

LOCAL_PATH  #编译当前的目录#编译时的目录, 

$(call目录,目录..) 目录引入操作符

如该目录下有个文件夹名称src,则可以这样写$(call src),那么就会得到src目录的完整路径。

 

LOCAL_SRC_FILES #要编译的源文件#编译的源文件

可以是.c,.cpp,.java或是.aidl等格式,不同的文件用空格隔开。如果编译目录的子目录,采用相对路径,如子目录/文件名。

 

LOCAL_C_INCLUDES #搜索头文件时的额外的路径去搜索#需要包含的头文件目录

可以是系统定义路径,也可以是相对路径。

 

LOCAL_JAVA_LIBRAIES  加入jar包

 

LOCAL_MODULE  #要编译成的名称#编译的目标对象

Module是指系统的native code,通常针对c,c++代码

 

LOCAL_PACKAGE_NAME

Java应用程序的名字用该变量定义,eg:

./packages/apps/Browser/Android.mk:14:LOCAL_PACKAGE_NAME := Browse