Android.mk文件笔记

  • Post author:
  • Post category:其他




一、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)


注意:‘:=’是赋值的意思;’+=’是追加的意思;‘$’表示引用某变量的值。



版权声明:本文为jondylove原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。