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

相关推荐
Doro再努力2 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
Daniel李华2 小时前
echarts使用案例
android·javascript·echarts
做人不要太理性3 小时前
CANN Runtime 运行时组件深度解析:任务调度机制、存储管理策略与维测体系构建逻辑
android·运维·魔珐星云
我命由我123453 小时前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
朗迹 - 张伟4 小时前
Tauri2 导出 Android 详细教程
android
lpruoyu4 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习
独自破碎E5 小时前
【BISHI15】小红的夹吃棋
android·java·开发语言
李堇8 小时前
android滚动列表VerticalRollingTextView
android·java
lxysbly10 小时前
n64模拟器安卓版带金手指2026
android
游戏开发爱好者813 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview