Android.mk文件笔记

来源:互联网 发布:windows web压力测试 编辑:程序博客网 时间:2024/06/05 17:54

一、android.mk文件

用实验中mk文件简单分析下:

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_PRELINK_MODULE := falseLOCAL_SRC_FILES := wiredphone.cLOCAL_MODULE := wriedphone.$(TARGET_BOARD_PLATFORM)LOCAL_MODULE_TAGS := optional#LOCAL_MODULE := libwriedphoneLOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hwinclude $(BUILD_SHARED_LIBRARY)


LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
# 变量设置为false那么将不做prelink操作 

LOCAL_PRELINK_MODULE := falseLOCAL_SRC_FILES:= \WRIEDPHONEService.cppLOCAL_SHARED_LIBRARIES := \libutils \libbinder \libhardware \LOCAL_MODULE:= libledLOCAL_MODULE_TAGS := optionalinclude $(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)
注意:‘:=’是赋值的意思;'+='是追加的意思;‘$’表示引用某变量的值。
0 0