数极客是国内新一代用户行为分析平台,支持无埋点采集,前端代码埋点采集,后端代码埋点采集等多种混合数据采集方式,支持30多种数据可视化效果,是增长***必的备大数据分析工具,支持APP分析数据网站分析及用户画像,独创了6大转化率分析模型,的英文用户行为分析领域首家应用定量分析与定性分析方法的数据分析产品,运用数极客用户行为录屏系统,可以分析并优化用户体验的细节,基于用户行为分析系统- ,了提供会员营销系统- A / B测试工具两大数据智能应用解决方案,企业使得可以快速的实现数据驱动增长。
欢迎关注数极客微信公众号:shujujike,更全面的获取无埋点及用户行为大数据分析的要点。
原创作者:杨永强数极客技术合伙人

概述
无埋点也叫全埋点、自动埋点,无埋点就是指不需要开发人员添加任何代码,就可以实现数据的采集。
换句话说也就是在我们需要采集数据的位置插入采集数据的代码,而这个插入采集代码的过程不需要我们手动去添加,而是自动实现插入,这就是无埋点。
用户行为数据,就是用户在操作app的过程中产生的行为,比如 打开页面 / 关闭页面 / 浏览页面 / 点击按钮 /退出后台 / 返回前台 等事件,这些行为事件连起来就能组成一个用户的行为事件链条,这个链条可以理解为这个用户的行为数据。

目录
一 、技术方案对比
1.1 几种无埋点实现方案介绍
1.2 处理时机对比
1.3 优缺点对比
二、实现ASM方案的准备知识
2.1 什么是AOP
2.2 gradle plugin的实现
2.3 Android app的编译过程
2.4 ASM介绍
三、 ASM方案实现方法
3.1实现gradle plugin
3.2通过ASM实现hook代码
3.3根据业务逻辑实现自己的SDK代码
四、总结

一 、技术方案对比
1.1 几种无埋点实现方案介绍
在做无埋点技术选型时,我们对以下几种主流Android 无埋点方案进行对比:
AspectJ 方案
Aspectj 是它有一套自己的Java编译器,当我们用这个编译器进行编译时Aspectj会根据自己的方式进行代码插入,从而实现在编译期间插入埋点代码。
可参考:
利用AspectJ实现Android端非侵入式埋点
AspectJ in Android (一),AspectJ 基础概念
AspectJ in Android (二),AspectJ 语法
AspectJ in Android (三),AspectJ 两种用法以及常见问题

AST 方案
当IDE对项目code进行编译时,最先进行的是对源代码进行编译从而生成 .java 文件。
此方案就是利用这个时机,通过自定义注解器(APT)来切入我们需要插入代码的点,再通过AST的语法来插入埋点代码。
可参考:
Android AOP 抽象语法树
基于AST的组件化自动插桩方案

Javassist 方案
在Android app编译的过程中,.class 最终会转换为 .dex 文件,gradle 在编译的过程中 允许开发人员通过gradle plugin来修改class文件。这样就可以利用 Javassist 来修改 .class 字节码文件,从而实现插入埋点代码的目的。
可参考:
Javassist 使用指南 1 
Javassist 使用指南 2

ASM  方案
ASM和 Javassist 原理基本一样,只是在操作.class 文件时用的是ASM。
本文将主要介绍此种方式。

1.2 处理时机对比

1.3 优缺点对比

AspectJ 功能非常强大,使用起来也很方便,但是其不支持三方库的修改,所以果断放弃。
AST 对于不了解语法树 /注解 这些相对晦涩的知识点的不建议使用,后期维护起来非常不便,遂放弃。
Javassist 和 ASM两者原理基本一样,只是在后期操作字节码时 ASM 比 Javassist性能更好,因为javassist用到反射,所以性能上有牺牲。ASM是非常底层的,操作起来难度大,但是性能非常优秀。作为三方SDK,对源代码的侵入程度和性能要求非常严格,所以最终选择ASM方案。

