由于现在iOS这一块缺少性能测试,导致 app 性能优化方面工作并没有明确的工作目标。所以需要个必要的测试工具来数据化 app 的性能状况。
需要一个工具可以检测 app 的内存占用,CPU使用情况,FPS还有启动时间(可以通过 UIAutomation
来实现)
由于需要检测生产环境下各种友商 app,用于对比性能,所以决定用越狱后tweak来实现性能的检测。
Tweak 的一些实现
(示例代码:Github)
tweak的主要功能是检测app启动后每一秒的内存使用量,CPU使用率,FPS。
内存使用量检测:
1 | // get current RAM usage |
CPU使用率检测:
1 | // get current CPU usage |
FPS 监测:
1 | - (void)displayLinkTick:(CADisplayLink *)displayLink |
由于想要做到通用性,所以选择在 UIApplication
的 delegate
里面的 -application:didFinishLaunchingWithOptions:
来启动检测,由于是 delegate
,正常的 Logos 语法没法准确 hook ,于是决定用运行时 Method Swizzling
(参考:念茜 Objective-C的hook方案(一): Method Swizzling
)
自定义IMP用于替换之前的 -application:didFinishLaunchingWithOptions:
1 | id myDidFinishLaunchingWithOptions_imp(id self, SEL cmd, UIApplication *application, NSDictionary *launchOptions) |
然后在App进入到后台的时候,进行检测记录的文件写入,替换原来的 -applicationDidEnterBackground:
1 | id myApplicationDidEnterBackground_imp(id self, SEL cmd, UIApplication *application, NSDictionary *launchOptions) |
实现方法替换:
1 | - (void)setDelegate:(id)delegate |
Tweak 的使用
和其他的越狱工具大体相当,在 .plist
文件里声明好你想要 hook 的 app(也就是你想要监测的)。利用 Theos 可以把你写好的工具生成一个 dylib ,然后通过已越狱的手机就可以运行了。当然了,如果你要想生成一些报告,还需要在工具中实现。