Android性能优化(十二)之我为什么写性能优化

从1月10号第一篇文章开始,到现在过去了4个月又20天,陆续写下了性能优化系列文章共计十二篇,大概一个月三篇的节奏。本篇文章是性能系列文章的最后一篇,没有新的大方向优化,讲一下写性能优化系列文章的些许事情:初心,过程,所得。

1、 初心

1.1 为什么要做全方位、深入的性能优化?

故事发生在去年年底:某版本上线前当我打开App,唯一的体验就是那如同乌龟爬行般的启动速度。不仅被竞品碾压,更是碾压了我的技术荣辱心:自己做出的App表现差,就是自己差!这是我下定决心要对项目做性能优化的起因。

1.2 为什么写系列文章?

既然要实践性能优化,而我自己也有知识整理的习惯,那么写系列文章自然是水到渠成,顺便是对自己的一个督促。但还有一个原因:

  • 翻阅各种资料,我发现,官方文档作为性能优化过程中最佳的参考资料,而国内开发者的翻译水平不敢过于恭维以及很多开发者关注的角度不一,导致很少有优秀并且全面的参考文章。

那既然我要做性能优化,就挑战下这个优秀且全面。也留下好的参考文章给后来的人!

2、 过程

2.1 性能优化不是温馨的请客吃饭

性能优化的过程是一个非常困难的过程,需要你对优化的方向不仅有知识上的充足储备还要有对现存业务上的了解。拿第一篇App启动优化来举例:

  1. 查看官方文档对启动优化的概述;
  2. 梳理App启动的逻辑;
  3. 使用工具对启动逻辑代码进行准确的度量;
  4. 针对瓶颈确定优化方案;
  5. 优化、测试。

难点在于中间三步:

  • App多人开发,又历经多个版本,没人说得清App启动有多少逻辑以及补偿逻辑;
  • 不同风格的代码读起来,那感觉绝对是一个酸爽;
  • 确认了问题点,如何优化?重构还是重做?

而整理文章的过程更是难上加难,发布出来文章就是自己的一种承诺,既要具备专业性、又要通俗易懂;既要有深度,优化的招数又要尽可能的全面。因此查文档、翻源码是家常便饭。而平时工作也较忙,因此对于一个月三篇的节奏我甚至觉得有点高产(捂脸)。

2.2 对优化,其实你只是一知半解

谈到性能优化,相信各位开发Android的老司机和新司机,都能说上几句。而在面试过程中性能优化也是必问的姿势。但人人都能说几句并不代表对性能优化的理解有多少,不信看几个问题:

  1. Android的内存管理在Dalvik和ART上有什么区别?通过adb获取内存信息时,哪个值是真正可回收的内存占用量?
  2. 如何计算资源图片所占的内存?
  3. 线程的优先级和进程有关吗?

相信不少司机肯定说不全,但这条估计要让崇尚“背诵记忆准则”的小伙伴们笑了:我不理解原理,但也能说出几条优化的规则,你安能说我不懂性能优化?诚然性能优化有很多经验、准则可以参考借鉴,但是性能优化却不应该是背诵记忆的机械动作。如果不理解原理,对性能优化的认识、理解不足,任何场景都拿统一的套路生搬硬套,那优化的深度、全面性、适用性一定会大打折扣。

3、 所得

那么在这个并不轻松的性能优化过程中,我得到了什么?

3.1 对产品业务的熟悉

性能优化看似是个纯技术的事情,但是实际上和业务密不可分,毕竟任何技术都是在具体的业务场景下实践应用。因此不熟悉模块业务、具体实现而生搬硬套的话,性能优化工作往往无从下手。

3.2 对性能优化的深入理解

性能优化不是一块孤立的知识,对性能优化的深入理解需要方方面面的技术为辅助,此处仍然以第一篇启动优化为例。

  • 应用启动分类及过程;
  • 启动优化方式;
  • Heavy app initialization(包含线程使用、网络请求、IO、布局嵌套等)。

尤其是第三点:每一项都有可能导致性能的瓶颈,而每一项都可以展开阐述,这个过程使你的技术能力得以强化。

3.3 知识整理和文档能力

大多数情况下,我们都不创造知识而只是知识的搬运工,一般做的就是对知识的搜集和整合。那对我们决胜就是快速的汲取知识以及完成对知识的判断及整合,知道什么地方会有权威、靠谱的资料,判断知识的使用场景等。

而写文章过程中的各种痛苦也不是无用功,经历过不知道怎么写文章的窘迫,才会知道怎么确定文章主题、主线、丰富文章,才会锻炼到自己的表达能力、文字组织能力。

4、 其它

4.1 为什么要重视性能优化?

  • 性能优化的学习与实践是技术人员成长进步的一条途径,同时也是改善代码质量的一次机会。
  • 伴随着App功能的增多,性能问题随之而来,不夸张的说任何App都有性能问题,只是程度不同。任由性能问题存在却视而不见最终一点会有集中式的爆发,那后果不仅仅是技术上的失责,更会影响产品及用户。
  • 性能优化的过程本身也是一个精益求精的过程,代表了你对代码的重视,对高质量应用的追求。

4.2 性能优化有哪些好的资料推荐?

  1. Android性能优化典范,官方推出,必属精品。不仅仅告诉你哪里有问题,更告诉你为什么!
  2. 胡凯的博客,翻译了关于Android性能优化典范的内容,不想看视频的话可以参考博客。不过官方的典范及翻译都是偏理论性,需要自己去实践。
  3. 官方文档,不管是Training模块还是API模块,都藏了很多干货。
  4. 《移动App性能评测与优化》,腾讯TMQ专项测试团队的大作,深入底层,追本溯源,精益求精,带给人技术上提升的同时更端正做技术的态度,强烈推荐!

4.3 对性能优化,平时怎么做?

四个字:防微杜渐。很多性能方面的问题都不是一朝一夕产生的,例如OOM,导致OOM发生的代码可能只是压死骆驼的最后一根稻草,前面很多地方已经埋下了隐患,只等最后一个地方点燃。还有很多代码本身并没有错,确实实现了功能,但是放错了位置。

模块开发之前最好对技术方案进行评审,从实现上(源头)尽早规避低性能的实现方式;最好在功能完成之后,使用工具进行性能的分析,进行针对性的优化。

4.4 其它

  • 优化完成之后务必充分测试,否则虽然性能是高了但是出现Bug也是不能接受的;
  • 推荐大家写博客,或者整理、总结也好;
  • 不忘初心,方得始终。

原文发布于微信公众号 - 双十二技术哥(gh_b0e7544783e2)

原文发表时间:2017-06-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算D1net

开始云征程:迁移计划要先行

当把应用迁往云时,我们不能只是把应用往云中一放就奢求它们能够在其中正常运行了。制定一个完备的迁移计划可确保您的应用运行表现良好,并具有较高的成本效益。 云迁移并...

3465
来自专栏高航的专栏

人人都是网络工程师

今天的主题是人人都是网络工程师,但是很明显在过去的很长一段时间,网络工程是一件很专业的事情。那么,我们先基本罗列一下在传统的IT环境下,一个组织想获得稳定可靠的...

1.4K0
来自专栏云计算D1net

混合云:如何优化企业网络设计

公有和混合云引入给企业网络设计带来了重大影响。新的瓶颈出现了,并且一些企业需要改变它们的网络配置——特别是广域网的配置——来确保能够得到所需的性能。 特别是在混...

2968
来自专栏数据安全与取证

各类APP是否在监听?首个大规模实证的研究结论 | Report

我们之前经常看到和听到,说许多应用商店的APP会监听用户的生活,通过获得权限并在用户不知情的情况下收集隐私信息并回传。例如:麦克风会经常偷偷开着,听到你和周边人...

1637
来自专栏Java学习网

处境艰难的 App 开发者们如何自救

处境艰难的 App 开发者们如何自救 「因为这个行业太饱和了,障碍太多而且难以从中盈利。相比之下研发网页就容易的多。」 这是我朋友的公司不再研发原生 App 的...

2287
来自专栏韩伟的专栏

如何提高程序员的生产率(下)

目录 3. 开发过程... 12 4. 架构设计... 20 5. 管理激励... 23 三、 开发过程 沟通 软件通常都需要经过很多人和很多次的沟通才能生产出...

3444
来自专栏极乐技术社区

小程序 · 一周报

6 月 1 日,云南省政府和腾讯联合打造的全域旅游智慧平台「一部手机游云南」app 正式上线,其中包含 7 个辅助小程序,能够做到厕位引导都一次到位。

1150
来自专栏ATYUN订阅号

【科技】Google利用机器学习推出了AdSense“自动广告”,以进行投放和获利选择

Google于21日公布了一项新的AdSense广告单元, 该广告单元反映了该公司在其业务中添加更多人工智能的巨大推动力,并且可能会吸引更多可能考虑加大广告投放...

3637
来自专栏Java架构

BAT高级架构师分享系统化Java学习路线!

Java是目前使用最为广泛的网络编程语言之一。 它具有简单,面向对象,稳定,与平台无关,解释型,多线程,动态等特点。一般的JAVA程序员或许只需知道一些JAVA...

1233
来自专栏容器云生态

我怀疑遇到了假的CMDB

每次读到配置管理相关的书籍时,我总在想:“这些定义很精准,流程也很残缺,但这不是真正的难题。”对于一个配置管理者来说,真正的难题不是绘制“庞大而精美”的数据...

3.8K9

扫码关注云+社区

领取腾讯云代金券