二、实现ASM方案的准备知识
2.1 什么是AOP
AOP 面向切向编程(Aspect Oriented Programming)与之对应的是OOP(ObjectOriented Programming)面向对象编程。
也可以自行Google,不再赘述。
2.2 gradle plugin的实现
Android Gradle Plugin 版本在1.5.0及以上,Google 官方提供了可以通过实现Plugin<Project> 接口,来实现编译成dex文件之前来修改.class 文件。
2.3 Android app的编译过程

2.4 ASM介绍
ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。
ASM相关可以参考:ASM 开发指导
三、 ASM方案实现方法
3.1实现gradle plugin
实现Plugin<Project>接口

继承 Transform 

对于transform API 不熟悉的可以查看API。
最核心的代码就是遍历所有的class文件

3.2通过ASM实现hook代码
在ASM的核心实现中,它主要有以下几个类、接口(在org.objectweb.asm包中)。
Cla***eader类:字节码的读取与分析引擎。它采用类似SAX的事件读取机制,每当有事件发生时,调用注册的ClassVisitor、AnnotationVisitor、FieldVisitor、MethodVisitor做相应的处理。
ClassVisitor接口:定义在读取Class字节码时会触发的事件,如类头解析完成、注解解析、字段解析、方法解析等。
AnnotationVisitor接口:定义在解析注解时会触发的事件,如解析到一个基本值类型的注解、enum值类型的注解、Array值类型的注解、注解值类型的注解等。
FieldVisitor接口:定义在解析字段时触发的事件,如解析到字段上的注解、解析到字段相关的属性等。
MethodVisitor接口:定义在解析方法时触发的事件,如方法上的注解、属性、代码等。
ClassWriter类:它实现了ClassVisitor接口,用于拼接字节码。
AnnotationWriter类:它实现了AnnotationVisitor接口,用于拼接注解相关字节码。
FieldWriter类:它实现了FieldVisitor接口,用于拼接字段相关字节码。
MethodWriter类:它实现了MethodVisitor接口,用于拼接方法相关字节码。
SignatureReader类:对类定义、字段定义、方法定义、本地变量定义的签名的解析。Signature因范型引入,用于存储范型定义时的元数据(因为这些元数据在运行时会被擦除)。
SignatureVisitor接口:定义在解析Signature时会触发的事件,如正常的Type参数、类或接口的边界等。
SignatureWriter类:它实现了SignatureVisitor接口,用于拼接范型相关字节码。
Attribute类:字节码中属性的类抽象。
ByteVector类:字节码二进制存储的容器。
Opcodes接口:字节码指令的一些常量定义。
Type类:类型相关的常量定义以及一些基于其上的操作。

参考: ASM 源码解析  ,http://www.blogjava.net/DLevin/archive/2014/06/25/414292.html

步骤
1.通过Cla***eader 读取class 文件
2.通过ClassWriter来修改class 文件,修改时需要用到ClassVisitor /MethodVisitor来访问class 内部的成员 方法,再通过相关API来插入埋点代码

3.3根据业务逻辑实现自己的SDK代码
当hook成功后,剩下的就是自己根据业务逻辑去实现相关代码,此处不赘述。
四、总结
本文是从宏观上介绍无埋点的几种技术,和ASM的实现思路,希望能对无埋点有一个全局的认识。

转载于:https://blog.51cto.com/14147925/2334949

