在项目中有个功能是获取FPS,用到了root注入来获取FPS,这个方法是通过计算eglSwapBuffers
调用次数来统计的,那目的就简单了,直接注入替换eglSwapBuffers
,再在新的函数统计并调用原始的eglSwapBuffers
即可.
看起来挺简单的事情,放到实际情况中却又是另外一回事了.
第一个问题是在刷了ColorOS
的小米机器上遇到的.问题简单描述就是:通过shell
手动执行二进制文件注入成功,通过java代码执行命令,注入失败.
原因是通过java代码执行,在注入的时候找到的mmap
偏移地址不对.导致计算远程mmap
地址不正确,而无法继续.通过各种测试,最后问题得到解决.
以前的代码是直接使用函数地址:
1
|
|
修改后的代码则从so中查找函数地址:
1 2 3 4 5 |
|
第二个问题,则发生在三星系列手机上,注入正常,eglSwapBuffers
地址确实替换成功了.但就是不调用替换的函数.没办法,只好硬着头皮看FPS Master的反汇编了.先看图.
图片上的反汇编,我加来注释.其中的函数名我也改了.可以看到他有去查找/system/lib/hw
和/system/vendor/lib/hw
目录下以hwcomposer
开头的文件.(其中的findStartStringFile
函数名是我修改的,内容就不贴图了)
知道他会查找hwcomposer
开头的文件,那是不算这个文件里也有eglSwapBuffers
的实现呢?拿出来对比就知道了.
第一个eglSwapBuffers.msm8974.so
是Z5S上copy出来的,并没有eglSwapBuffers
,第二个eglSwapBuffers.omap4.so
是三星的一款手机上拿出来的,可以看到确实是有eglSwapBuffers
字符串,大致能猜测到,这个so里又实现eglSwapBuffers
.那就一起替换吧.
效果和想的一样,这下三星也没问题了.
注入不稳定,各种问题.还有通过eglSwapBuffers
得到的fps貌似不理想,不管卡不卡,得到的帧率可能都很底或很高.感觉和性能完全不靠边似的.如果谁还有更好的办法,请提示哦:)