浅析Android下的Android.mk文件


转自: http://dengzhangtao.iteye.com/blog/1750782


1 概述 
        大家都知道在Linux下编辑经常要写一个Makefile文件, 可以把这个Makefile文件理解成一个编译配置文件,它保存着如何编译的配置信息,即指导编译器如何来编译程序,并决定编译的结果是什么。而在Android下的Android.mk文件也是类型的功能,顾名思义,从名字上就可以猜测得到,Android.mk文件是针对Android的Makefile文件.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。编译系统为你处理许多细节问题。 
2 Android.mk的整体结构 
例如一个Android.mk的内容如下: 
[html] view plaincopy 
LOCAL_PATH:= $(call my-dir)  
include $(CLEAR_VARS)  
  
LOCAL_SRC_FILES:= \  
    android_media_MediaPlayer.cpp \  
    android_media_MediaRecorder.cpp \  
    android_media_MediaScanner.cpp \  
    android_media_MediaMetadataRetriever.cpp \  
    android_media_ResampleInputStream.cpp \  
    android_media_MediaProfiles.cpp \  
    android_media_AmrInputStream.cpp \  
    android_media_Utils.cpp \  
    android_mtp_MtpDatabase.cpp \  
    android_mtp_MtpDevice.cpp \  
    android_mtp_MtpServer.cpp \  
  
LOCAL_SHARED_LIBRARIES := \  
    libandroid_runtime \  
    libnativehelper \  
    libutils \  
    libbinder \  
    libmedia \  
    libskia \  
    libui \  
    libcutils \  
    libgui \  
    libstagefright \  
    libcamera_client \  
    libsqlite \  
    libmtp \  
    libusbhost \  
    libexif  
  
LOCAL_C_INCLUDES += \  
    external/jhead \  
    external/tremor/Tremor \  
    frameworks/base/core/jni \  
    frameworks/base/media/libmedia \  
    frameworks/base/media/libstagefright/codecs/amrnb/enc/src \  
    frameworks/base/media/libstagefright/codecs/amrnb/common \  
    frameworks/base/media/libstagefright/codecs/amrnb/common/include \  
    frameworks/base/media/mtp \  
    $(PV_INCLUDES) \  
    $(JNI_H_INCLUDE) \  
    $(call include-path-for, corecg graphics)  
  
LOCAL_CFLAGS +=  
  
LOCAL_LDLIBS := -lpthread  
  
LOCAL_MODULE:= libmedia_jni  
  
include $(BUILD_SHARED_LIBRARY)  
  
# build libsoundpool.so  
# build libaudioeffect_jni.so  
include $(call all-makefiles-under,$(LOCAL_PATH))  
首先必须定义好LOCAL_PATH变量。然后清除所有LOCAL_XX变量的值,当然LOCAL_PATH的值除外,然后定义源文件,头文件,接着是编译选项参数,紧接着是编译生成的文件名,最后是生成的文件类型. 
3 Android.mk内的变量定义 
3.1  LOCAL_PATH 
一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。例如: 
[html] view plaincopy 
LOCAL_PATH:= $(call my-dir)  
宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录) 
3.2 include $( CLEAR_VARS) 
宏CLEAR_VARS 由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。 
3.3 LOCAL_SRC_FILES 
本次需要编译的源文件 
3.4 LOCAL_SHARED_LIBRARIES 
本次编译需要链接的动态链接库文件,即.so文件 
3.5 LOCAL_STATIC_LIBRARIES 
静态链接库. 
3.6 LOCAL_C_INCLUDES 
本次编译需要包含的头文件,一个相对于当前目录可选的路径名单,当编译所有的源文件(C,C++和汇编)时,它将被添加进include搜索路径。例如: 
    LOCAL_C_INCLUDES := sources/foo 
或者甚至: 
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo 
3.6 LOCAL_LDLIBS 
本次编译的链接选项,相当于gcc -l后的参数 
3.7  LOCAL_CFLAGS 
同样是编译选项,相当于gcc -O后面的参数 
3.8 LOCAL_MODULE 
生成的模块名,这个变量必须定义,表示make后将要生成的文件的名字 
3.9 LOCAL_PACKAGE_NAME 
apk文件名 
4 include 
include可Android多以这样的形式出现,如:include $( CLEAR_VARS),include $(BUILD_SHARED_LIBRARY).其实这个include可以理解成"执行"的意思,那么执行什么呢?当然是看后边的宏了. 
宏CLEAR_VARS已经在3.2节中介绍过了,表示清除一些变量. 
宏BUILD_SHARED_LIBRARY表示生成共享库,即生成.so文件 
因此include $(BUILD_SHARED_LIBRARY)就是指定在/system/lib/目录下生成一个lib$(LOCAL_MOUDULE).so文件,同样类型的宏如下: 
CLEAR_VARS                                             清除LOCAL_xxx变量 
BUILD_SHARED_LIBRARY                     在/system/lib/目录下生成lib$(LOCAL_MOUDULE).so文件 
BUILD_STATIC_LIBRARY                         生成lib$(LOCAL_MOUDULE).a文件 
BUILD_EXECUTABLE                               在/system/bin/目录下生成可执行文件 
BUILD_PACKAGE                                      编译成一个apk文件 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值