• MonkeyRunner的使用<二>


    MonkeyRunner可以用来做自动化测试,在Android中做动态分析的时候也可以使用它来做行为触发。

    不过感觉使用MonkeyRunner来做行为触发还是很局限的。就比如我想实现外界向模拟器拨打电话,或者是发送短信就很难。

    如果有好的方法,希望您能告诉我。


    在Android的管网上介绍了可以使用MonkeyRunner来启动APK ,但是前提是必须是你要知道要启动的APK的包名和Activity名。

    想要启动任何未知的Activity怎么办呢。就比如说,你要在模拟器上安装一个你不知到的APK ,怎么来启动它。

    这里用到了Apktool.

    1.使用Apktool来反编译我们的目标文件

    将APK反编译之后,可以在得到的文件夹下找到AndroidManifest.xml文件

    这个时候使用Python来提取出包名和类名,保存在两个文件夹里面。

    为什么要怎么做,因为启动MonkeyRunner 的命令是MonkeyRunner -v ALL xxxx.py

    我们要想办法传入未知的包名和Activity怎么做,只有通过使用文件的读写操作来达到互动。

    2.获取任意程序的包名和Activity的名字。

    #
    # @author  : grace
    # @date    : 2013-5-26
    # filename : parseManifest.py
    # run      : python parseManifest.py
    
    import os
    import sys
    from xml.dom import minidom
    
    if __name__ == "__main__":
        
       opts, args = getopt.getopt(sys.argv[1:], "d:h", "directory = help")
       
       for op, value in opts:
           if op in ("-d","--directory"):
              _directory = value
    
    xmldoc =minidom.parse(_directory + '/AndroidManifest.xml')
    
    manifest = xmldoc.getElementsByTagName('manifest')[0]
    
    package = manifest.getAttribute('package')
    
    getActivity = xmldoc.getElementsByTagName('activity')[0]
    
    activity = getActivity.getAttribute('android:name')
    
    output = open(_directory + 'package.txt','w')
    output.write(package)
    output.close()
    
    output = open(_directory + 'activity.txt','w')
    output.write(activity)
    output.close()

    上面这个程序的代码是用来解析AndroidManifest.xml的,通过这个程序来获得包名和Activity 的名字,将他们分别存储在package.txt  和activity.txt 文件中

    这里我们只保存了一个 ,因为只下需要一个Activity就可以启动我们的APK。


    3.接下来就是通过MonkeyRunner 来做行为触发

    #
    # @author   : grace
    # @date     : 2013-5-25
    # filename  : behaviorTrigger.py
    # run       : monkeyrunner -v ALL behaviorTrigger.py
    #
    
    from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
    
    package = ''
    
    activity = ''
    
    fp = open("package.txt")
    package = fp.readline()
    fp.close()
    
    fa = open("activity.txt")
    activity=fa.readline()
    fa.close()
    
    device =MonkeyRunner.waitForConnection()
    
    MonkeyRunner.sleep(1)
    
    runComponent = package + '/' + activity
    
    action = 'android.intent.action.MAIN'
    
    device.startActivity(action = action, component = runComponent)
    
    MonkeyRunner.sleep(2)
    
    res=device.takeSnapshot()
    
    res.writeToFile(  '/shot1.png','png')
    
    device.touch(160,194,MonkeyDevice.DOWN_AND_UP)
    
    res=device.takeSnapshot()
    
    res.writeToFile( '/shot2.png','png')
    
    device.touch(160,374,MonkeyDevice.DOWN_AND_UP)
    
    device.touch(160,194,MonkeyDevice.DOWN_AND_UP)
    
    res=device.takeSnapshot()
    
    res.writeToFile('/shot3.png','png')
    
    device.touch(60,200,MonkeyDevice.DOWN_AND_UP)
    
    MonkeyRunner.sleep(1)
    
    device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)
    


    注意文件存放的位置应该是你用apktool 反编译之后的文件夹下面

    apktool d XXXX.APK  文件夹名称


  • 相关阅读:
    TMainMenu 类[三] 手动建立菜单(5) : 给菜单项添加事件
    TMainMenu 类[二] 成员列表
    TMainMenu 类[三] 手动建立菜单(4) : 添加分割线与隐藏多余的分割线
    初学 Delphi 嵌入汇编[30] 寄存器表
    TMainMenu 类[三] 手动建立菜单(6) : 更换菜单
    TMainMenu 类[三] 手动建立菜单(7) : 指定快捷键
    关于网络编程(服务端)的一些笔记 roen的专栏 博客频道 CSDN.NET
    关于 多进程epoll 与 “惊群”问题
    乱谈服务器编程 MrDB 博客园
    再谈select, iocp, epoll,kqueue及各种I/O复用机制 Shallway 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3112978.html
Copyright © 2020-2023  润新知