一、背景
运营者能够对用户行为进行分析的前提,是对大量数据的掌握。在以往,这个数据通常是由开发者在控件点击、页面等事件中,一行行地编写埋点代码来完成数据收集的。然而传统的操作模式每当升级改版时,开发和测试人员就需要重复不断对代码进行更新,整个流程耗时长,无法满足业务的需求。
为帮助开发者解决这一痛点,个推应用统计“个数”推出“可视化埋点”这一技术来更高效地实现这个这一过程。“个数”的可视化埋点灵活、方便,开发者不需对数据追踪点添加任何代码,只需要连接管理台并圈选页面中需要埋点的元素,即可添加随时生效的界面追踪点。
本文将结合个数实践经验,对可视化埋点中的两大关键技术点即控件唯一标识和事件采集进行分析并提供解决方案。
二、可视化埋点关键技术点
可视化埋点的难点,或者说核心就是如何在开发者不编写任何代码的情况下,SDK 如何确定任意一个控件在该应用内的唯一性,以及如何监听控件的点击和页面的切换。
标识
为了防止不同页面中的控件标识重复出现,控件的唯一标识一般由页面标识加上控件标识生成。
页面标识生成
页面标识可以直接使用页面的名称,即 Activity name。其获取方式比较多,这里介绍一种比较通用的方法,即通过注册 Application.ActivityLifecycleCallbacks ,开发者可以在以下生命周期的回调中,轻松地拿到当前的 Activity 对象。此方法适用于一个 Activity 并无 Fragment 存在的情形。
代码详见下图:
获取方式也是比较多,不过较于 Activity 的获取会相对麻烦一些,因为系统没有直接提供 API ,因而需要稍微转个弯:通过 Gradle 插桩的方式,获取 Fragment 的生命周期,以及 Fragment 实例对象:
如果该应用的页面存在一个 Activity 中嵌套多个 Fragment 的情况,单单一个 Activity name则可能无法精准地定位到某个页面,因而还需要加上 Fragment 的名称。Fragment的获取可以通过 Gradle 插桩法来实现,即根据 Fragment 的生命周期来获取Fragment 实例对象。
1.2控件标识生成
理想的情况下页面中的每个控件都有属于自己的唯一 id,SDK 直接获取控件的 id 当做控件标识即可。但现实情况却是,一个页面中往往存在多个相同 id 的控件,或者是没有 id 的控件,比如 Listview 的 item ,开发者不可能给listview的每个item 设置不同的 id。
因此需要转变一下思路。我们可以从控件路径这个除id 外比较独特的性质着手来生成控件标识。开发者可以通过给控件的路径加上控件角标的结构方式,生成控件的唯一标识。下图是Github 上一个仿 B 站的应用。我们对这个应用进行一下控件树分析。首先我们使用 Android Studio 自带的 UI Automator Viewer 工具查看该页面的布局结构:
接下来,我们可以从Application.ActivityLifecycleCallbacks 的回调中拿到 Activity 实例,再使用 activity.getWindow().getDecorView().getRootView() 方法来获取当前页面的控件树。
例如图中的文字控件是 TextView,且无兄弟布局,则可以标记为 TextView[0] 。它的父布局是 LinearLayout 且排在兄弟布局中的第二位,那么就可以写成是 LinearLayout[1],然后使用自己定义的符号拼接,像是 LinearLayout[1]/TextView[0] 。之后以此类推、循环遍历、层层递进,将所有经过的控件以及它们的下标都拼接起来,组成控件在该页面中的唯一标识。
对于一些可复用的 View ,我们则需要采取一些特殊处理。例如对于 RecyclerView、ListView、 ViewPager 等复用控件,我们都需要采取不同的处理方式,去获取当前 View 在该控件中的具体下标。如果没有进行特殊处理,则会导致子控件错位,数据统计不准确。
采集
在以往的处理中,如果需要知道一个按钮的点击次数,开发者就要在该控件的click事件中加入对应的打点代码。这种重复劳作,无疑增加了开发者的开发负担。对此,我们可以采用动态代理方式或Gradle 插桩方式来改善这个问题。
动态代理方式
使用安卓自带的辅助功能 View.AccessibilityDelegate 。前文提到当页面变化时,我们可以通过 Application.ActivityLifecycleCallbacks 获取到 Activity 的实例对象,接着根据activity.getWindow().getDecorView().getRootView() 来获取到控件树。由于控件树可能会实时发生变化,我们则需要通过 ViewTreeObserver.OnGlobalLayoutListener 的方法监听视图变化,从而在该回调中拿到变化的控件。接着我们 要根据递归判断该控件是否为 ViewGroup、是否可以点击、是否能够显示等,继而给符合条件的 View 设置 sendAccessibilityEvent();此外,我们还要在继承了 View.AccessibilityDelegate 的定义类中,对以下这些方法添加 SDK 的代理:
当对应的控件被点击时,系统就会自动调用设置过代理的方法,存储或者上报对应数据。
Gradle 插桩的方式
Android Gradle 工具在1.5.0 版本后提供了 Transfrom API , 该API 允许第三方 Plugin 在打包 dex 文件之前的编译过程中操作 .class 文件。在编译期,开发者可以通过onClick、onItemClick等方法(详见下图)进行监听,这相当于是正则匹配。
当上述监听的方法被编译的时候,就可以将埋点的代理操作插入这些方法中,实现自动化埋点的流程。网上相关流程也是非常详细,有兴趣的可以自行搜索学习。
三、结语
以上就是APP端可视化埋点实现过程中的关键点,特别需要注意的是控件唯一标识那一块,由于布局千变万化,开发者针对很多特定的布局都需要采取对应的处理方式。
据目前应用统计——个数这个产品只需要一行初始化代码就可以自动帮助开发者采集包括页面统计、事件埋点、新增活跃等多维度信息。
最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
上述【高清技术脑图】以及【配套的架构技术PDF】可以 加我WX:X1524478394 免费获取
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
相关推荐
小程序商城系统源码,基于.Net 5.0、Uni-App开发,支持可视化布局,前后端分离,支持分布式部署,跨平台运行,拥有分销、代理、团购、拼团、秒杀、直播、优惠券、自定义表单等众多营销功能,拥有完整SKU、下单、售后...
一款移动开发app
Android Studio实现安卓APP大作业百宝箱app源代码移动终端开发大作业。Android Studio实现安卓APP大作业百宝箱app源代码移动终端开发大作业。Android Studio实现安卓APP大作业百宝箱app源代码移动终端开发大作业。...
Delphi XE8 iOS与Android移动应用开发(APP开发)[完整中文版],这是一本不可多得的介绍使用delphi xe8开发iOS与Android移动应用的电子书,实用的技术开发教程与技术开发手册。 Delphi XE8跨平台开发让你使用一套...
IoT Studio App界面开发可视化移动应用流程,嵌入式硬件联网。
1,移动界面可视化编辑; 2,UI,UE无缝结合 3,Servlet引擎管理工具 4,接口产品管控 等等
ePage是新一代的可视化11的所见即所得,目前主流的开发平台eclipse,vs,dreamweaver等都无法做到这一点。对代码和页面的树状统筹管理,可是轻松的实现2000+页面的超大型项目设计开发和维护。“事务集”概念的提出,在...
uni-lowcode低代码开发平台是一款基于uni-app框架和uview组件库开发的app可视化拖拽编辑器,适用于企业、个人等基于uni-app技术栈开发的项目。适合各种小程序平台的开发人员、产品经理、UI等等。采用MIT开源协议,...
基于浏览器的集成开发环境,可视化和智能化的设计,能轻松完成身微信小程序和面向手机的移动应用开发;高效、稳定和可扩展的特点,使微信小程序的开发更快捷和简单。 HTML我帮您打造微信小程序web可视化开发者工具为...
使用PyQt5和matplotlib开发的简单可视化软件。该软件为初级版本,BUG较多,操作错误会导致闪退。
在你开始app开发之前,一步一步教你各类移动app开发技术基础环境搭建
《App Inventor移动终端应用开发》课程标准.pdf《App Inventor移动终端应用开发》课程标准.pdf《App Inventor移动终端应用开发》课程标准.pdf《App Inventor移动终端应用开发》课程标准.pdf《App Inventor移动终端...
支持Django App插件方式应用, 支持数据分析Jupyter方式应用内存加速技术, 让你的数据快人一步, 大幅减少数据库压力,所见即所得的拖拽开发模式, 无需在画布上设计,支持websocket, 数据填报设计,前端埋点,支持仪表...
基于体验设计的健身类APP信息可视化设计研究.pdf
广州众图计算机科技有限公司,专业的移动互联网定制开发商。JAVA .net.android IOS开发。公司成功案例多,服务过国企、政府单位,事业单位,上市公司,中小型企业。欢迎广大客户联系洽谈合作。
移动互联网app开发公司官网模板下载_移动 互联网 app 技术开发 app ios 安卓 wap 响应式 手机 应用 boot移动互联网app开发公司官网模板下载_移动 互联网 app 技术开发 app ios 安卓 wap 响应式 手机 应用 boot ...
备忘录app(免积分下载) 2022年软件工程专业上学期的一个安卓的课设。 开发工具:androidStudio 开发语言:Java 详细情况请看我的文章介绍: http://t.csdn.cn/4Lb3D
基于移动端App的健康数据信息可视化应用研究.pdf
IT科技公司移动app开发官网模板_科技 IT科技 大图 公司 企业 移动开发 软件 技术开发 app 应用 bootstrapIT科技公司移动app开发官网模板_科技 IT科技 大图 公司 企业 移动开发 软件 技术开发 app 应用 bootstrap