Android BlueDroid分析: 配置文件(bt_stack.conf bt_vendor.conf )的加载与分析

说明 在Android BlueDroid启动,即stack启动的时候,回去加载好几个配置文件, 然后BlueDroid Stack根据这几个配置文件会进行调整, 例如Device ID(did), Log相关的Trace Level, COD(即Class of Device), BT snoop log相关配置等等.下面结合代码和配置文件一起来说明分析. 配置文件说明 配置文件分为运行时动态加载和编译的时候直接解析使用的.主要有下面三个, 冒号后面是简要的作用说明. 编译完成后,这些配置文件都是位于: /system/etc/bluetooth/

Continue reading »

Android BlueDroid分析: OSI中的Thread的实现与使用分析

说明 thread封装了pthread, 完成的功能是, 使用fixed_queue作为workquque, 将需要被执行的thread function放入其中(enqueue), 使用thread_post来enqueue,enqueue完成后semophore发送信号给dequeue, 然后使用reactor中的epoll_wait监控到dequeue semaphore变更, 就读出queue中的数据, 而queue中的item是thread function与args, 于是运行这个function, 完成任务执行功能.  结构体

  函数分析 创建thread以及reactor

Continue reading »

Android BlueDroid分析: OSI中的reactor的实现与使用分析

说明 actor相当于内核中的worker, 用于监控与执行任务. reactor可以认为是: re+actor. 监控使用的是epoll, 而执行任务使用的是对应的epoll_wait返回后的event type, 然后调用相关的read或者write函数来完成对应event type的处理.而epoll_wait对某个fd是监控和执行一次还是多次是使用eventfd来进行控制. epoll可以看下面的recator_change_registration这个函数的实现. 而eventfd的控制可以search event_read与event_write来找到对应的控制点. actor的类型 不断监控: 即epoll_wait返回后, 再继续监控. 体现在函数reactor_start,这个时候可以叫做reactor 一次性的: event发生后就被移除,不再监控.

Continue reading »

Android BlueDroid分析: OSI中的List与alloctor的实现分析

说明 在bluedroid中有许多数据是使用List来保存的, 而不同的数据的size各不相同,因此bluedroid中的osi封装了一个list. 不同的OS的malloc与free各不相同,因此为了屏蔽底层细节bluedroid对malloc与free进行了一个封装,成为alloctor. alloctor 定义 alloctor是一对函数函数指针的结构体,因此先要定义来个函数Pointer 类型。

可以看到,这个和libc中的malloc与free arguments与return type都是一样的,因此可以认为是OSI为了抽象分隔不同的“OS Interface”(Memory中的Stack 管理)。因此如果我们需要将BlueDroid移植到其他OS的话,需要注意适配。 alloctor_t结构体包含两个函数Pointer,一个是分配的fn,一个是释放的fn,函数Pointer类型定义如下:

  在Android中,使用的libc是bonic,和glibc一样,都实现C POSIX Library(参考Wikipedia),所以函数都是名称和传入参数都一样,也是malloc与free,因此:

Continue reading »

Android BlueDroid分析: OSI中的HashMap的实现

说明 hash map在C语言标准库中并没有封装, 不像其他语言那么方便, 例如python中有Dictionary, 而hashmap又非常有用, 因此Bluedroid自己封装了一套.封装实现的文件列表如下:

其中hash_functions.c中是对几个特殊类型的hashmap封装. 因此我们先说明hash map, 然后再看hash functions. HashMap概念与术语 首先如果要实现hashmap,那么需要做什么呢? 下面是引用StackOverFlow中的回答:

简单来说就是: A1. 创建:

Continue reading »

Andorid BlueDroid分析: Semophore的实现分析

实现 在BlueDroid的OSI/src目录下存放的是Operating System Interface相关的封装与实现, 其中semophore.c实现了父子进程间的Semophore, 可以用来对父子进程间执行顺序的控制,完成Notify与Wait的功能. 而这个semophore的实现依赖于Linux的eventfd, 同时使用了glibc的event_read与event_write, 因为BlueDroid主要使用在Android中(其他Linux OS中也有使用的情况), 所以很显然Android的bonic也实现了eventfd_read与eventfd_write. 所以如果想移植BlueDroid到其他非LinuxOS系统中,那么就需要实现这个eventfd. 函数 这个文件的Overview 共有六个函数, new与free, wait与try_wait, post与get_fd. 结构体 对fd用struct包装了一下:

Continue reading »