monkey

1. adb shell monkey -p com.v1.pakage --throttle 360 --ignore-crashes --monitor-native-crashes --ignore-security-exceptions --ignore-timeouts --ignore-native-crashes --pct-syskeys 0 --pct-nav 0 --pct-majornav 20 --pct-touch 60 --pct-appswitch 20 -v -v -v 25000 >d:\liulian_MonkeyLog.txt

adb shell bugreport >d:\Bugreport_liulian.txt

2. app包名查看:

a.手机安装包名查看器'

b.aapt命令aapt dump badging *.apk

c、源码下的AndroidManifest.xml文件查看

d.adb logcat抓取当前Android机运行的app的包名(  I/ActivityManager(数字): Displayed 包名/类

名: +ms )

命令行输入 adb logcat >e:\bag.txt

手机操控app,ctrl+c停止

去e:\bag.txt这个文件下搜索关键字如Displayed ,一般都能找到


这两天在读Android Monkey的源代码.代码不多,放出分享.

我现说一下,Monkey是干什么的:简单的说就是,模拟用户的touch screen和keyboard的输入.其实这个功能就已经很恐怖了.  Google自己说的下面:

// Only bind this to local host.  This means that you can only

// talk to the monkey locally, or though adb port forwarding.

就是觊觎这个强大的力量.Monkey是用JAVA写成的,但是我们确可以这样运行:

$adb shell monkey ......

这是为什么呢?是因为在/system/bin目录下有一个monkey的shell脚本.内容如下:

# Script to start "monkey" on the device, which has a very rudimentary

# shell.

#

base=/system

export CLASSPATH=$base/framework/monkey.jar

exec app_process $base/bin com.android.commands.monkey.Monkey $*

exec 会运行起/system/framework/monkey.jar这只Java程序.后面我们还会用到这个脚本.

先给出Monkey的架构图:

又是我的手绘图.哈哈.实际上,并不复杂.

Monkey.java 里面有main()函数.而main()->Run().Run()里面作了下面的操作:

1.processOptions()初始化参数(通过传入入参来初始化参数).还有一些的操作函数如:nextOption() nextOptionLong()。。

2.做接口的检查,也就是申请这些接口资源.

3.关键的一步:

if(mServerPort!=1)

{ try{

mEventSource = new MonkeySourceNetWork(mServerPort);

...省略

开始ServerSocket.监听用户输入的command.

4.mNetworkMonitor.Start();开始监控网络状态

5.关键的一步:

runMonkeyCycles(),代码如下:

while()

{

MonkeyEvent ev = mEventSource.getNextEvent();

ev.inject(....);

...省略

开始Event loop,把每个CommandQueue中的消息都执行.

6.mNetworkMonitor.Stop()

这里我们看到使用了SocketServer,所以理论上来说,可以在PC端发送command给device,但是必须透过USB的连接.这点我在上面已经说的很清楚了.(PC端,Android不可能帮你实现,我们只要在PC端使用Socket向device发送命令就可以了).

好了,我们接着往下分析:

MonkeyEvent的实现是典型的OO思想.

MonkeyEvent.java仅仅是一个abstract class.

最重要的方法都由子类去实现.(把Event放入当前的Activity去运行)

public abstract int injectEvent(IWindowManager iwm, IActivityManager iam, int verbose);

monkey*Event.java都是MonkeyEvent.java的子类.

来讲一下,MonkeySourceNetwork.java.

这个类相对较大,里面有许多的内嵌类.(ps. 我不是写Java出身的,看到内嵌类就不符合我的审美习惯)

1.有一个MonkeyCommand的类,这是一个interface. *Command都是他的子类.

其中定义了一个很重要的方法:这个方法将string 类型的command转换为MonkeyEvent对象,并放入

commandQueue.

MonkeyCommandReturn translateCommand(List command, CommandQueue queue);

好了,首先MonkeyCommandReturn又是一个类,是命令执行成功还是失败的一个类.

commandQueue是实际上是一个interface,然后它的实现是在CommandQueueImpl这个类中.

实现了如下的方法:

public void enqueueEvent(MonkeyEvent e) {

queuedEvents.offer(e);

}

将Event放入queueEvents队列中.而queueEvents是这样定义的:

private final Queue queuedEvents = new LinkedList();

无非就是一个LinkedList而已拉.

2.下面我在来说说MonkeySourceNetwork类中的方法:

private void translateCommand(String commandLine)

和上面的方法同名.实际上这个translateCommand是上面的封装.我们来RTFS:

List parts = commandLineSplit(commandLine);

if (parts.size() > 0) {

MonkeyCommand command = COMMAND_MAP.get(parts.get(0));

if (command != null) {

MonkeyCommandReturn ret = command.translateCommand(parts,commandQueue);

COMMAND_MAP这是个什么东西呢?

private static final Map COMMAND_MAP = new HashMap();

看了没,是一个Map.以Command string作为Key, MonkeyCommand作为Value.这样的话,就建立了,

输入的命令和Command的关系。

static {

// Add in all the commands we support

COMMAND_MAP.put("flip", new FlipCommand());

COMMAND_MAP.put("touch", new TouchCommand());

COMMAND_MAP.put("trackball", new TrackballCommand());

COMMAND_MAP.put("key", new KeyCommand());

COMMAND_MAP.put("sleep", new SleepCommand());

COMMAND_MAP.put("wake", new WakeCommand());

COMMAND_MAP.put("tap", new TapCommand());

COMMAND_MAP.put("press", new PressCommand());

COMMAND_MAP.put("type", new TypeCommand());

COMMAND_MAP.put("listvar", new MonkeySourceNetworkVars.ListVarCommand());

COMMAND_MAP.put("getvar", new MonkeySourceNetworkVars.GetVarCommand());

}

但也不是所有的命令都放入COMMAND_MAP中.quit 和 done 就是例外,原因也很简单,没必要放进Map.

再来分析下这条语句:MonkeyCommandReturn ret = command.translateCommand(parts,commandQueue);

首先,command已经是MonkeyCommand的sub class了.so 调用translateCommand将会表现出不同的行为.

例如,command假设为PressCommand.则translateCommand的表现为:

queue.enqueueEvent(new MonkeyKeyEvent(....))

每一个MonkeyEvent又都代表了一些对AP GUI错作.所以,也就是把操作放入了Queue.

okay.就这么多了.才不多这次就说这么多吧.我再附上我的手绘图,希望有帮助.

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

推荐阅读更多精彩内容