又一个问题,代码中的writeLog方法到底要记录哪些数据作为log信息呢?log信息中最重要的是能让开发者看出来哪个界面被打开或者哪个控件被点 击。对于界面,可以记录其类名;对于控件,一般没有确定的名称,那么可以记录下来这个控件在界面中的路径。比如上文中介绍Android UI布局的实例,如果要定位记录那个Button,则可以记录它所在界面的类名和Button的布局路径作为它的标识。那个Button的路径可以表示为DecorView>LinearLayout[0]>FrameLayout[1]>RelativeLayout[0]>Button[0],由于LinearLayout有多个子View,因此可以在子View中加入编号来区分。这样就解决了log信息的记录问题,log信息的格式大致要有如下几个字段:

monitor_type | ui_name | view_ui_path

比如是控件点击埋点log,则可以记录为

VIEW_CLICK | MainActivity | DecorView>LinearLayout[0]>FrameLayout[1]>RelativeLayout[0]>Button[0]

比如是MainActivity界面打开的埋点log,则可以记录为

ACTIVITY_START | MainActivity | NULL

这样我们分析这些日志信息,就可以统计出一个应用中各个页面被打开过多少次,某个界面的控件被点击过多少次。

对于自动化埋点的第三个功能,实现埋点的定制,这个比较好实现。如果我们需要对那些界面或者控件进行埋点,我们可以定制一个埋点列表。这个列表在应用启动 的时候被下载到用户的手机上,然后AutoMonitorReceiver需要多做一点事,就是将广播发送过来的埋点信息与埋点列表进行比对,看是不是需 要埋的点,如果是,就将其记录;如果不是,就不做处理。假设我们用json存储这个埋点列表,大致的结构如下:

{
    "version": "app_1.1.1",
    "view_id":"MainActivity": {
        "DecorView>LinearLayout[0]>FrameLayout[1]>RelativeLayout[0]>Button[0]":"button_0"
        "DecorView>LinearLayout[0]>FrameLayout[1]>RelativeLayout[0]>Button[1]":"button_1"
    }}

当然这个埋点列表如何生成,这个需要开发者自己写代码去处理。

自动化埋点存在的问题和难点

poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。

本文提供的自动化埋点的思路是,通过拦截屏幕点击事件来搜索被点击的控件,然后将其界面类名和控件的UI路径记录下来作为log信息。将控件的UI路径和所在的界面类名作为一个控件的标识,有时候会出现一些问题,比如:

1.Android版本不同会造成控件的UI路径不同。比如Android2.2与Android4.1版本下,获取到上文中Button的UI路径分别为

//android2.2DecorView>FrameLayout[1]>RelativeLayout[0]>Button[0]//android4.1DecorView>LinearLayout[0]>FrameLayout[1]>RelativeLayout[0]>Button[0]

这个问题可以通过将控件的UI路径缩短来解决,比如就只用FrameLayout[1]>RelativeLayout[0]>Button[0]路径来标识Button控件。

2.对一些隐藏控件、弹出窗口或者浮动窗口不好处理。比如,在上文中的Button同样位置存在另外一个Button,不过是隐藏的,有时出现,有时不出现。当一个Button被点击,单纯依靠DecorView>FrameLayout[1]>RelativeLayout[0]>Button[0]路 径不能判断出是哪个Button被点击。解决这个问题,有时做一些特殊处理可以解决,比如扩展log的字段,多加入一些控件的信息,比如Button上的 文字等。但是有时,开发应用的控件布局千变万化,一些控件确实不能通过UI路径进行唯一标识,这种就没法自动化埋点了。只能通过手动埋点来来补充了。

3.文中提到为了实现埋点的定制,需要开发者自己写代码生成一个埋点列表,这个也是比较麻烦的。要遍历一个应用中所有界面和界面中控件的UI路径,这个比 较容易,但是取出自己想要埋点的控件UI路径,这个可能需要人工去查看比对。另外,一些大型应用开发的时候,界面随时发生着变化,一些控件的布局在随时发 生变化。每次发布应用的时候,都需要扫描一下应用控件信息,以及重新找一下埋点控件的UI路径,这个是相当麻烦的。如何实现这部分的自动化,也是一个难 题。

参考文章

InfoQ: Android事件传递机制

