android应用加速优化与分析,兼谈launcher优化。

android应用开发使用java语言,java是开发门槛比较低,运行效率比较低,开发人员的素质相差比较大。导致java程序开发容易,优化和维护比较困难。个人认为java的核心在于自动化内存管理和跨平台,但其诟病也在这一块,至于效率,随着硬件的发展,越来越不再是人们考虑的重点。很多人会写java程序,却不怎么会优化java程序,遇到内存泄露,遇到空对象,遇到超时,遇到概率性的内存BUG,常常无从下手。因为能解决这些问题的工具实在太多了,这也说明java的优化是个世界性问题,问题的表象可能一个,但实质上引起的原因可能不只一种,需要选择正确的工具才能找到问题点,用错了工具还是两眼抓瞎。不像C语言一个内存,一个堆栈调试可以解决大部分的程序问题。

公司有个WOSLauncher的启动器项目,产品经理认识操作时动画不流畅,开发的同事搞了一个多月,重构了大量代码,效果依然不理想。拿到我这里,优化三剑客一开,立刻找到问题点,几分钟后,优化效果立竿见影。我认为anroid优化的三剑客是systrace,traceview,hierarchyviewer,这三个工具可以解决了我工作中所有程序的优化。

我无意去对别人的代码重构,这需要太多的时间,也不想去review项目组同志的所有代码,这同样需要花费很多的时间。直接使用工具。

1.首先使用开发者模式自带的使用GPU过度绘制分析UI性能(开发者模式,布局优化)

硬件加速,打开 “Show hardware layers updates” 选项。(开发者模式,变绿未加速)

使用GPU呈现模式图及FPS考核UI性能研究,发现问题都不是很大

 

2.使用systrace研究,操作后获得如果结果,图中的红点和黄色表明系统确实滑动不够顺滑,

点击红点使用M键,发现问题大概集中在三个方面,布局measure,CPU delay,view ondraw

3.使用hierarchyviewer工具可以优化布局,查找measure,layout,ondraw存在的性能问题,然后打开后就发现,存在红点的view都是有性能问题,然后发现布局出在shortcut上,最终定位在google的文件夹上。他有两个view,一个ondraw超时,花费了1.234MS,一个layout超时,花费了0.597毫秒,这个谷歌的一个文件夹,可能需要寻找替代方案

无法贴图

3cpu的Scheduling delay问题,一般表示CPU比较忙,这个可以通过traceview分析,抓取traceview后分析,得到如下界面

无法贴图

这个工具可以显示APP中所有函数的执行时间,一般情况下,我们需要优化两类函数,一是调用次数少,但每次花费时间长的函数,另一是本身花费时间不长,但调用次数非常多,使得本身消耗了大量的时间,优化的方法主要是重构code,修改算法,寻找替代方案

点击CPU TIME/call列可以使得所有函数每次调用消耗的平均时间按升序或者降序排列,点击calls+recurcalls/total可以得到函数调用和递归调用的总次数和升序或者降序排列,一般可以直接略过非我们APP自定义类的系统的函数,直接研究我们自己包名类名的函数。

然后找到了一个耗时函数createMediumDropShow函数,这个函数使用了特效,开启了extractAlpha,这是个很消耗时间的功能。createMediumDropShow本身消耗的时候占了整个周期片断的百分之三点四之多。尝试打开代码优化之。去掉特效或者寻找替代方案后,再观察。

4.打开systrace工具观察优化的成果,发现黄点和红色消失了大半。

5.尝试把google文件夹移到固定栏上,不随动画重绘再测试,红色警告全部消失

6.进一步优化黄色警告

7.打开traceview,发现onMeasure成了耗时大户,进一步使用开发模式里的GPU过度绘制分析,发现有不太严重的过度绘制问题,ICON下的软件名字字体呈现红色,这是过度绘制的标志。慢慢优化

8打开hierarchyviewer工具再次分析,红色都是有问题的布局,找到这些layout文件,去掉嵌套,优化过于巨大的图片,androidstudio对于布局,会给很多有用的建议。优化后运行之。

时间: 2024-10-07 23:47:30

android应用加速优化与分析,兼谈launcher优化。的相关文章

Android无需权限显示悬浮窗, 兼谈逆向分析app

最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android.permission.SYSTEM_ALERT_WINDOW权限. 如下图, 截图是在使用Chrome时截的, 但是屏幕顶部却有UC的view浮在屏幕上. 我使用的是小米, 我并没有给UC授悬浮窗权限, 所以我看到这个悬浮窗时是很震惊的. 截图 悬浮窗原理 做过悬浮窗功能的人都知道, 要想显示悬浮窗, 要

SQL优化技术分析-1:操作符优化

一.操作符优化 1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL 性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记 录,如果转换成功则直接采用多个表的连接方式查询.由此可见用IN的SQL至少多了一转换的过程.一般的 SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了. 推荐

Android应用开发性能优化完全分析

 应用UI性能问题分析 UI可谓是一个应用的脸,所以每一款应用在开发阶段我们的交互.视觉.动画工程师都拼命的想让它变得自然大方美丽,可是现实总是不尽人意,动画和交互总会觉得开发做出来的应用用上去感觉不自然,没有达到他们心目中的自然流畅细节:这种情况之下就更别提发布给终端用户使用了,用户要是能够感觉出来,少则影响心情,多则卸载应用:所以一个应用的UI显示性能问题就不得不被开发人员重视. 2-1 应用UI卡顿原理 人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然

Android 应用开发性能优化完全分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也还是有很多的,譬如Google官方都已经推出了优化专题,我这里只是总结下自的感悟而已,若有得罪欢迎拍砖,我

【转】Android应用开发性能优化完全分析

http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网

转——Android应用开发性能优化完全分析

[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也还是有很多的,

转:Android应用开发性能优化完全分析

转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质

[Android] [Java] Process 创建+控制+分析 经验浅谈

无论是Android亦或者Java中或多或少需要调用底层的一些命令,执行一些参数: 此时我们需要用到Java的Process来创建一个子进程,之所以是子进程是因为此进程依赖于发起创建请求的进程,如果发起者被Kill那个子进程也将Kill. 对于Process相信使用过的朋友一定不会陌生,它具有如下特点: 1.创建简单 2.控制难 3.容易导致无法创建子进程 4.如果是多线程那么很有可能造成内存溢出 以上现象如果你只是偶尔使用一次,创建一个进程或许你什么都没有感觉到,但是如果你使用了多线程,进行了

android内存优化3—从代码角度进行优化

通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能.下面我们就从几个方面来了解Android开发过程中的代码优化. 1)静态变量引起内存泄露 在代码优化的过程中,我们需要对代码中的静态变量特别留意.静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁.所以,一般情况下,静态变量