一、android.mk文件
用实验中mk文件简单分析下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false
LOCAL_SRC_FILES := wiredphone.c
LOCAL_MODULE := wriedphone.$(TARGET_BOARD_PLATFORM)
LOCAL_MODULE_TAGS := optional
#LOCAL_MODULE := libwriedphone
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
# 变量设置为false那么将不做prelink操作
LOCAL_PRELINK_MODULE := false
LOCAL_SRC_FILES:= \
WRIEDPHONEService.cpp
LOCAL_SHARED_LIBRARIES := \
libutils \
libbinder \
libhardware \
LOCAL_MODULE:= libled
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)
1、LOCAL_MODULE_TAGS :=user eng tests optional
user: 用户模式,指该模块只在user版本下才编译
eng: 工程模式,指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
2、LOCAL_PRELINK_MODULE := false
预编译,变量设置为false那么将不做prelink操作
3、include $(BUILD_SHARED_LIBRARY)、$(BUILD_STATIC_LIBRARY)、$(BUILD_EXECUTABLE)
BUILD_SHARED_LIBRARY:动态共享库
BUILD_STATIC_LIBRARY:静态库
BUILD_EXECUTABLE:可执行程序
BUILD_PACKAGE:生成一个APK
eg:LOCAL_SRC_FILES := foo.c toto/bar.c\
Hello.c
文件之间可以用空格或Tab键进行分割,换行请用”\”,如果是追加源代码文件的话,请用LOCAL_SRC_FILES +=。
注意:可以LOCAL_SRC_FILES := $(call all-subdir-java-files)这种形式来包含local_path目录下的所有java文件。
4、LOCAL_PATH:= $(call my-dir)
一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。
在这个例子中,宏函数‘my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file
文件的目录)。
5、include$(CLEAR_VARS)
CLEAR_VARS由编译系统提供(可以在android安装目录下的/build/core/config.mk 文件看
到其定义,为CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk),指定让GNU MAKEFILE
为你清除许多LOCAL_XXX 变量( 例如LOCAL_MODULE,LOCAL_SRC_FILES,Android.mk文档规范2 LOCAL_STATIC_LIBRARIES,等等…),除LOCAL_PATH。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
6、LOCAL_MODULE:= helloworld
LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称
必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话
说,一个被命名为’foo’的共享库模块,将会生成’libfoo.so’文件。注意:如果把库命名为
‘libhelloworld’,编译系统将不会添加任何的lib 前缀,也会生成libhelloworld.so,这是
为了支持来源于Android平台的源代码的Android.mk文件。
7、LOCAL_SRC_FILES:= helloworld.c
LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。不用在这里列出头文件和包含文件,编译系统将会自动找出依赖型的文件。注意:可以LOCAL_SRC_FILES := $(call all-subdir-java-files)这种形式来包含local_path目录下的所有java文件。默认的C++源码文件的扩展名是‘.cpp’。指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是定义为 ‘.cxx’,而不是‘cxx’)
8、LOCAL_OVERRIDES_PACKAGES
此变量可以使其他的模块不加入编译,如源码中DeskClock的android.mk有LOCAL_OVERRIDES_PACKAGES :=
AlarmClock,使 AlarmClock不会加入到编译系统中,不会生成 AlarmClock.apk。
9、include $(call all-subdir-makefiles)
它的作用就是包含所有子目录中的Android.mk文件,如果需要编译的模块比较多,我们可能会将对应的模块放置在相应的目录中,这样,我们可以在每个目录中定义对应的Android.mk文件(类似于上面的写法),最后,在根目录放置一个Android.mk文件,加入include $(call all-subdir-makefiles)
10、LOCAL_MODULE_PATH
在Android.mk文件中,还可以指定最后的目标安装路径,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择:
TARGET_ROOT_OUT:表示根文件系统。
TARGET_OUT:表示system文件系统。
TARGET_OUT_DATA:表示data文件系统。
用法如:
LOCAL_MODULE_PATH:=$(TARGET_ROOT_OUT)
MY_SOURCES += bar.c
11、LOCAL_CFLAGS
LOCAL_CFLAGS := -DHHH 这个等价于头文件中 #define HHH
可选的编译器选项,在编译C代码文件的时候使用。这可能是有用的,指定一个附加的包含路径(相对于NDK的顶层目录),宏定义,或者编译选项。
重要信息:不要在Android.mk中改变 optimization/debugging级别,只要在Application.mk中指定合适的信息,就会自动地为你处理这个问题,在调试期间,会让NDK自动生成有用的数据文件。(7) LOCAL_CXXFLAGS: Same as LOCAL_CFLAGS for C++ source files
12、LOCAL_CPPFLAGS: 与LOCAL_CFLAGS相同,但是对C 和C++ source files都适用。
13、
LOCAL_C_INCLUDES
可选变量,表示头文件的搜索路径。默认的头文件的搜索路径是LOCAL_PATH目录。
14、LOCAL_JNI_SHARED_LIBRARIES
定义了要包含的so库文件的名字,如果程序没有采用jni,不需要
LOCAL_JNI_SHARED_LIBRARIES := libxxx 这样在编译的时候,NDK自动会把这个libxxx打包进apk; 放在youapk/lib/目录下
二、自定义变量
以下是在 Android.mk中依赖或定义的变量列表,可以定义其他变量为自己使用,但是NDK编译系统保留下列变量名:
-以 LOCAL_开头的名字(例如 LOCAL_MODULE)
-以 PRIVATE_, NDK_ 或 APP_开头的名字(内部使用)
-小写名字(内部使用,例如‘my-dir’)
如果为了方便在 Android.mk 中定义自己的变量,建议使用 MY_前缀,一个小例子:
MY_SOURCES := foo.c
ifneq ($(MY_CONFIG_BAR),)
MY_SOURCES += bar.c
endif
LOCAL_SRC_FILES += $(MY_SOURCES)
注意:‘:=’是赋值的意思;’+=’是追加的意思;‘$’表示引用某变量的值。