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的过程中,我曾经写过四篇文章介绍他:
- 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.github.io/)。使用Messier可以方便的在越狱设备上Trace任意应用,且能更方便的在视觉上自定义Trace的开始点和结束点。
Messier由三个部分组成。
- Tweak(越狱插件)
- Dylib(动态库 messier.framework)
- 桌面端(Messier.dmg)
下面是相关截图:


最新Build
使用方法
第一步,安装macOS客户端
在这里 下载安装最新的macOS客户端 Messier.dmg。

第二步,越狱设备配置
(1)安装
- 打开
Cydia. - 点击
Sources->Edit->Add. - 输入
https://messier-app.github.io/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
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,如果遇到问题,大家随时反馈。
补充:iOS14也可使用
开源和授权
开源
Messier是免费但闭源的。Messier的核心仍然是AppleTrace,因此核心仍然是开源的。除此之外,还要感谢以下三个仓库。
授权
Messier是免费的(或者半年,或者永久),使用此软件的唯一条件是:微信关注订阅号客户端技术评论。这是我个人维护的订阅号,之前分享了一些iOS应用启用速度优化和逆向工程的文章,目前正在专注于《Practical Modern C++》和一些应用逆向工程的基础知识分享,未来不会设限,任何我感兴趣的内容都会分享。

总结
任何软件的开发都是个艰辛的过程,核心功能有了,但为了更容易的使用这个核心,周边的辅助设施代码要写很多。此次开发Messier让我感触颇深。很多软件,能用 到 好用 真的是还要努力很多。 从0到1难,从1到100更难。
再次附上Messier的官方网站: https://messier-app.github.io/
Thank you for reading :)