Weave 协议分析

编者:厦门大学信息学院通信工程系2015级研究生 徐惠、吴振阳、王一臻

源码目录位置:bdk/system/weave/

1、Weave介绍

Weave 是一个开放的通信协议,是专门设计用于物联网设备进行通讯的跨平台通用语言。
如图一所示,Weave建立了Cloud-Phone-device的通信链接。

                     图一

通过weave协议确保接入你的设备,并且你的用户数据是安全和私有的。 Weave基于JSON数据格式。JSON格式是互联网中非常常见的格式,它也可以很方便整合到被收购的Firebase中,也很容易和Chrome浏览器打通。

2、Android.mk文件分析

Weaved目录下包括一个android.mk和brillo、buffet、common、libweaved文件夹,这个android.mk包括了所有Weaved目录下source的信息。接下来将详细分析android.mk内容。
Android.mk文件最开始为本地路径:
LOCAL_PATH := $(call my-dir)
Android.mk 开始必须定义变量 LOCAL_PATH,它用来指定源文件的位置。
my‐dir: 编译系统提供的'my‐dir'宏函数,返回当前 Android.mk 所在的目录的路径。
接下来是给出模块用到的一些参数:common variables
包括如下几个部分:

  • 1、buffetCommonCppExtension:= .cc
    C++源码文件的扩展名为.cc
  • 2、buffetCommonCppFlags
    指定其他的编译选项和宏定义
  • 3、buffetCommonCIncludes
    是NDK根目录的相对路径。当编译C/C++、汇编文件时,这些路径将被追加到头文件搜索路径列表中。
  • 4、buffetSharedLibraries
    运行时所依赖的库

3、对模块库的编译和使用

3.1、weave-common模块分析

weave-common模块:编译静态库,主要是waved守护进程和客户端libweaved库的代码的共享。

  • include $(CLEAR_VARS) //指向一个编译脚本, 必须在开始一个新模块之前包含这个脚本,用于重置除//LOCAL_PATH变量外的,所有LOCAL_XXX系列变量
  • LOCAL_MODULE := weave-common //这是模块的名字,它必须是唯一的,而且不能包含空格
  • LOCAL_CPP_EXTENSION := $(buffetCommonCppExtension) //指出C++ 扩展名。(可选)
  • LOCAL_CFLAGS := $(buffetCommonCFlags) //一个可选的设置,在编译C/C++ source 时添加如Flags。用来附加编译选项
  • LOCAL_CPPFLAGS := $(buffetCommonCppFlags) //指定当编译C/C++源码的时候,传给编译器的标志。它一般用来指定其他的编译选项和宏定义。C++ Source 编译时添加的C Flags。这些Flags将出现在LOCAL_CFLAGS //flags 的后面
  • LOCAL_C_INCLUDES := $(buffetCommonCIncludes) //一个路径的列表,是NDK根目录的相对路径(LOCAL_SRC_FILES中的文件相对于LOCAL_PATH)。当编译C/C++、汇编文件时,这些路径将被追加到头文件搜索路径列表中。一个可选的path列表。相对于NDK ROOT目录。编译时将会把这些目录附上。
  • LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/brillo
  • LOCAL_SHARED_LIBRARIES := $(buffetSharedLibraries) //要链接到本模块的动态库
  • LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) //一个可选的path列表。相对于NDK ROOT 目录。编译时,将会把这些目录附上
  • LOCAL_CLANG := true
  • LOCAL_SRC_FILES //包含将要打包如模块的C/C++ 源码
  • include $(BUILD_EXECUTABLE) //编译为Native C可执行程序
  • include$(BUILD_STATIC_LIBRARY), //该模块需要使用哪些静态库,以便在编译时进行链接
  • include$(BUILD_SHARED_LIBRARY), //表示模块在运行时要依赖的共享库(动态库),在链接时就需要,以便在生成文件时嵌入其相应的信息。
    LOCAL_SRC_FILES := \
    brillo/android/weave/IWeaveClient.aidl \
    brillo/android/weave/IWeaveCommand.aidl \
    brillo/android/weave/IWeaveService.aidl \
    brillo/android/weave/IWeaveServiceManager.aidl \ brillo/android/weave/IWeaveServiceManagerNotificationListener.aidl \
    common/binder_constants.cc \
    common/binder_utils.cc \
    //包含将要打包如模块的C/C++ 源码,我们可以看到打包的文件包括../android/weave下的所有文件,和../common/ 下的binder_constants.cc和binder_utils.cc,这是因为weaved和app service之间是通过binder机制进程之间的通信,如图二所示。

    图二 命令/数据流

3.2、weave-daemon-common模块

weave-daemon-common模块:编译静态库,这个模块是weaved守护进程和测试单元之间代码共享,它本质是weaved静态库的实现。
与前面的不同主要在LOCAL_SRC_FILES上。
LOCAL_SRC_FILES := \
brillo/weaved_system_properties.cc \
buffet/ap_manager_client.cc \
buffet/avahi_mdns_client.cc \
buffet/binder_command_proxy.cc \
buffet/binder_weave_service.cc \
buffet/buffet_config.cc \
buffet/dbus_constants.cc \
buffet/flouride_socket_bluetooth_client.cc \
buffet/http_transport_client.cc \
buffet/manager.cc \
buffet/shill_client.cc \
buffet/socket_stream.cc \
buffet/webserv_client.cc \
这个模块已经是各个设备、手机、网络等之间的互联,因此包括http_transport、socket_stream、flouride_socket_bluetooth_client等传输方式。也包括binder,系统属性等。
最后代码是brillo的安全特征,引入的Oauth 2.0认证,加密证书。Weave在安全性方面还保证了用户数据的隐私,不仅在传输层,在链路层使用SSL(Secure Sockets Layer)/TLS(Transport Layer Security)协议保证用户的数据隐私。
ifdef BRILLO
LOCAL_SRC_FILES += buffet/keystore_encryptor.cc
else
LOCAL_SRC_FILES += buffet/fake_encryptor.cc
endif

3.3、Weaved模块

Weaved模块:编译为Native C可执行程序,weave守护进程的二进制 模块内调用前面编译的两个模块weave-common和weave-daemon-common。
LOCAL_STATIC_LIBRARIES := weave-common \
LOCAL_WHOLE_STATIC_LIBRARIES := weave-daemon-common
最后再打包main.cc构成一个完整的可执行程序
LOCAL_SRC_FILES := \
buffet/main.cc

3.4、Libweaved模块

Libweaved模块:编译动态库,客户端的给weave守护进程的库文件,如果你想要进行weaved通信就要链接上libweaved。app与weaved之间通过binder链接
这里只包含库weave-common模块,没有直接与外界相连。
LOCAL_STATIC_LIBRARIES := weave-common

3.5、weaved_test模块

weaved_test模块:weaved测试模块。
库包括前面的weave-common模块和weave-daemon-common模块和测试支持的库。
LOCAL_STATIC_LIBRARIES := \
libbrillo-test-helpers \
libchrome_test_helpers \
libgtest \
libgmock \
libweave-test \
weave-daemon-common \
weave-common \

4、参考链接

1、Android.mk 文件语法详解
http://www.cnblogs.com/wainiwann/p/3837936.html
2、Android.mk详解
http://blog.csdn.net/ly131420/article/details/9619269

results matching ""

    No results matching ""