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

相关推荐
Dxy12393102161 小时前
Python 操作 MySQL 事务:从入门到避坑
android·python·mysql
峥嵘life2 小时前
Android getprop 属性限制详解:User 版本属性获取问题分析
android·开发语言·python·学习
一航jason3 小时前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android·插件化·组件化·换肤
李斯维4 小时前
Jetpack 可观察数据容器 LiveData 的入门与基础使用
android·android jetpack
问心无愧05135 小时前
ctf show web入门261
android·前端·笔记
alexhilton5 小时前
车载系统中的可扩展UI:从UI嵌入到系统窗口编排
android·kotlin·android jetpack
Cloud_Shy6185 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第一章 Item 4 - 6)
android·数据库·论文阅读·python
therese_100865 小时前
安卓面试题
android
码云骑士5 小时前
Android Launcher启动过程
android
Java面试题总结6 小时前
MySQL EXISTS 详解:存在性判断、NOT EXISTS 与实战示例
android·数据库·mysql