【Android Monkey源码解析一】-系统执行

前言

本系列源码解析主要针对Android的Monkey,如果对Monkey的使用不熟悉的可以进入官网进行了解,地址:UI/Application Exerciser Monkey | Android Developers

本系列主要基于Android 12进行源码分析,源码地址:cmds/monkey - platform/development - Git at Google

Monkey的启动分析

当我们在连接真机或者模拟器后,可以通过adb shell的方式进入交互模式,然后通过monkey指令加上特定的参数即可触发具体的monkey测试。monkey真机或者模拟器上的可执行文件存在系统的/system/bin/monkey,此可执行文件的源码地址:cmds/monkey/monkey - platform/development - Git at Google。在编译过程中,会把此文件复制到/system/bin/目录下。具体的可执行文件monkey内容如下:

可执行文件monkey遵循bash的编写规范,主要是做了如下几件事情:

  1. 创建一个名为base的变量,值为/system目录;
  2. 设置一个名为CLASSPATH的环境变量,值为/system/framework/monkey.jar,也是后面我们要重点来解析的Monkey源码打包成的jar包;
  3. 捕获HUB信号处理。trap命令用于捕获信号,然后处理,HUP:HUP中断信号表示用户键入<Ctrl+X>时由终端驱动程序发送的信号,中间""表示捕获信号之后做的事情,这里表示捕获到HUP信号后什么也没有做!也就是用户在终端执行后如果进行取消,monkey仍会在后台运行;
  4. 循环所有命令行参数,写入到标准输出(屏幕)。一行一个的打印命令行参数(以空格字符隔开),shell中for循环的语法,echo命令用于向屏幕中输出内容,$@可以获取到所有的命令行参数,我们给monkey命令传入的所有命令行参数,echo将接收到的所有命令行参数原样写入到标准输出;
  5. 通过app_process执行monkey。app_process是一个可执行文件,由c++编写,它会创建虚拟机实例,可以用来执行Java程序。可以看到 app_process传了三个参数,第一个是/system/bin目录,第二个是monkey的入口类,第三个是命令行带的所有参数。在shell中,用$@来接收执行命令的所有参数列表。

这里暂时不对app_process进行进一步的分析,第5步其实主要是在CLASSPATH下的jar包中找到com.android.commands.monkey.Monkey字节码,并传入在命令行指定的参数。

如下是在shell交互环境下运行monkey的输出:

复制代码
PS C:\Users\Administrator> adb shell
LONGZHIYE:/ $ monkey -p com.android.settings 5
  bash arg: -p
  bash arg: com.android.settings
  bash arg: 5
args: [-p, com.android.settings, 5]
 arg: "-p"
 arg: "com.android.settings"
 arg: "5"
data="com.android.settings"
// Monkey Version Informations:
// Build Label: LONGZHIYE/LONGZHIYE_EEA/LONGZHIYE:12/UP1A.231005.007/LONGZHIYE202510040918:userdebug/release-keys
// Build Time: 1765372445000
// Build Type: userdebug
// Build Tags: release-keys
// Build Debugable: true
// Build Changelist: LONGZHIYE202511201818
// Monkey Start Time : 2730684; Monkey Start Calendar Time : 2025-10-04 14:59:55.982
Events injected: 5
## Network stats: elapsed time=80ms (0ms mobile, 0ms wifi, 80ms not connected)
LONGZHIYE:/ $

后续的源码解析,将转到核心的monkey.jar中去看具体的代码逻辑。

相关推荐
HZZD_HZZD31 分钟前
3T-UEM 数据建模实战:三维立方体 + LAM/ELA 双归因怎么落地?
android
Carson带你学Android34 分钟前
腾讯正式上线AI应用生成平台:一句话生成 App,还能直接上架商店
android·ai编程
小陈的进阶之路1 小时前
Claude Code辅助测试:API测试与pytest自动化
android·开发语言·kotlin
三少爷的鞋1 小时前
Kotlin 与 Java,不是简单的高低之分
android
一笑的小酒馆7 小时前
Android12Launcher3实现应用裁剪
android
FinelyYang13 小时前
UniApp + LiveKit:Android 端为什么要用原生做屏幕共享,以及我们怎么落地的
android·uni-app
蓝速科技13 小时前
蓝速科技信创落地:平衡安全合规与项目成本的实战方案
android·运维·人工智能·科技·安全·电脑·鸿蒙
又见情义15 小时前
RK3568 Android 13 SDK 开机自动开启共享热点实践
android
mmsx16 小时前
return false 不是拦截:一次按键触发两个动作的事件冒泡陷阱
android·bug
DU_YULIN17 小时前
Camera HAL ThreadManager概述
android·camera hal