摘自:http://blog.csdn.net/jshazk1989/article/details/6823888#
先写一个简单的Android.mk
LOCAL_PATH := $(call my-dir) #指定当前目录
include $(CLEAR_VARS) #引入编译变量
LOCAL_MODULE_TAGS := optional #编译选项便是在何种情况下编译
LOCAL_SRC_FILES := hello.c #源文件(可以指定多个)
LOCAL_MODULE := hello #编译出来的模块名
LOCAL_MODULE_CLASS := EXECUTABLES #指定编译之后放置的位置(此处指示放在system/bin下)
include $(BUILD_EXECUTABLE) #引入编译成可执行文件的规则
LOCAL_PATH : 指定目录,以上是一般用法指示当前目录(my-dir函数是Android编译时. build/envsetup.sh命令生成的 能够获取当前目录的路径)
CLEAR_VARS: android有自己的一套代码编译规则跟编译选项等变量的定义,此变量会引入,实际是android/build/core下的clear_vas.mk。
clear_vas.mk:
##########################################################
## Clear out values of all variables used by rule templates.
###########################################################
LOCAL_MODULE:=
LOCAL_MODULE_PATH:=
LOCAL_MODULE_STEM:=
LOCAL_DONT_CHECK_MODULE:=
LOCAL_CHECKED_MODULE:=
.
.
.
LOCAL_CERTIFICATE:=
LOCAL_SDK_VERSION:=
LOCAL_NDK_VERSION:=
LOCAL_NO_EMMA_INSTRUMENT:=
LOCAL_NO_EMMA_COMPILE:=
LOCAL_PROGUARD_ENABLED:= # '',optonly,full,custom
LOCAL_PROGUARD_FLAGS:=
LOCAL_PROGUARD_FLAG_FILES:=
LOCAL_EMMA_COVERAGE_FILTER:=
LOCAL_MANIFEST_FILE:=
LOCAL_BUILD_HOST_DEX:=
LOCAL_DEX_PREOPT:=
LOCAL_DEX_PREOPT:=
# Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to
# iterate over thousands of entries every time.
# Leave the current makefile to make sure we don't break anything
# that expects to be able to find the name of the current makefile.
MAKEFILE_LIST := $(lastword $(MAKEFILE_LIST))
LOCAL_MODULE 指示当前编译出来的模块名
LOCAL_MODULE_TAGS 标识在什么情况下去编译起模块
有几个选项
user | 模块只在user下编译 |
eng | 模块在eng模式下编译 |
tests | test状态下编译 |
optional | 此模块在所有版本下都编译 |
即 TARGET_BUILD_VARIANT=eng 编译TAGS为eng和optional的模块
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 标识了所编译模块最后放置的位置,如果不指定,不会放到系统中,之后放在最后的obj目录下的对应目录中。
LOCAL_MODULE_CLASS := ETC #表示放于system/etc目录
LOCAL_MODULE_CLASS := EXECUTABLES #放于/system/bin
LOCAL_MODULE_CLASS := SHARED_LIBRARIES #放在/system/lib下