老李分享:Android -自动化埋点 3的更多相关文章

  1. 老李分享:Android -自动化埋点 1

    老李分享:Android -自动化埋点   当我们开发一款Android应用上线后,希望能收集一些用户操作的行为数据,比如用户在某个页面点击了多少次,在某个控件被点击了多少次,在某个页面停 留了多少时 ...

  2. 老李分享:Android -自动化埋点 2

    除了上述的事件,Android提供了一个OnTouchListener的监听器,当事件传递到控件的时候,如果控件注册了这个监听器,则会执行监听器中的onTouch方法.同时,如果它返回true,则事件 ...

  3. 老李分享:android app自动化测试工具合集

    老李分享:android app自动化测试工具合集   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...

  4. 老李分享:Android性能优化之内存泄漏1

    老李分享:Android性能优化之内存泄漏   前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我 ...

  5. 老李分享:接电话扩展之uiautomator 1

    老李分享:接电话扩展之uiautomator   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq ...

  6. MTFlexbox自动化埋点探索

    1. 背景 跨平台动态化技术是目前移动互联网领域的重点关注方向,它既能节约人力,又能实现业务快速上线的需求.经过十年的发展,美团App已经变成了一个承载众多业务的超级平台,众多的业务方对业务形态的快速 ...

  7. 老李分享:接口测试之jmeter

    老李分享:接口测试之jmeter   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.移动端自动化测试很多人把他仅仅理解成appu ...

  8. POPTEST老李分享修改dns ip的vbs代码

    POPTEST老李分享修改dns ip的vbs代码   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...

  9. 老李分享:robotium3.6与4.0 later 的区别 1

    老李分享:robotium3.6与4.0 later 的区别   因为下载的直接是最新版本的robotium4.1版,这次碰到gridView问题时,发现网上有getCurrentListViews( ...

随机推荐

  1. selenium框架与chrome浏览器的不兼容问题

    在一次偶然的情况下,在chrome上用selenium框架去抓取某个id为XX的页面元素,使用WebDriver的findElement().click()方法进行点击,原来在firefox浏览器运行 ...

  2. C/C++面试之算法系列--去除数组中的重复数字

    去除数组中的重复数字 Sailor_forever  sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/2008/ ...

  3. 初学jQuery之jQuery事件与动画

    今天我们就谈谈jquery中的事件和简单动画吧,它们毕竟基础是进阶华丽的根本!! 1.事件 1.window事件 ready   准备就绪 2.鼠标事件 方法                      ...

  4. Java Web(五) JSP详解(四大作用域九大内置对象等)

    前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...

  5. OpenCv 2.4.9 (二) 核心函数

    前言 经过前面一节的怎样读取图片,我们可以做一些有趣的图像变换,下面我们首先介绍使用遍历的方法实现,然后我们使用内置的函数实现. 矩阵掩码实现 矩阵掩码,和卷积神经网络中的卷积类似.一个例子如下: 现 ...

  6. 购物篮模型&Apriori算法

    一.频繁项集 若I是一个项集,I的支持度指包含I的购物篮数目,若I的支持度>=S,则称I是频繁项集.其中,S是支持度阈值. 1.应用 "尿布和啤酒" 关联概念:寻找多篇文章中 ...

  7. 启程、对C的继承

    Cocoa和Object-c是苹果公司OS X和IOS操作系统的核心.   .m扩展名表示文件使用的是Objective-c代码.   与C语言一样,Objective-c使用头文件来包含结构体.符号 ...

  8. Centos7 安装 zabbix3.2

    简介: Zabbix的一个很优秀的分布式监控服务器, 它有两部分组成: 1. “zabbix-server”用来收集并且在web端展示数据 2. “zabbix-agent”用来采集数据,发送给ser ...

  9. 未来工厂——电器行业ERP案例

    江苏科兴电器有限公司位于全国著名的“银杏之乡”泰兴市南首,主要生产35kV及以下电流.电压互感器等系列产品.产品多次经国家及省市技术监督部门抽检合格,广泛应用于国家重点工程.“COSINE”商标荣获泰 ...

  10. jquery ajax标准写法

    $.ajax({ url:url,                      //地址 type:'post', //请求方式 还可以是get type不可写成Type 不让会导致数据发送不过去,使用 ...