Android.mk的基本语法

来源:互联网 发布:aerial windows 编辑:程序博客网 时间:2024/05/29 04:57
Android.mk的基本语法
 
一、基本使用方法
    Android.mk的作用:编译生成native 库,供上层使用
    编译方法:进入Android.mk所在的路径,执行编译命令:mm
    生成库的路径:在执行mm成功后,会在屏幕上print出来,一般放在路径:out\target\product\msm8625\system\lib
    可以使用如下命令直接将生成的库push到手机中
            adb push *.so /system/lib/

二、文件的基本结构
    Android.mk文件主要用来生成*.so, 一个Android.mk文件可以生成一个或者多个*.so
    每生成一个*.so的程序段是一样的,如下为生成一个库libsensors.msm7627a_sku7.so的程序段结构

1        LOCAL_PATH := $(call my-dir)
2        include $(CLEAR_VARS)
3
4        LOCAL_MODULE := sensors.msm7627a_sku7
5        LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
6        LOCAL_MODULE_TAGS := optional
7        LOCAL_CFLAGS := -DLOG_TAG=\"Sensors\" \
8         -Wall
9        LOCAL_CFLAGS += -DCM3623_SENSOR
10      LOCAL_SRC_FILES := \
11SensorBase.cpp \
12InputEventReader.cpp \
13AkmSensor.cpp \
14Cm3623.cpp \
15ProximitySensor.cpp \
16LightSensor.cpp \
17AccSensor.cpp \
18sensors.cpp
19
20
21      LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../mlsdk/platform/include
22      LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../mlsdk/platform/include/linux
23
24      LOCAL_SHARED_LIBRARIES := liblog libcutils libdl
25      LOCAL_PRELINK_MODULE := false
26
27      include $(BUILD_SHARED_LIBRARY)



        以蓝色标记的第1行和第27行是整个程序段的开始和结束标识,如果在这个Android.mk文件中要编译其它的模块,那么只需添加相同的程序段就可以了
        第1行是将当前的路径保存在变量LOCAL_PATH中
        第4行指定编译模块的名称为sensors.msm7627a_sku7, 当编译通过后,会生成库,自动在这个名字前面加前缀lib,在后面加文件名.so
形成libsensors.msm7627a_sku7.so
        第5行指定这个库文件输出的路径
        第6行说明此模块被编译的条件
            LOCAL_MODULE_TAGS :=user eng tests optional
            user: 指该模块只在user版本下才编译
            tests: 指该模块只在tests版本下才编译
            optional:指该模块在所有版本下都编译
        第7~9行指定编译器选项
        第10~18行指定编译的源文件列表
        第21~22行指定头文件路径
        第24行指定这个模块在运行时要依赖的共享库模块列表,在链接时需要,在生成文件时嵌入的相应的信息。

三、其它语法或者变量
        LOCAL_STATIC_LIBRARIES: 
        应该链接到这个模块的静态库列表(使用BUILD_STATIC_LIBRARY生成),这仅仅对共享库模块才有意义。

四、其它要点
1.    变量赋值符号    :=和=的区别
      :=表示如果它右边是一个变量,那么只能取这条语句之前变量定义的值,不能取这条语句之后变量定义的值
      :  表示,如果它右边是一个变量,那么这个变量定义在这第语句之前或者之后都是可以的。

2.    Android.mk中的很多选项都定义在文件android/build/core/config.mk中
       比如 CLEAR_VARS, BUILD_SHARED_LIBRARY等。

3.    $表示引用变量的值

4.    编译应用程序的Android.mk的模板:
           LOCAL_PATH := $(call my-dir)

                ...
                ...

           include $(BUILD_EXECUTABLE)

5.    编译静态链接库的Android.mk的模板:
           LOCAL_PATH := $(call my-dir)
                ...
                ...
          include $(BUILD_STATIC_LIBRARY)
6.    静态链接库和动态链接库有什么区别?


7.    LOCAL_CFLAGS有两个作用:
       定义宏
       如: 
       LOCAL_CFLAGS  += -D_ANDROID_
       表示定义一个宏
       #define _ANDROID_

       引入第三方头文件
       如:
       LOCAL_CFLAGS += -include bionic/libc/kernel/common/linux/un.h
        

8.    LOCAL_MODULE_TAGS这个变量用于指定该模块在何种情况下被编译
       可选的值有几个:
       user:    该模块只在user模式下才被编译
       eng:    该模块只在eng模式下才被编译
       tests:   该模块只在tests模式下才被编译
       optional:   该模块在所有模式下都会被编译




0 0