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的程序段结构



 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\" \



         -Wall



9        LOCAL_CFLAGS += -DCM3623_SENSOR


10      LOCAL_SRC_FILES := \



SensorBase.cpp \



InputEventReader.cpp \



AkmSensor.cpp \



Cm3623.cpp \



ProximitySensor.cpp \



LightSensor.cpp \



AccSensor.cpp \



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:   该模块在所有模式下都会被编译