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

相关推荐
2501_915918411 小时前
详解iOS App上架至App Store的全流程步骤与注意事项
android·macos·ios·小程序·uni-app·cocoa·iphone
码农coding2 小时前
android12 SystemUI之StatusBar(二)
android
Lesile4 小时前
Interview#1 历史演进:MVC · MVP · MVVM · MVI架构详解
android·android jetpack
杉氧5 小时前
Flutter 像素级还原实战:用 CustomPaint 与 Bezier 曲线手绘精致图针
android·前端·flutter
我命由我123457 小时前
Android 在构建过程中,发现有两个依赖库都包含了相同路径的资源文件
android·java·开发语言·java-ee·kotlin·android-studio·android runtime
Coffeeee8 小时前
谷歌的一个优化建议,让我重新学了一遍Android里面如何正确处理位图
android·google·kotlin
冰暮流星8 小时前
mysql之新建表及对表的查询
android·数据库·mysql
用户2018792831678 小时前
彻底搞懂LayoutInflater、ViewInflater与textViewStyle优先级:XML属性为何能覆盖全局样式?
android
达达尼昂8 小时前
AI Native 工程实践:如何为 Claude 5 设计更有效的上下文
android·人工智能·后端
Cry丶9 小时前
【已解决】adb devices 能识别手机,但 HBuilderX 搜索不到设备的避坑指南
android·adb·uni-app·hbuilderx·真机调试