-
Notifications
You must be signed in to change notification settings - Fork 14
design
#开发文档
##1. 背景
移动端的统计需要考虑离线使用环境、网络状况复杂等情况
我们参考 MTJ 和 Google Analytics的开发文档结合现有的业务设计这套统计框架
以便更简单地开发和维护各种统计模块
###1-1. 需求
####1-1-1. 流量小
为减少网络流量,上报的数据需要使用 gzip
压缩
####1-1-2. 离线存储
在离线环境下保存到本地,当连接有效时发送数据
####1-1-3. 安全
保存在本地的数据需要加密处理
####1-1-4. 云策略控制
由于客户端发布的成本高,需要在云端控制一些统计策略,如:抽样率、发送频率、发送大小等
###1-2. 运行环境
系统要求:android 2.4+、ios5+
权限要求:网络访问、本地存储、网络状态获取
##2. 名词解释
名称 | 含义 | 备注 |
---|---|---|
NLog | Native Log | 移动客户端统计框架 |
Tracker | 追踪器 | 管理字段和上报时机 |
Field | 字段 | |
Event | 事件 | |
Send | 发送数据 | |
Report | 上报数据 | 会对Send的数据进行加工 |
Follow | 跟随 | 监听Activity生命周期 |
Instance | 实例 | |
Timestamp | 时间戳 | 毫秒 |
Session | 一次会话 | 默认挂起超30秒则重计算 |
Context | 上下文 | 主要调用操作系统API |
Activity | 活动 | |
Pause | 挂起 | |
Resume | 重新激活 | |
Rule | 策略 |
##3. 设计目标
###3-1. 使用简单
三个主要的API能完成工作
. 框架初始化
NLog.init(context,
"sendInterval=", 120,
"sendIntervalWifi=", 30
);
. 执行统计命令
NLog.cmd("pv.send", "appview",
"title=", title,
"uid=", uid
);
. 跟踪Activity生命周期
protected void onResumme() {
super.onResume();
NLog.follow(this);
}
###3-2. 高扩展性
-
上报字段可扩展
-
事件机制
###3-3. 稳定性、容错性高
-
io、network异常保护
-
数据可排重
###3-4. 性能卓越
-
尽量少的io操作
-
子线程处理,不致主进程堵塞
##4. 设计思路和折衷
###4-1. 本地存储几个文件?
方案 | 优势 | 劣势 | 选择 |
---|---|---|---|
单个文件 | 减少垃圾文件 | 设计复杂、读写容易冲突 | |
多个文件 | 设计简单 | 容易导致垃圾文件多 | √ 实际环境不会有过多文件产生 |
###4-2. 离线数据是否合并在一个包里发送
方案 | 优势 | 劣势 | 选择 |
---|---|---|---|
合并 | 减少发送次数 | 服务不容易排重 | |
分别发送 | 排重方便 | 需要多次发送 | √ 逻辑简单,维护方便 |
##5. 系统设计
###5-1. 架构图
- 说明 系统主要有三个模块组成:
-
负责提供给Application调用接口的
NLog
模块 -
负责组织上报数据的
NTracker
模块 -
负责存储的
NStorage
模块
###5-1. NLog
模块
暴露的主要接口
/**
* 初始化NLog
* @param context 上下文
* @param params 参数集合
*/
public void init(Context context, Object... params)
params 说明
参数 | 说明 | 单位 | 默认值 |
---|---|---|---|
ruleUrl | 云端策略存放的路径 | ||
ruleExpires | 策略文件过期时间 | 天 | 2 |
onlywifi | 只在wifi环境下发送 | bool | false |
sendInterval | 重发数据周期 | 秒 | 120 |
sendIntervalWifi | 在wifi环境下的重发周期 | 秒 | 60 |
sessionTimeout | 会话超时时间 | 秒 | 30 |
storageExpires | 离线数据过期时间 | 天 | 10 |
sampleRate | 各个Tracker的抽样率 | 全部1 |
/**
* 执行命令
* @param cmd 命令,"<追踪器名>.<方法名>"
* @param params 参数列表
* @return 返回get命令结果
*/
public Object cmd(String cmd, Object... params)
详细接口文档参考:api文档
cmd 说明
参数 | 说明 | 备注 |
---|---|---|
"set" | 设置字段 | |
"get" | 获取字段 | |
"send" | 发送数据 |
cmd 为 send 说明
参数 | 说明 | 备注 |
---|---|---|
"appview" | 激活 | |
"event" | 事件 | |
"timing" | 耗时 | |
"exception" | 异常 |
###5-2. 主要流程
####5-2-1. 启动流程
检查策略文件
-
(不存在) [使用默认策略]
-
(已过期) [请求策略文件] [使用默认策略]
-
(未过期) [使用云策略] [开始数据收集]
####5-2-2. 发送流程图