反编译实战之给锤子ROM加上"显示GPU过度绘制"
什么叫“显示GPU过度绘制”呢?
当使用GPU绘图时,在屏幕上绘制不同的颜色来表明过度绘制的情况。过度绘制情况的好坏通过颜色来表示,从蓝色、绿色、淡红色到红色 ,分别代表从好到坏的渐变(1x过度绘制、2x过度绘制、3x过度绘制和超过4x过度绘制)。界面上存在少量的淡红色可以接受,但如果存在较多的大红色就代表过度绘制有点严重了。
通俗的来讲我们可以这样理解,过度绘制可以理解为屏幕上像素被绘制的次数。1x表示1次,2x表示2次,以此类推。也就是说当我们看到的具体图片(或者文字)时,有可能该图片的后面还存在别的图片(或者文字),只是被遮挡住了我们无法看见,如果层次较多就会导致过度绘制。通过分析应用的过度绘制情况,有利于我们优化应用,给用户更好的体验。开启“显示GPU过度绘制”的方法是,在系统设置中开发者选项里面打开。
之前一直想把玩下罗老师的锤子ROM,虽然看了发布会,但毕竟没有上手过,所以不知道具体情况。终于有机会将最新版的锤子ROM刷到了Find 5上试试,不试不要紧,一试吓一跳,怎么这么卡顿(如果帧数<60fps/s就会感觉卡顿)。作为开发人员遂打算看看是否有过度绘制的情况,可找遍了设置,愣是没有看到“显示GPU过度绘制”的选项(小米也没有,AOSP以及CM可是默认就带有的哦),难道给屏蔽了??有必要吗??(心中顿时一万头草泥马奔涌而过)
难道不给看就完了吗?于是乎便有了此文……
问题:设置界面上无“显示GPU过度绘制”选项
分析:将选项屏蔽了。屏蔽的方法其实很容易想到,在配置文件里移除“显示GPU过度绘制”,并在代码中删掉(或注释掉)对应的初始化以及处理代码。
解决方案:既然分析出了屏蔽的方法,那么自然解决方案就有了:
1. 重新加入该选项毕竟原生系统默认是带有该功能的,既然屏蔽了那自然加上就可以了(后文采用该方法)。这种方法需要对smali代码较为熟悉,难度较大,但修改完成后不会影响原设置的功能。
2. 替换相关选项在没有源码的情况下,我们能修改的就只有smali代码了,如果对于smali代码不是很熟悉,就很容易出错。那么我们可以采用替换的方法来添加“显示GPU过度绘制”的选项,也就是“偷梁换柱”法。修改配置文件里相应的配置项,在初始化代码中将设置里面已有的某一项替换成“显示GPU过度绘制”,这样就可以使用该方法了。这种方法是最简单粗暴的,但也是最快捷的一种。
步骤:经过了上面的分析和思考,我们应该动手了。这里采用的是第一种解决方案,虽然要难一点但可以在不破坏原设置的情况下加入我们的东西,我个人比较喜欢这种。当然如果会使用第一种解决方案了,第二种自然也就信手拈来,好了废话不多说,“翠花,上干货……”
1. 准备反编译资源这里我们需要获取锤子Find5刷机包,并提取其中的/system/app/Settings.apk和/system/framework/framework-res.apk
2. 准备反编译工具工欲善其事必先利其器,所以我们需要准备好顺手的反编译工具,这里我使用的是APKTOOL和Dex2Jar以及JD-GUI。
3. 反解Settings.apk在终端中执行
apktool if framework-res.apk
安装资源文件,然后再执行
apktool d Settings.apk
将APK文件解包为smali文件
同时将Settings.apk中的classes.dex文件解压出来,使用dex2jar工具将dex文件转换为jar包,使用JD-GUI进行查看。
4. 定位问题打开Eclipse并使用Hierarchy View工具(这里并不是一定需要Eclipse,通过抓取跳转Log同样可以定位到对应的显示页面)进行查看,可以得到当前页面对应的文件是com.android.settings.DevelopmentSettingsActivity。
然后再在使用apktool反解后的文件夹中搜索关键字——"过度绘制",可以知道其在string.xml中对应的字符串ID,这里搜索到的结果是:
变量初始化
onCreate初始化
onResume显示
onCheckedChanged处理
经过以上修改之后,我们再次打包并push到系统中进行测试,我们可以看到对比图:
左侧为锤子ROM原生设置界面 右侧为修改后的设置界面
左侧为未开启状态 右侧为开启状态
总结:一开始只是想看看“GPU过度绘制”,可没成想人家不给看,那就只能自己动手了。以后遇到这种问题还是先分析,避免走弯道。
如果想深入了解GPU过度绘制以及APP优化的童鞋可以参考以下链接(需要翻墙):
http://www.curious-creature.org/2012/12/01/android-performance-case-study/
国内有大牛翻译了,链接如下:
http://blog.chengyunfeng.com/?p=458#
优化效果可以参看:
http://www.cnblogs.com/myzh/
下载:我将修改前后的APK都打包上传,有想动手试试的童鞋可以看看,下载地址在这里。