背景介绍

随着流量红利逐渐消失,移动互联网时代正式进入了一个新的阶段,这个阶段要求我们对有限的流量进行精细化运营、深度挖掘加工,从而使流量进行有效转换和不断增长。
    完备的前端监控系统是精细化运营的主要手段、它通过大数据来指导我们的运营策略、改善用户体验,同时也通过对数据半自动或者自动分析,来快速定位被监控系统的问题。
    前端监控的第一个环节就是数据采集,其中移动APP的数据采集在数据采集中占主要的方面,本文就主要聊一聊Android端数据采集。

定义

数据采集指数据采集到后台服务器的过程。

基本流程

数据采集基本流程.jpg

名词解释

数据抓取
    抓取App运行数据、例如用户点击事件、性能数据、运行异常崩溃等,也叫数据采集、但是为了跟我们大的数据采集区分开、我们本文中统称为数据抓取。
数据缓存
    根据数据抓取时App运行环境、进行不同策略的本地缓存。这里不同策略是指缓存方式不同、缓存时间不同、触发上报时机不同等。
    例如:缓存方式,当抓取的数据缓存时候、可以选择文件缓存、数据库缓存、内存缓存等;缓存时间、对于不同级别的监控,要求可以有立马上报、每天上报、每小时上报等;触发上报时机,例如将用户浏览页面的情况(浏览了哪些app页面)存储于本地数据库,等用户处于wifi环境时候把数据上传到服务器。
数据上报
    在特定时机把抓取到的数据和缓存数据上传到后台服务器。

SDK设计要求

为了方便使用,我们一般会把数据采集部分做成一个单独的模块,以Lib的形式提供给主应用使用。一个好的SDK要满足如下条件:

1.简洁易用

a)易学习
  让开发者尽量花比较少的时间来学习。
b)少侵入
  SDK接入时用户尽可能的少的修改主应用代码。
c) 少升级
  SDK接入后不会频繁要求升级。

2.稳定

a)稳定的API
  对外提供稳定的API一旦确定,如无非常严重情况不可更改。
b)稳定的业务
  在稳定的API后,要有稳定的业务来支撑,业务逻辑也不可随意更改。
c)稳定的运行
  SDK运行错误异常较少。

3.高效

a) 内存占用少
b)流量费用低
c) 电量消耗少
d) 时间响应快

     参照数据采集基本流程和SDK设计原则,我们开始深入研究数据采集模块.
     数据采集模块LuckinMonitor概况图如下

LuckinMonitor结构图.jpg

看到这里基本就讲完了,下面主要是针对一些具体部分进行介绍。

内容详解

一 外部接口标准

luckinMonitor是一个单独的模块,以Lib形式供主应用使用,参照SDK标准它应该易学习并且对主模块侵入少。 这就要求接口尽可能少、功能尽可能明确。整个数据采集SDK第一步是数据抓取、所以我们对外的接口都是在这一层暴露出来。所以在数据抓取部分会介绍对外的接口。

二 数据抓取

目标: 抓取用户点击事件、业务性能数据、异常崩溃、用户设备信息等。
问题:不同类型的数据抓取方法不同。
要求:数据抓取是整个数据采集SDK与主应用的接入点,所以要求有少侵入,Api设计稳定合理,少而简单、有新的需求易扩展。
实施:首先我们把所有的需要抓取的数据类型一一罗列出来、每一种数据类型都按照尽量少侵入业务代码的思路去整理出来它的抓取方法。我列举了一部分如下表格:

数据类型举例.png

接下来把其他需要采集的数据进行逐条分析,跟业务关联比较紧密就不一一列举。根据采集数据方法的不同,我们来构造不同的数据采集器-具体实现抓取数据的类。外界对数据抓取技术研究也挺多,大概分为两类.
    a) 侵入式抓取、也叫代码中埋点;
    b) 非侵入式抓取,也可以叫无痕埋点。
    代码中埋点指的就是在你写业务代码时候,加上抓取事件的代码。例如 你想知道一个Activity(页面)啥时候显示,那么你在onResume地方打一个带有时间戳的log,就是把这Activity显示时间给抓取到了。
    代码中埋点对不同的种类比如检测内存泄漏、crash的可能就是一句初始化、一些具体业务逻辑可能需要在代码中放置很多数据抓取的代码,所以在monitor中 我们暂时有三种数据抓取方法:

1 代码埋点抓取

所谓代码埋点,就是在程序中写上我们抓取业务流程、性能数据等的代码。因为代码中埋点适用范围广泛,可以处理数据类型多种多样、所以我们需要预先设计好我们的数据类型尽可能通用、达到少而覆盖全面、同时又能对不同的数据类型做统一的存储和上报处理。例如我们定义了EventMessage 包含字段event_code和event_remark 这样我们在抓取不同的Event时间、比如登录、支付等都可以这样处理,只是填写不同的event_code和event_remark

Event事件抓取.png

除了EventMessage 还有PerformMessage、DNSMessaget等、抓取到的数据如何在下一步、存储上报用同样的接口进行呢?所以我们封装了一个顶层类AppMessage该类里面带有一些通用的信息,比如app版本号、事件发生时间、手机类型Android or IOS、数据采集ID和一些通用方法等。

2 无痕埋点抓取点击事件等

