Android开发全埋点技术 Jesseliu

从去年和朋友一起做小程序开始,我开始对于产品的运营有了一个新的认知,今年又买了一本《数据化运营:系统方法与实践案例》让我的思维开始从原来的技术型和交互设计型开始慢慢接触数据运营的概念。关于整体的方案还正在写,这个是其中关于统计数据收集关于埋点技术的一部分。

由于我自身只接触过iOS的Swift开发,但对于Android开发不太了解,而市场上关于埋点开发的书籍只找到了一本神策数据出的《Android全埋点解决方案》一书,而且是今年刚刚出版的,只好买了这本书去请教了Android开发同事,大致对于埋点开发的原理做了基础的调研,也让自己对于实现有了一点了解。

下文内容即来自于对书中内容的总结和从开发人员了解到的解释,对于代码实现部分不涉及而且我也只能以其他语言的基础去理解Android,难免会露怯。

首先先解释一下View

这是我的小程序的其中一个界面

图片发自简书App

这个页面的所有内容都是由控件组成的,所有可点击的控件都对应一个事件处理代码,埋点统计即是对所有这些事件的监控。


Android的四种事件

----

$AppStart事件:应用程序启动,同时包括冷热启动

$AppEnd事件:应用程序退出,包括正常退出、进入后台、被强杀、崩溃

$AppViewScreen事件:页面浏览,对于Android应用程序来说,就是指切换Activity或Fragment

$AppClick事件:控件的点击,即View被点击,包括Button、ListView等

这四个事件中,前三个比较简单,而围绕AppClick事件,全埋点即对AppClick事件进行拦截或者插入相关埋点代码,按照拦截或者插入的时间的不同,分为两种方式,每种方式有四个方案,也即是有八种不同的埋点方案AspectJ\ASM\Javassist\AST\View.OnClickListener代理\Window.Callback代理\View.AccessibilityDelegate代理\透明层。

静态代理AspectJ\ASM\Javassist\AST

------------

Android的开发周期

1、编写代码

2、编译代码得到Package

3、安装App

4、运行App

其中编译代码期间的流程是javaCode->.java->.class->.dex,AspectJ\ASM\Javassist\AST即是对这个编译过程不同阶段的处理,大致的处理方式就是开发者只需要对于代码块进行简单的注解或者说由SDK遍历去自动添加注解,然后在编译过程中通过插件的形式对于开发者代码进行改写加入自己的统计代码,这样不会对源码产生污染,又可以获得比动态代理更好的性能。

动态代理

------------

动态代理即是在App运行过程中对于系统的方法进行代理,比如App中的控件点击都会调用View.OnClickListener,动态代理就相当于接管了这个系统方法,然后在其中加入自己的统计代码,每一次控件点击调用View.OnClickListene的同时也会运行统计代码来上传用户行为数据。

AppStart和AppEnd事件的判定

----------------

首先注册一个Appication.ActivityLifecycleCallbacks回调用来监听Activity的生命周期,页面退出时启动一个倒计时,如果没有新页面进来则触发AppEnd事件,当页面启动时,判断与上个页面的退出事件间隔是否超过倒计时定义的时间,如果没超过则触发AppViewScreen事件,如果超过,首先判断之前是否触发了AppEnd事件,如果没有则先触发AppEnd事件,然后再触发AppStart和AppViewScreen事件

AppViewScreen事件的判定

-------------

通过Application的内部接口ActivityLifeycleCallbacks提供的一些回调方法。

AppClick事件的判定

--------------

在这里只列出一种动态代理方法View.OnClickListener,其他的还是各自买书看吧。

在应用程序自定义的Application对象的OnCreate()方法中初始化埋点SDK,并传入当前Application对象,在拿到Application对象后,通过registerActivityLifecycleCallback方法来注册Appication.ActivityLifecycleCallbacks回调,在Appication.ActivityLifecycleCallbacks的onActivityResumed回调方法中,拿到当前正在显示的Activity实例,通过activity.findViewById(android.R.id.content)方法就可以拿到整个内容区域对应的View,然后再逐层遍历这个RootView,并判断当前View是否设置了mOnClickListener对象,如果已设置mOnClickListener对象并且mOnClickListener又不是我们自定义的WrapperOnClickListener类型,则通过WrapperOnClickListener代理当前View设置的mOnClickListener,WrapperOnClickListener是统计SDK自定义的一个类,它实现了View.OnClickListener接口,在WrapperOnClickListener的onClick方法里会先调用View的原有mOnClickListener处理逻辑,然后再调用埋点代码,既可以实现自动埋点的效果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容