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 := \
11
SensorBase.cpp \
12
InputEventReader.cpp \
13
AkmSensor.cpp \
14
Cm3623.cpp \
15
ProximitySensor.cpp \
16
LightSensor.cpp \
17
AccSensor.cpp \
18
sensors.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: 该模块在所有模式下都会被编译