此前我写了一篇如何使用Instrument对Xamarin.iOS应用进行调优,但里面仅仅介绍了如何加载Xamarin.iOS程序,在实际的调试中还是不够用的,有时候为了有的放矢,我们需要深入到代码一级才知道程序出现问题的根源,今天我给大家介绍一下如何用instrument对Xamarin.iOS进行代码级调优。

要实现对Xamarin.iOS进行代码级调优的基础是:导入被调优程序的dSYM文件。

用Xamarin.iOS开发iOS程序还是与Xcode有所不同,加上我开发的输入法是extension扩展程序,与平常的程序又有所不同,所以此前我一直不知道Xamarin.iOS的dSYM文件在什么位置,以致于一些内存泄漏问题一直无法予以解决。直到最近才查阅了一些资料,才恍然大悟。

下面我给大家介绍一下,载入dSYM文件的步骤。

先介绍调试主程序的情况: 首先我们根据调优需要在instrument里加载程序,这一步具体请看如何使用Instrument对Xamarin.iOS应用进行调优,这里我以岁寒输入法的主程序为例;

加载程序之后,根据需要切换界面,触发事件,设置几个Generation,然后点左上角的终止按钮,停止运行。

点击File,选择Symbols

选中要调优的程序集,我这里就是SuiHanIME.iOS。

再看BinaryPath,路径为红色,表示文件有问题,我们需要选择正确的二进制文件。

一般我们是在debug模式下安装的程序,所以我们找最近一次编译生成的二进制文件即可,如果是真机,其路径应该是: .../XXX/iOS/bin/iPhone/Debug/device-builds/iphone8.4-11.4/XXX.iOS,XXX表示你的项目的名称,这里我的路径就是.../SuiHanIME/iOS/bin/iPhone/Debug/device-builds/iphone8.4-11.4/SuiHanIME.iOS

选择正确之后,BinaryPath就不会再是红色的啦。

然后还要选择dSYM Path,其路径一般是XXX/iOS/bin/iPhone/Debug/device-builds/iphone8.4-11.4/XXX.iOS.app.dSYM,XXX表示你的项目的名称,这里我的路径就是 SuiHanIME/iOS/bin/iPhone/Debug/device-builds/iphone8.4-11.4/SuiHanIME.iOS.app.dSYM

点击Done,就完成加载了。

这个时候,当我们选一个对象的时候,才能够看到这个对象的调用栈的情况,而不再是一堆16进制的乱码。

点击某个栈,我们可以查看具体是哪一句代码。

如果主程序是用Xamarin.Forms实现的,由于多了一层封装,要看出我们所写的代码比较困难,而如果主程序也是Xamarin.iOS的话,我们基本上是可以找到和我们源码相对应的代码段,是的,就是原原本本的C#代码。

以上是主程序的情况,如果像我一样,开发的是一个extension扩展程序,要对这个extension扩展程序调优应该怎么办?

主体步骤和前面是一样,差别主要是指二进制文件的位置。

extension扩展程序的二进制文件位置一般在.../XXX/xxx/bin/iPhone/Debug/device-builds/iphone8.4-11.4/xxx.appex,XXX表示你的项目的名称,xxx表示你extension扩展程序的名称,所以我这里的路径就是.../SuiHanIME/Keyboard/bin/iPhone/Debug/device-builds/iphone8.4-11.4/Keyboard.appex。注意,这个二进制文件是在extension扩展程序项目自己的文件夹路径中的。

而比较坑的是,extension扩展程序的dSYM文件是和主程序的放在一起的,路径一般为.../XXX/iOS/bin/iPhone/Debug/device-builds/iphone8.4-11.4/xxx.appex.dSYM,XXX表示你的项目的名称,xxx表示你extension扩展程序的名称,所以我这里的路径就是.../SuiHanIME/iOS/bin/iPhone/Debug/device-builds/iphone8.4-11.4/Keyboard.appex.dSYM

与前面一样,我们可以查看到调用栈

由于extension扩展程序是Xamarin.iOS实现的,所以可以相对容易的查看到对应的C#源码。

用instrument对Xamarin.iOS进行代码级调优就介绍到这里,感谢阅读。