【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中去看具体的代码逻辑。

相关推荐
studyForMokey1 小时前
【Android面试】Activity生命周期专题
android·面试·职场和发展
chehaoman1 小时前
MySQL的索引
android·数据库·mysql
恋猫de小郭4 小时前
React Native 鸿蒙 2026 路线发布,为什么它的适配成本那么高?
android·前端·react native
studyForMokey5 小时前
【Android面试】窗口机制专题
android·面试·职场和发展
用户013201436036 小时前
Android 资源管理与常用布局详解|基础入门
android
陆业聪6 小时前
从 OpenClaw 到 Android:Harness Engineering 是怎么让 Agent 变得可用的
android·人工智能·ai编程
stevenzqzq8 小时前
颜色透明度转换技术文档(Android/Compose)
android
巴黎没有摩天轮Li9 小时前
Android JVMTI 接入流程
android
2501_915909069 小时前
iOS 抓包不越狱,代理抓包 和 数据线直连抓包两种实现方式
android·ios·小程序·https·uni-app·iphone·webview
城东米粉儿10 小时前
Android VCL 和 NAL笔记
android