Countly客户端分析
1. MainActivity:测试入口
2. AdvertisingIdAdapter
3. ConnectionProcessor 网络连接传输
4. ConnectionQueue 传输队列
5. Countly 技术核心类
6. CountlyStore 统计数据存储本地实现
7. DeviceId DeviceId 用户id
8. DeviceInfo DeviceInfo系统信息
9. Event 用户自定义事件
10. EventQueue 自定义事件队列
11. MessagingAdapter 客户端消息接收适配器
12. OpenUDIDAdapter UDID适配器
13. ReferrerReceiver
14. UserData 用户信息
15. OpenUDID_manager UDID产生
16. OpenUDID_service 产生
1. SharedInstace为Countly提供的单例对象,也是统计数据的入口
onTimer()方法在Countly对象构造时启动,默认每60秒调用一次
对外通过Countly.sharedInstance()方法取得单例对象,并通过init方法初始化
2. 系统统计信息在触发和每隔定时时间并发送给服务器,自定义事件通过EventQueue暂存在本地,并通过Timer定时发送给服务器,或当EventQueue的事件数大于设置时调用发送(默认10).发送事件完成后从本地删除事件
网络连接通过ConnectionQueue->ConnectionPssor发送
3. 发送数据格式为打包成JSON发送.
4. 在数据发送末尾会加上唯一deviceId为后缀,以标识用户
默认提供的deviceId为ANDROID_ID,这个ID作为设备的唯一识别码是不可靠的,后期可以考虑改为UUID
5. UserData的实现为我们提供了得到统计信息人员的相关信息
三. 源码分析
1. 入口函数
得到Countly实例,并初始化
2. 记录自定义事件,分为实时记录和延时记录
3. Countly的启动与停止
4. 设置用户信息
5. Countly对象实例化过程
Countly对象在实例化过程中绑定了connectionQueue对象,并创建了一个线程池,使其每隔TIMER_DELAY_IN_SECONDS时间执行一次onTimer方法.默认60秒执行一次
6. Countly初始化过程
在这里需要注意的是关于deviceId,默认设置的为null,可以自定义为其设值,UID的type这里是通过去判断是否存在OpenUDID_manager这个类判断其TYPE.
在实际的初始化过程中,先进行了容错的判断,然后实例并初始化EVENT队列,deviceID,以及对连接队列进行初始化
7. OnTimer()
OnTimer()方法主要完成两件事:1,更新系统信息 2,发送自定义事件记录信息
其中更新系统信息中的参数代表了距上次更新相隔多少时间,具体算法如下:
8. updateSession()
updateSession()方法执行了更新系统系统信息的操作,需要注意的是,它首先拼接了数据,并将数据存储在本地,再由tick()方法发送.存储在本地的方法只是将其格式化为JSON格式,并存储在preferences中,这里就不再详细说明了.
9. Tick()方法
Tick()方法将需要发送数据提交给了另一个线程单独进行,在这里使用Future可以保证每次的发送都是独立的.实际上的数据发送交给了ConnectionProcessor去处理
10. ConnectionProcessor.run()
ConnectionProcessor.run()方法是网络连接与发送数据最核心的地方,其中先将待发送的数据拼接上用户ID,得到并创建连接,发送数据,保存发送状态.需注意的是,在发送成功后,会清除掉本地保存的数据,如果发送失败,则保留数据,以备后续发送
注意:发送给服务端的数据均是JSON格式.
至此,数据发送流程已基本清楚,线面我们来分析countly服务启动,关闭以及自定义事件埋点
11. 服务启动
12.
四.
一. 代码结构域功能分析
1. MainActivity:测试入口
2. AdvertisingIdAdapter
3. ConnectionProcessor 网络连接传输
4. ConnectionQueue 传输队列
5. Countly 技术核心类
6. CountlyStore 统计数据存储本地实现
7. DeviceId DeviceId 用户id
8. DeviceInfo DeviceInfo系统信息
9. Event 用户自定义事件
10. EventQueue 自定义事件队列
11. MessagingAdapter 客户端消息接收适配器
12. OpenUDIDAdapter UDID适配器
13. ReferrerReceiver
14. UserData 用户信息
15. OpenUDID_manager UDID产生
16. OpenUDID_service 产生
二. 执行图分析
1. SharedInstace为Countly提供的单例对象,也是统计数据的入口
onTimer()方法在Countly对象构造时启动,默认每60秒调用一次
对外通过Countly.sharedInstance()方法取得单例对象,并通过init方法初始化
2. 系统统计信息在触发和每隔定时时间并发送给服务器,自定义事件通过EventQueue暂存在本地,并通过Timer定时发送给服务器,或当EventQueue的事件数大于设置时调用发送(默认10).发送事件完成后从本地删除事件
网络连接通过ConnectionQueue->ConnectionPssor发送
3. 发送数据格式为打包成JSON发送.
4. 在数据发送末尾会加上唯一deviceId为后缀,以标识用户
默认提供的deviceId为ANDROID_ID,这个ID作为设备的唯一识别码是不可靠的,后期可以考虑改为UUID
5. UserData的实现为我们提供了得到统计信息人员的相关信息
三. 源码分析
1. 入口函数
得到Countly实例,并初始化
2. 记录自定义事件,分为实时记录和延时记录
3. Countly的启动与停止
4. 设置用户信息
5. Countly对象实例化过程
Countly对象在实例化过程中绑定了connectionQueue对象,并创建了一个线程池,使其每隔TIMER_DELAY_IN_SECONDS时间执行一次onTimer方法.默认60秒执行一次
6. Countly初始化过程
在这里需要注意的是关于deviceId,默认设置的为null,可以自定义为其设值,UID的type这里是通过去判断是否存在OpenUDID_manager这个类判断其TYPE.
在实际的初始化过程中,先进行了容错的判断,然后实例并初始化EVENT队列,deviceID,以及对连接队列进行初始化
7. OnTimer()
OnTimer()方法主要完成两件事:1,更新系统信息 2,发送自定义事件记录信息
其中更新系统信息中的参数代表了距上次更新相隔多少时间,具体算法如下:
8. updateSession()
updateSession()方法执行了更新系统系统信息的操作,需要注意的是,它首先拼接了数据,并将数据存储在本地,再由tick()方法发送.存储在本地的方法只是将其格式化为JSON格式,并存储在preferences中,这里就不再详细说明了.
9. Tick()方法
Tick()方法将需要发送数据提交给了另一个线程单独进行,在这里使用Future可以保证每次的发送都是独立的.实际上的数据发送交给了ConnectionProcessor去处理
10. ConnectionProcessor.run()
ConnectionProcessor.run()方法是网络连接与发送数据最核心的地方,其中先将待发送的数据拼接上用户ID,得到并创建连接,发送数据,保存发送状态.需注意的是,在发送成功后,会清除掉本地保存的数据,如果发送失败,则保留数据,以备后续发送
注意:发送给服务端的数据均是JSON格式.
至此,数据发送流程已基本清楚,线面我们来分析countly服务启动,关闭以及自定义事件埋点
11. 服务启动
12.
四.