service分析
编者:厦门大学信息学院通信工程系2015级研究生孙甜、叶林飞
目录位置: frameworks/native/services/sensorservice/
1 service目录Android.mk文件分析
LOCAL_PATH := $(call my‐dir) Android.mk 开始必须定义变量LOCAL_PATH,它用来指定源文件的位置。my‐dir: 编译系统提供的'my‐dir'宏函数,被用来获取当前的目录。
1.1 创建第一个模块
首先创建一个名为libsensorservice的第一个模块,代码如下:
include $(CLEAR_VARS)
编译系统提供CLEAR_VARS变量,它指向了一个用来清除LOCAL_XXX开头的变量(例如LOCAL_MODULE,LOCAL_SRC_FILES但是LOCAL_PATH除外)的makefile文件,需要它的原因是整个的编译上下文中,所有的变量都是全局的,这样就可以保证这些变量只在局部范围内起作用。
LOCAL_SRC_FILES:= \
BatteryService.cpp \
CorrectedGyroSensor.cpp \
Fusion.cpp \
GravitySensor.cpp \
LinearAccelerationSensor.cpp \
OrientationSensor.cpp \
RotationVectorSensor.cpp \
SensorDevice.cpp \
SensorFusion.cpp \
SensorInterface.cpp \
SensorService.cpp
LOCAL_SRC_FILES必须包含一系列的C/C++源文件,它将会被建立和装载到模块中。在该代码将以上源文件建立并装载到模块中。
LOCAL_CFLAGS:= -DLOG_TAG=\"SensorService\"
LOCAL_CFLAGS += -fvisibility=hidden
LOCAL_CFLAGS变量为C/C++编译器定义额外的标志,当编译C/C++源文件时传递一个可选的编译器标志,这对于指定额外的宏定义或编译选项很有用。相当于在所有源文件中增加一个#define LOG_TAG. 重要提示:尽量不要改变Android.mk中的优化/调试级别,这个可以通过在Application.mk中设置相应的信息来自动为你处理,并且会会让NDK生成在调试过程中使用的有用的数据文件。注意:在Android-ndk-1.5_r1中,只使用于C源文件,而不适用于C++源文件。在匹配所有Android build system的行为已经得到了纠正。(现在你可以为C++源文件使用LOCAL_CPPFLAGS来指定标志)它可以用LOCAL_CFLAGS += -I<path>来指定额外的包含路径,然而,如果使用LOCAL_C_INCLUDES会更好,因为用ndk-gdk进行本地调试的时候,那些路径依然是需要使用的。
在编译动态库时,想把一些不需要导出函数给隐藏起来。因此使用了-fvisibility属性。
LOCAL_SHARED_LIBRARIES := \
libcutils \libhardware \
LOCAL_SHARED_LIBRARIES变量用来列出模块所需的共享库的列表,不需要加上.so后缀。如上。
LOCAL_MODULE:= libsensorservice
创建一个LOCAL_MODULE,MODULE名字必须是唯一的并且不包含任何空格,编译系统将自动的修改生成的前缀和后缀,该代码创建了一个名为libsensorservice的LOCAL_MODULE。
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY是编译系统提供的变量,指向一个GUN Makefile脚本,负责收集从上次调用include $(CLEAR_VARS)以来,定义在LOCAL_XXX变量中的所有信息,注意:在include这个脚本文件之前你必须至少已经定义了LOCAL_MODULE和LOCAL_SRC_FILES。注意:这会生成一个名为lib$(LOCAL_MODULE).so的动态库。至此完成模块libsensorservice的创建。
1.2生成可执行文件
include $(CLEAR_VARS)
在每个module中都要设置以LOCAL_开头的变量。它们会被include $(CLEAR_VARS)命令来清除,你会在你的很多module中使用这些LOCAL_开头的变量。
LOCAL_SRC_FILES:= \
main_sensorservice.cpp
LOCAL_SRC_FILES变量必须包含一系列将被构建和组合成模块的C/C++源文件。注意:不需要列出头文件或include文件,因为生成系统会为你自动计算出源文件的依赖关系。默认的C++源文件的扩展名是.cpp,但你可以通过定义LOCAL_DEFAULT_EXTENSION来指定一个扩展名。
LOCAL_SHARED_LIBRARIES := \
libsensorservice \
libbinder \
libutils
LOCAL_SHARED_LIBRARIES变量用来列出模块所需的共享库的列表,不需要加上.so后缀。如上。
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE:= sensorservice
optional:指该模块在所有版本下都编译,
LOCAL_MODULE变量必须定义,用来标识在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。如果有其它moudle中已经定义了该名称,那么你在编译时就会报类似这样的错误:libgl2jni already defined by frameworks/base/opengl/tests/gl2_jni/jni. Stop. 注意:编译系统会自动产生合适的前缀和后缀
补充:变量命名的规范性
如果LOCAL_MODULE变量定义的值可能会被其它module调用时,就要考虑为其变量命名的规范性了。特别是在使用JNI时,既在LOCAL_JNI_SHARED_LIBRARIES变量中定义的值,最好要和LOCAL_MODULE变量定义的值保存一致(具体请参考LOCAL_JNI_SHARED_LIBRARIES变量的使用说明)。这时的LOCAL_MODULE变量的命名最好以lib开头,既“libxxx”。
include $(BUILD_EXECUTABLE)
include $(BUILD_EXECUTABLE)表示编译成可执行程序