51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4580|回复: 0
打印 上一主题 下一主题

【转】解析百度Cafe原理-Android自动化测试学习历程?

[复制链接]
  • TA的每日心情
    无聊
    2 小时前
  • 签到天数: 1043 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2016-8-3 12:01:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    作者:曹丹凤
    来源:知乎

    一、Cafe原理
    Cafe是一款自动化测试框架,解决问题:跨进程测试、快速深度测试
    官网:Cafe
    Cafe provides the following benefits:* You can develop test cases across processes by operating them via Cafe.
    * You can get & set system state without changed tested application, such as open or close wifi.  ——利用android4.2的一个系统漏洞,4.2以上的版本补上了这个漏洞,该项功能应该就失效了
    * You can get & set fields of tested objects even invoke functions by calling api.
    * The framework can handle system running log for some non-ui check point.
    * You can do application UI depth-first travel automated by invoking only one api.
    * You can record hand-operations to cafe code and replay it even at another phone or others version android.
    二、核心技术
    1、跨进程——AIDL分析
    AIDL(Android Interface Definition Language——安卓接口定义语言)
    AIDL与其他的接口定义语言类似,它允许你定义编程接口,使用进程间通信(Interprocess Communication,简称IPC)来使得client和server之间能够通信。安卓系统中的进程之间不能共享内存,因此需要定义一些机制在不同进程间进行数据通信。
    建立AIDL服务的步骤(摘自百度,还得自己试一下,内容不理解)——————aidl_百度百科

    建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:
    (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。
    (2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。
    (3)建立一个服务类(Service的子类)。
    (4)实现由aidl文件生成的Java接口。
    (5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。

    2、利用漏洞提升权限

    System权限的应用场景:
    -设置系统时间、系统属性
    -重启adb、重启手机

    利用安卓签名检查漏洞(ZipFile.java)
    首先说明一下什么是安卓签名检查漏洞?(具体见:android签名漏洞#8219321绕过签名检测
    其实就是zip压缩包(apk本来就是zip压缩包)允许统一路径下存在多个同名文件的特性导致的,然后程序检查签名呢,是会检查最后一个,但是解压程序,安卓系统加载文件的时候又是走的前面的那个(只要保证新文件在原来文件的文件流靠前的位置即可),危害很大,所以安卓4.2之后的系统就修复了这个漏洞

    -在没有platform签名的情况下修改Settings.apk的代码逻辑
    -普适性:安卓1.6-4.2都存在这个漏洞,可用作测试提权
    -zip允许同名文件存在,第一个是修改的class.dex,第二个是原来的class.dex
    -利用安装签名校验时,同名文件只会校验最后面那个

    其他技术:架构用法
    -可以不启动instrument,通过intent即可调用cafe.apk中的接口
    例子不懂,等自己试了回来补充

    -get和set方法:获取系统属性,用到了java的反射机制(不懂,查!!!)
    -遍历优化算法:local.traveler()

    三、demo演示
    这个要自己去跑,注意的就是:签名要一致,否则就无法用,这个跟Robotium一致,就是说你所要测试的程序和testapk的签名得一致,然后这个testapk才能在所测试的程序上跑

    四、源码分析
    1、com.baidu.cafe.remote——IRemoteArms.aidl(所有的跟安卓操作相关的都定义了获取操作)
    2、com.baidu.cafe.local.traveler——AppTraveler.java(改进了monkey的遍历算法,避免了monkey里面的死循环)
    3、录制器(可以自己试一下,用自家程序试试,哈哈!!)
    -基于hook的录制原理(windows上面有hook啊,而且现在很多程序会利用hook来写驱动啥的,导致根本卸载不了)
    -UI遍历测试
    4、com.baidu.cafe.local——LocalLib.java(searchTextFromParent,找到父控件,然后就能找到所嵌套的子控件,用的反射的原理:具体程序是com.baidu.cafe.remote里的ReflectHelper.java)
    注:动态生成的视图也是可以getview的
    5、生成报告(android-junit-report-x.x.x.jar)——这个我可以用在我的Robotium的程序里,生成report啊
    6、因为对Robotium做了封装,可以直接在里面用Robotium的东西,solo啊solo啊

    五、cafe的优点和缺点

    优点:
    失败时自动截图
    测试用例截取logcat日志
    自动生成Junit Report Xml
    获取应用当前的帧率(比如“英雄联盟”的程序,在同等情况下,帧率越高程序性能越好,类似程序或者视频的这种需要用到)
    获取当前的tcp发送和接收流量(新闻、视频啊之类的,尤其是在使用了3G流量的情况下)
    使用root权限执行shell(在已root的系统上?root之后就可以提权)

    缺点:
    安卓4.2以上系统反签名有问题(最新版本也没有修复?)
    脚本编写人会junit+java(java在学,junit其实用到了一点,系统的知识还是需要查一下)
    不去封装稳定版本的uiautomator(所以还是需要看一下uiautomator的框架,熟悉和理解Uiautomator和Robotium的框架)

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-11 11:14 , Processed in 0.072968 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表