0x00 前言
大家常常会抱怨安卓平台没有一个统一、好用的性能检查工具。不能像iOS的instrument那样方便。
![0c2ba3f432e90b3fb14b462a95eb0c58.png](https://i-blog.csdnimg.cn/blog_migrate/89e858b60e085734b6095664a11a8b06.jpeg)
图片来自:Instruments Help
比如,Unity Blog在3年前就已经教大家如何使用instrument来进行性能检测了。
Profiling with Instruments – Unity Blogblogs.unity3d.com![ca9c0c1adc888a3bd344cab2f6bffcd9.png](https://i-blog.csdnimg.cn/blog_migrate/1bbdf829b34fb864d9108133803458d1.png)
其实目前的Android Studio已经提供了很好的安卓平台的性能检查工具。
https://developer.android.com/studio/profile
这里主要介绍CPU Profiler来检查Unity原生函数的性能。就像iOS上的instrument一样。
图形相关的性能检测,可以使用https://github.com/google/gapid。
0x01 导出设置
下文中我使用的Android Studio版本为:3.5 preview,Unity版本为:2018.3.0b11。测试工程为:SurvivalShooter(Asset Store) 。
首先,根据android studio的文档:
https://developer.android.com/studio/profile/cpu-profiler?hl=en
Sampled (Native): Captures sampled traces of your app’s native threads. To use this configuration, you must deploy your app to a device running Android 8.0 (API level 26) or higher.
进行native sample的设备系统版本要求是:Android 8.0 (API level 26)
![eaf70b819321f0acade4eaf1db219986.png](https://i-blog.csdnimg.cn/blog_migrate/899a8b56460fa11a515cf9dad0fd8b2a.jpeg)
为了可以检测脚本的代码开销,(同样,就像instrument那样)推荐Scripting Backend使用il2cpp。
我们可以自己写一个函数,用来测试。(当然,工程中的脚本也是一样的)
![74b1dc234a1e0c96817b3b0c5f0248da.png](https://i-blog.csdnimg.cn/blog_migrate/bc3f9b39c242cdcd5131927fc29b4187.jpeg)
之后,我们把工程按照Gradle的形式导出,以便之后使用as打开。
![3290f24e442bec25bb5907dd60665728.png](https://i-blog.csdnimg.cn/blog_migrate/414fd80e6fd7af0e21fce7f992ff3917.jpeg)
0x02 符号信息
正常使用as打开导出的工程。在
src/main/jniLibs/armeabi-v7a/
目录下,可以找到相关的so文件。我们主要关注libunity.so以及libil2cpp.so。前者是引擎部分,后者是开发者的脚本部分。此时的so都是符号信息不全的。所以我们要做的只是替换符号信息更全的so。
![87b97999084d57097da62a1d7ac01a1e.png](https://i-blog.csdnimg.cn/blog_migrate/629aa21060774b786c070ffc0b636f0b.jpeg)
首先来替换libunity.so,可以在Unity目录下
PlaybackEngines/AndroidPlayer/Variations/il2cpp/Development/Libs/armeabi-v7a/
这里找到带符号信息的so。
![ea3b55103d92083ed914b65ff9a198e9.png](https://i-blog.csdnimg.cn/blog_migrate/f68adb40eec34060e609a52f0219ad45.jpeg)
之后,如果还想查看脚本的调用开销(il2cpp),我们就需要将带符号信息的libil2cpp替换。
它的路径在:
工程/Temp/StagingArea/symbols/armeabi-v7a/libil2cpp.so.debug
![7661fdf2f692d9a24a33ebf0a58c0163.png](https://i-blog.csdnimg.cn/blog_migrate/a2eb33fa55213de4a267b17ab97aaeac.jpeg)
可以看到,gradle工程中的libil2cpp.so只有7.7mb,而带符号信息的libil2cpp则有88.3mb。
0x03 Profiling!
![eea5759ce013afb0f5c62ba7ab09758e.png](https://i-blog.csdnimg.cn/blog_migrate/f942ca20aa4d2f1c8f97ae772a65bd28.jpeg)
点击右上角的Profile Button,就可以开始进行性能检测了。
选中CPU栏,检测项目中有Java Method、Sample C/C++等等。选择C/C++,即可看到一个timeline。点击recorde,则开始记录call trace。
![248fd5e9b14a2f4112b787177a95e034.png](https://i-blog.csdnimg.cn/blog_migrate/dc141842f9109c242802bf894df0619b.jpeg)
![1bdcfc791cccb58eb3d100731739de93.png](https://i-blog.csdnimg.cn/blog_migrate/9757b4a361a5cfac203bae96f8722e13.jpeg)
可以看各个线程的函数调用的chart,整个流程比较流畅。
也可以按照时间开销,整理为堆栈调用的形式。这里可以看到使用il2cpp的脚本函数调用。
我们可以找一找我们的UpdateTest1那个函数。
![623a6a9588d5cdd0778575314671a76d.png](https://i-blog.csdnimg.cn/blog_migrate/060c5d1e73637fbf6db574d0e297d275.jpeg)
当然,这里和本文开头Unity Blog中在iOS平台上使用Instrument类似,主要是用来检测一些原生函数的性能,大家可以将它作为Unity Profiler在安卓平台上的一种补充。
-EOF-
欢迎大家关注我的公众号慕容的游戏编程:chenjd01
![5345d17abbf21029f359cf4346fd47ca.png](https://i-blog.csdnimg.cn/blog_migrate/64e0b7773f4ac66715c7de4aa40a67c4.jpeg)
最后打个广告,欢迎支持我的书