Android无埋点的技术选型之路相关推荐

  1. 人人都会的Android无埋点数据采集技术

    前段时间刚做完公司无埋点数据采集项目,跟大家分享一下. 以下只有部分核心代码,完整源码及接入流程请移步 github:https://github.com/harvie1208/TracePoint ...

  2. 揭秘数极客Android无埋点数据采集原理

    采集数据柯林斯基本分为代码埋点状语从句:无埋点.近年来无埋点的数据采集方案越来越普及,而无埋点的实现方案也有多种,我们今天讨论的问题是数据采集的一种方案,是无需开发人员重复进行采集事件的代码埋点就能达 ...

  3. android 无埋点 简书,无埋点README

    无埋点编码规范 无埋点方案基于窗口回调(Window.Callback)机制.BaseActivity中集成了自动打点相关逻辑.但由于dialog和activity实现机制不一样.为了dialog同样 ...

  4. 代码埋点、可视化埋点、无埋点几种数据埋点方案的分析报告

    目录 数据采集的核心问题 一.埋点是什么 二.为什么要埋点 三.埋点有哪些方式 四.各埋点方式优劣对比 五.其他 在这篇文章里面,我们会对数据采集的一些基本概念进行阐述,然后,会针对目前市面上新增的一 ...

  5. 无埋点数据收集和adb monkey测试屏蔽通知栏

    简单记录百度移动统计android无埋点sdk使用和monkey测试屏蔽通知栏的问题 1.无埋点sdk使用 很简单,下载完sdk后导入到项目中 , 参考sdk文档进行就可以了,个人觉得比友盟还简单,几 ...

  6. 产品随记-无埋点数据采集

    今天收到一封售前的邮件,关于H省网运营商要做手机APP数据分析的需求.客户对要分析的数据内容没有很清楚的想法,只给了百度移动统计的页面.这个需求本身不复杂,只是涉及的厂商较多:APP由我方提供,但其中 ...

  7. 图数据库技术选型汇总

    一.图数据库发展: https://blog.csdn.net/younger_china/article/details/127176768 二.关于NebulaGraph 1.1.美团实践 美团图 ...

  8. 最近无埋点技术很是流行,抽空研究了下诸葛IO,talkingData以及百分点这些业内知名公司的无埋点SDK,抽取其中重要的信息供大家参考:

    1.首先什么是无埋点呢,其实所谓无埋点就是开发者无需再对追踪点进行埋码,而是脱离代码,只需面对应用界面圈圈点点即可追加随时生效的事件数据点. 无埋点的好处 其实无埋点并不是完全不用写代码,而是尽可能的 ...

  9. SDK无埋点技术在百分点的探索和实践

    2016-10-11 唐星 移动开发前线 移动开发前线 移动开发前线 微信号 bornmobile 功能介绍 专注于分享移动开发前沿和一线技术. 本文为『移动前线』群在9月21日的分享总结整理而成,转 ...

最新文章

  1. Docker 修改运行中的容器端口映射
  2. cacti监控添加thold插件
  3. 用AI击破传统行业痛点 “百度大脑行业创新论坛”将提7大行业解决方案
  4. 【SHARE】WEB前端学习资料
  5. 协作机器人 ai算法_如果我们希望人工智能为我们服务而不是不利于我们,我们需要协作设计...
  6. c语言存储结构的实现,(C语言)栈的链式存储结构的实现
  7. linux系统无法识别固态硬盘_linux查看硬盘是不是ssd
  8. R语言数组array函数
  9. STL数组处理常用函数
  10. 向上取整和向下取整(ceil、round)
  11. 将数据加载到datagridview_JVM系列(一)-- Java类的加载机制
  12. mysql数字有效位_SQL Server实现数字转字符保留几位有效位数
  13. XenServer学习笔记1虚拟磁盘和虚拟内存
  14. java游戏代码大全_求一个简单的Java小游戏的代码
  15. 迭代法 matlab程序,简单迭代法求方程根的MATLAB程序
  16. Ros平台下:从零开始学习SLAM(序)
  17. android输入框边框距离,如何更改Android对话框边距(到屏幕边缘的距离)?
  18. 视频教程-思科CCNP路由实验专题--EIGRP篇【适用于思科CCNA、CCNP】-网络技术
  19. 北京消费者买15类节能商品可获补贴 单件最高800元
  20. ubuntu server 20.04 配置无线wifi网络并设置固定ip公司连接家里的linux服务器配置

热门文章

  1. 计算机专业看重CPU还是显卡,电脑是CPU重要还是显卡重要? 你选择对了吗?
  2. android:inputType
  3. 6大差异盘点:公募基金券商交易模式和直接进场交易模式
  4. 【Java开发】设计模式 03:建造者模式
  5. 深入理解js中的yield
  6. 知乎问答口碑推广维护如何做更有效
  7. mysql5.0操作手册_MySQL手册版本5.0.20-MySQL同步(二)_MySQL
  8. 毛毛虫招聘助手 最新破解版本 简约好用全自动发帖工具
  9. 天冷保暖妙招,怎么样穿的少也暖和
  10. CAD三维画图面域命令