Messier - 简单易用的Objective-C方法跟踪工具
Messier 可以用来跟踪iOS应用的Objective-C方法调用。在越狱设备上可以跟踪任意应用,在非越狱设备上也可用于跟踪调试中的应用。
背景
一般情况下使用Instruments(主要是Time Profiler)进行iOS 应用的性能分析就足够了,但是Time Profiler 把调用方法都合并了起来,失去了时序的表现。直到有一天看到Android开发的同事使用 systrace 分析性能,systrace生成一个html文件,把函数(方法)的调用耗时按照先后顺序表现出来。心里想:要是iOS也有这样的工具就好了。了解到这个html文件是 catapult 生成的。
一天看到iosre论坛一篇hook objc_msgSend的帖子。突然想到,可以结合catapult来生成Objective C方法的性能分析图(暂且这么叫吧)。(虽然一直也有hook objc_msgSend的方法,但这次煮好的佳肴终于忍不住下手了)。
于是经过一番努力,AppleTrace 于2017年9月份诞生了。在使用AppleTrace的过程中,我曾经写过四篇文章介绍他:
小编推荐一个群 691040931 里面有许多的iOS开发者在交流技术分享自己的心得,更有一些资料不定期的分享更新。
- AppleTrace 性能分析工具
- AppleTrace 搭配 MonkeyDev Trace任意App
- 使用 Cydia 安装 AppleTrace Tweak
- 使用AppleTrace探索SpringBoard
在使用AppleTrace的过程中,感受到AppleTrace还不够简单易用,尤其是:
- 不能在视觉感受上定义开始和结束点。例如点击某个按钮之前开始Trace,按钮点击完成后停止Trace。
- 获取trace文件太麻烦,需要手动从沙盒复制出来,然后执行merge.py,再执行trace2html(可选),最后打开trace文件。
当工作只需要Trace某一个应用时,AppleTrace几乎满足了要求,然而当好奇心增强,想看越来越多的应用时,啰嗦的“手动”操作就有点麻烦了。
Messier 诞生
为了解决AppleTrace的易用性问题,我在AppleTrace的基础上开发了Messier
应用(官方网站 https://messier.app/)。使用Messier可以方便的在越狱设备上Trace任意应用,且能更方便的在视觉上自定义Trace的开始点和结束点。
Messier由三个部分组成。
- Tweak(越狱插件)
- Dylib(动态库 messier.framework)
- 桌面端(Messier.dmg)
下面是相关截图:
最新Build
使用方法
第一步,安装macOS客户端
在这里 下载安装最新的macOS客户端 Messier.dmg
。
第二步,越狱设备配置
(1)安装
- 打开
Cydia
. - 点击
Sources
->Edit
->Add
. - 输入
https://messier.app/cydia
, 点击Add Source
. 重新加载后会看到Messier Repo
. - 进入
Messier Repo
, 安装TweakMessier
. (注意:Messier tweak 依赖PreferenceLoader
和AppList
,所以需要先确保这两个Tweak已经安装)
(2)配置
打开系统的设置,向下滑动可以看见Messier
(Developer下面),点击进入即可开始配置,如下图。
Enabled Applications
打开后如下图,可设置需要Trace的应用。
Trace On App Boot
配置是否在应用启动时就开始记录方法,默认启用。
Inline Hook (HookZz)
是否使用Inline Hook,默认启用。Inline Hook使用了HookZz来完成。
Main Thread Methods Only
是否只记录主现场的方法调用,默认关闭。
Disable App Applications
是否关闭所有应用的方法记录,默认关闭。若启用后,Enabled Applications
的配置将失效。
第二步,非越狱设备配置
非越狱使用,就是在由自己源码或者MonkeyDev的环境下进行,需要对Xcode工程配置。
注意:首先要说明的是,目前Messier只支持arm64
,因此只能使用arm64的真机
。
在这里 下载解压后得到messier.framework
。
- 拖拽
messier.framework
到Xcode Targets
->Build Phases
->Link Binary With Libraries
. - 点击
New Copy Files Phase
添加Copy Files
步骤, 拖拽messier.framework
进去 ,配置Destination
为Frameworks
.
如下图配置:
这种情况下如果需要进行一些参数配置,可以在 Project Scheme
-> Run
-> Arguments
, 设置 Environment Variables
。
MessierEnableOnAppBoot : true | false
MessierInlineHook : true | false
MessierMainThreadMethodsOnly : true | false
例如:
第三步,开始Trace
打开macOS客户端,此时会提示等待连接,如下图:使用USB连接线
连接iPhone和Mac电脑,打开配置好的要Trace的应用,运气好的话,应用不会Crash,并且macOS客户端会显示已经连接
。(如果运气不好,应用Crash了,可以按照上文配置中的说明,关闭InlineHook)
当Trace结束,点击Stop
,然后点击Fetch
,如果运气好的话,一番文件传输后,会使用Finder定位到trace.json
文件,如下图:
第四步,查看结果
打开Chrome浏览器
(或者Chromium系列),进入chrome://tracing
。
把上一步产生的trace.json
拖拽进去。
奇妙的结果诞生了。
此时,可以使用w a s d
来浏览这个文件了。详细使用方法可以点右上角的问好
,如图:
支持
目前理论上支持 >= iOS10 的系统。
我只是测试了iOS10和iOS12的少部分应用的Trace,如果遇到问题,大家随时反馈。
开源和授权
开源
Messier是免费但闭源的。Messier的核心仍然是AppleTrace,因此核心仍然是开源的。除此之外,还要感谢以下三个仓库。