因为从事着android驱动开发所以天天要接触Android.mk。
1、在运行 . build/envsetup.sh 会生成一些操作例如:chooseproduct mmm
2、运行 chooseproduct project 选择所要编译的工程
3、运行make,回去编译整个android source
怎么说到了编译Android Source的方法呢
切入主题 先写一个简单的Android.mk
以上的Android.mk 会编译出一个hello的可执行文件,并放入system/bin
LOCAL_PATH : 指定目录,以上是一般用法指示当前目录(my-dir函数是Android编译时. build/envsetup.sh命令生成的 能够获取当前目录的路径)
CLEAR_VARS: android有自己的一套代码编译规则跟编译选项等变量的定义,此变量会引入,实际是android/build/core下的clear_vas.mk,
LOCAL_MODULE 指示当前编译出来的模块名
LOCAL_MODULE_TAGS 标识在什么情况下去编译起模块
有几个选项
user | 模块只在user下编译 |
eng | 模块在eng模式下编译 |
tests | test状态下编译 |
optional | 此模块在所有版本下都编译(??有疑问:见浅析Android下的Android.mk文件(补充)) |
LOCAL_SRC_FILES 表示编译出此模块需要的源程序 可以有多个
LOCAL_C_INCLUDE 如果不去调用标准库头文件,跟当前目录的头文件,则需要在此指定头文件的位置,在此指定头文件的目录。
LOCAL_STATIC_LIBRARIES: 指定需要连接的静态库像一些比较通用的标准库就无需指定了
LOCAL_SHARED_LIBRARIES: 指定需要连接的动态库
最后include $(BUILD_XXX) 表示编译出来的模块类型,有三种
BUILD_EXECUTABLE | 编译成可执行的模块 | build/core/host_executable.mk |
BUILD_STATIC_LIBRARY | 编译成静态库 | build/core/host_static_library.mk |
BUILD_SHARED_LIBRARY | 编译成动态库 | build/core/host_shared_library.mk |
LOCAL_MODULE_CLASS := ETC #表示放于system/etc目录
LOCAL_MODULE_CLASS := EXECUTABLES #放于/system/bin
LOCAL_MODULE_CLASS := SHARED_LIBRARIES #放在/system/lib下
build/core下有很多编译的全局的mk,如编译C/C++规则definitions.mk ......
再说一下编译内核模块的Makefile
编译模块的Makefile会被读取两次,Makefile从命令行调用时候KERNELRELEASE尚未设置,
在运行到KDIR时即会指向一个内核构造树,
在运行$(MAKE)时 会会第二次运行make命令,此时设置obj-m 构造真正的内核模块