APP数据采集SDK设计

作者: 蚍蜉一生 | 来源:发表于2019-01-08 16:41 被阅读19次

    背景介绍

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

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

    内容详解

    一 数据抓取

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

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

    1 代码埋点抓取

        所谓代码埋点,就是在程序中写上我们抓取业务流程、性能数据等的代码。
    因为是代码埋点,不需要什么特殊的技术、所以只需一个通用的上报数据处理器就好,但是为了跟其他方式分割开,用一个空实现类DefaultReporter。

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

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

    3 crash信息抓取

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

    外部接口

        封装的LuckyMonitor如何使用呢,一个库如何才能更方便的使用呢? 肯定是对外提供的接口越简单、越稳定越好。但是我们需要采集、处理的数据类型都各种不同、所以就需要我们提供更好的封装。构造一个数据类型的超类,内部判断可以根据不同的数据类型采取不同的数据抓取方案。

    数据抽象类介绍(待完善)

    顶层类:AppMessage里面带有一些通用的信息,比如app版本号、事件发生时间、手机类型Android or IOS、数据采集ID等。
    具体来说有以下几种数据
      1 DeviceMessage 设备信息例如手机品牌、手机型号、系统版本号等
      2 DnsMessage 域名系统信息
      3 EventMessage
      4 ExceptionMessage

    参考文档

      https://www.jianshu.com/p/5cf360fc9957
      https://blog.csdn.net/wozuihaole/article/details/70224920

    相关文章

      网友评论

        本文标题:APP数据采集SDK设计

        本文链接:https://www.haomeiwen.com/subject/jtlbrqtx.html