每个模在编译的时候都会产生一个编译目录和一个安装目录,编译目录就是这个模块编译以后生成的目标文件,安装目录就代表着这个模块是否会编译进文件系统,就是是否编译进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