LuckyMonitor中,采用AspectJ技术实现非入侵式代码埋点、主要用来检测各种view的点击事件。AspectJ就是在编译时候把埋点的代码写入到特定的位置,相当于编译器帮助我们进行代码埋点,我们需要做的就是告诉AspectJ的编译器在哪里进行代码中埋点。

3 crash信息抓取

crash信息抓取基本原理就是实现接Thread.UncaughtExceptionHandler实现了这个接口就可以在程序发生crash时候、调用到这里进行自己的处理逻辑,比如把抓到的crash trace存储起来,上报等。

三 数据缓存

利用Android自带的SQLite数据库进行缓存数据。具体待续..

四 数据上报

利用Netty进行数据上报。具体待续..

AndroidAPP数据采集SDK设计相关推荐

  1. SDK设计心得之接口设计

    由于SDK的特殊性,所以对于SDK的开发来说,一开始对于SDK的一些通用的整体的元素的设计至关重要.因为SDK(尤其很多平台SDK,使用的应用成百上千)一个及其细微的调整都会影响很多开发者的版本周期. ...

  2. 高德智慧交通地图空间可视化SDK设计与实现

    一.背景 地图空间可视化作为高德智慧交通前端业务中最重要的功能之一,承担着城市交通大脑.全境智能大屏等业务中大量的地图渲染需求.作为向用户展示交通数据的窗口,我们需要展现省.市.区.商圈.自定义区域多 ...

  3. 短视频客户端SDK设计与实现

    直播与短视频相继爆发,也促使众多企业纷纷加入其中,对于许多传统企业和中小企业而言音视频开发成为了最大难点,而视频云客户端SDK也就无疑成为了不错的选择.本文是全民快乐研发高级总监展晓凯在LiveVid ...

  4. 【国产虚拟仪器】基于dsp+fpga+AD+ENDAC的半导体运动台高速数据采集电路仿真设计(四)

    整个调试验证与仿真分析分三个步骤:第一步是进行 PCB 检查及电气特性测试,主 要用来验证硬件设计是否正常工作:第二步进行各子模块功能测试,包括高速光纤串行 通信的稳定性与可靠性测试, A/D 及 D ...

  5. 游戏平台SDK设计和开发之旅——XSDK功能点梳理

    做游戏开发或者相关工作的同学,可能都知道,在游戏上线之前,需要将游戏分发到各大渠道平台,比如九游,百度,360,华为等等.其中和技术相关的事情,就是要在游戏中接入这些渠道平台的平台SDK,平台SDK中 ...

  6. Socket编程与应用开发---- 数据采集的设计与实现(TCP)

    ​​​​​​ 代码 Server: #include <stdio.h> #include <winsock2.h> #pragma comment(lib, "WS ...

  7. GrowingIO 数据采集 iOS SDK 测试实践

    作者:吕雨强 GrowingIO iOS 测试工程师,主要负责 iOS SDK 功能测试.自动化测试 . GrowingIO 是基于用户行为数据的增长平台,精准采集用户行为数据是公司业务的基石,只有及 ...

  8. 漫谈大数据 - 如何设计业务埋点方案与数据采集应用

    业务埋点和数据分析是在用户行为和业务数据上进行跟踪.收集和分析的关键方法,用于了解用户行为模式.改进产品和服务,并做出数据驱动的决策. 全文1.5万字,建议阅读时间35min. 目录 业务埋点 埋点的 ...

  9. 前端监控系列1| 字节的前端监控SDK是怎样设计的

    作者:彭莉,火山引擎 APM 研发工程师,2020年加入字节,负责前端监控 SDK 的开发维护.平台数据消费的探索和落地. 摘要 字节内部监控环境多样( Web 应用.小程序.Electron 应用. ...

最新文章

  1. HDU4009(最小树形图)
  2. openssl——初了解
  3. 青龙羊毛——某元宇宙(非原创)
  4. php跳转404_php伪静态.htaccess实现403,404跳转
  5. 浅谈Base64编码算法
  6. Protobuf序列化的原理
  7. linux 安装tomcat遇到的问题
  8. SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列
  9. 【JavaWeb】JDBC优化 之 数据库连接池、Spring JDBC
  10. android播放html5视频,仅仅有声音没有图像视频
  11. 史上最大,人工智能算法模型 GPT-3 问世,这意味着什么?
  12. 【干货】李航老师《统计学习方法》(第2版)清华PPT课件分享
  13. pytorch参数dim为-1的解释
  14. Cesium离线地图极简教程
  15. 可视化丨福尔摩斯探案集的数据分析
  16. python内存地址不变,关于python内存地址问题
  17. 兴趣爱好页面.html,兴趣筛选页面.html
  18. 如何理解面向对象的封装、继承、多态
  19. 服务器 系统打补丁,2019服务器系统打补丁方法
  20. 关于工控安全什么是设备加密?

热门文章

  1. SIFT的两个版本:OpenCV和VL_SIFT
  2. Amazon EC2 实例类型
  3. rgb sw 线主板接口在哪_RGB实用兼具:火鸟 黎明至尊 ARGB机箱 上机体验
  4. win10环境安装EMQX过程
  5. 为什么c语言编的爱心是歪的,C语言之后(歪谈语言史)
  6. Docker之自定义上传镜像阿里云
  7. 阿里云上部署web应用(环境搭建,项目部署)
  8. python编写高质量代码_用 Python 编写干净、可测试、高质量的代码
  9. 阿里云开通maven仓库服务及springboot集成
  10. 微信小程序开发的基本语法使用