记录一下这两天找bug的内心经历。
问题背景:
客户:我们APP中,想集成进AI测肤的功能,实时检测人的肤质状况,并给出合理化建议。
经理:好的。
需求调研:
选择了美图作为合作方,用他们的现成产品。
项目集成:
美图提供了Android和IOS的SDK,开发人员摆好姿势,准备集成。
对于开发老手来说,集成的速度还是比较快的。但是奇怪的事情发生了:集成后,Android端的结果页面是异常的卡顿,而IOS端却很丝滑。
问题分析:
结果页面,其实就是用的原生的WebView加载H5页面,照理说不应该会有卡顿现象。
对方给的demo跑起来却是正常的,但集成到项目里就是不行。
于是判断:
会不会是集成进来的文件,与我们项目本身的文件有些冲突,导致了加载慢的问题。
询问过美图之后,对方建议是不是项目有内存泄漏等问题,确实,在webview中容易出现内存泄漏的问题。
但在事后但排查中,发现一直走了弯路。
此时,不信邪的耿直程序员性格出现了。
首先,我们新建了一个空白的工程,然后一步步集成sdk后,发现结果正常。
那就只能怀疑是项目中是否有什么特殊配置导致的问题。
于是,单独拷出来项目,一点点去调试。
调试的过程中,经历过无数的期盼、失望、重头再来。
我的内心几乎要崩溃了,wwwwww。
调试的时候,也有技巧:
先删除那些你认为肯定不会影响此业务的包,等编译通过后,再一点点删除其它的包。
在项目的启动项去直接打开集成的sdk,发现还是有问题。
最终定位到AndroidManifest.xml中的一行代码的问题。
android:hardwareAccelerated="false"
把这个属性,改为ture后,居然神奇的变好了!
赶紧看看这属性到底是干嘛的?
功能:启动硬件加速
缺点:占用内存
特点:可以在Application、Activity、Window、View四个级别进行硬件加速控制
从Android3.0(API Level 11)开始,Android 2D渲染管道能够更好的支持硬件加速。硬件加速执行的所有的绘图操作都是使用GPU在View对象的画布上来进行的。因为启用硬件加速会增加资源的需求,因此这样的应用会占用更多的内存。
启用硬件加速的最容易的方法是给整个应用程序都打开全局硬件加速功能。如果应用程序只使用标准的View和Drawable,那么打开全局硬件加速不会导致任何的不良的绘制效果。但是,因为硬件加速并不支持所有的2D图形绘制操作,所以对于那些使用定制的View和绘制调用的应用程序来说,打开全局硬件加速,可以会影响绘制效果。问题通常会出现在对那些不可见的元素进行了异常或错误的像素渲染。
这两个属性通常配合一起使用:
android:hardwareAccelerated="false"android:largeHeap="true"
largeHeap="true"表示可以让应用能申请使用更多的内存,最初做项目时,引导页面的ViewPager报了OOM异常,图片并不大,于是加上了上面两行代码,解决了问题。但并没有深究其意义,果然欠下的技术债迟早要还的。
网友评论