Android 性能优化

最近在做 APP 优化,查阅官方说明和一些网友的总结,因为涉及内容比较多, 而且一些在项目上也没有用到,没有更多的见解,在这里进行一下整理笔记。

在Android中,性能和内存的关系很密切,因为系统的整体内存大小会影响所有进程的性能,因为垃圾回收器会对运行期间的性能产生很大的影响。下面的重点是运行期间的性能问题而不是内存。主要分为下面几个方面:

  • 代码性能优化建议
  • 内存优化
  • 渲染优化
  • 减少 App 大小
  • App 启动优化
  • App 后台优化
  • 减少图片下载大小
  • 网络优化

代码性能优化建议

这个使我们写代码时候要特别注意的, 这里不涉及算法、代码设计, 仅仅这样写执行起来更有效, 主要依赖编译器规则。

基本原则:

  • 不要做冗余的动作,如打篮球时能一步过的,就一步过, 不要像有的球员本来可以过的,感觉刚才的姿势不够优美, 回到半场重新来。
  • 如果能避免,尽量不要分配内存, 如尽量避免在循环语句里分配内存等。

原文:

http://developer.android.com/training/articles/perf-tips.html

翻译:

[http://hukai.me/android-training-course-in-chinese/performance/performance-tips.html]

内存优化

由于嵌入式设备,内存相对服务器来说, 内存还是很宝贵的,还有 Android 对每个 App 内存限制,让我们在开发中使用内存就显得格外注意了。

明白Android会运行多个Activity和多个并行的Service也是很重要的。在最近App列表中切换而不是重新启动一个App的方式对于创造出一种很好的体验是非常重要的。但是这样意味着如果这些app消耗了比它们本应该消耗的更多内存,那么留给其它的应用的系统内存就很少了。如果这种低内存情况发生,应用就不能保留在后台,系统会干掉app的进程,用户就被迫以重新启动的方式去开启一个App,显然这样的体验就比较差。
官网:

https://developer.android.com/topic/performance/memory.html#remove

翻译:

http://www.lightskystreet.com/2016/10/16/android-optimize-memory/

Developing for Android, II The Rules: Memory:

https://medium.com/google-developers/developing-for-android-ii-bb9a51f8c8b9

翻译:

http://www.lightskystreet.com/2015/06/07/google-for-android-2-memory/

渲染优化

Android 从一诞生到现在已经发布的 7.0 版本,卡顿和不流畅问题却一直被人们所诟病。客观地来讲,Android 的流畅性确实一直不给力,哪怕是某些大厂的 App ,也都不同程度地存在卡顿问题。从开发角度来说,每个开发者都应该关注下性能优化,在平时的开发工作中注意一些细节,尽可能地去优化应用。本文作为性能优化系列的开篇,先从过度绘制优化讲起。
官网:

https://developer.android.com/topic/performance/rendering/index.html

Android 过度绘制优化:

http://jaeger.itscoder.com/android/2016/09/29/android-performance-overdraw.html

减少 App 大小

主要减少资源文件包括图片, 减少不用的资源。
原文:

https://developer.android.com/topic/performance/reduce-apk-size.html

翻译:

http://www.lightskystreet.com/2016/10/19/android-optimize-image-download-size/

App 启动优化

通常用户期望app响应和加载速度越快越好。一个启动速度慢的app很可能会给用户留下不好的印象,除了导致用户在应用市场上的打分低之外,很有可能导致致用户直接卸载。
这篇文章提供了优化app启动时间的方法。先解释了app进程启动的内部流程。然后讨论如何优化启动的性能。最后列出几个常见的启动问题和解决方案。
官网:

https://developer.android.com/topic/performance/launch-time.html#common

翻译:

http://www.lightskystreet.com/2016/10/15/android-optimize-start/

App 后台优化

后台进程是内存和电池敏感的。一个隐式的broadcast可能会启动很多监听它的后台进程,即使这些进程可能做得工作不多。这可能丢设备性能和用户体验都有比较大的影响。

为了缓解这种问题,7.0(API 24)做了以下限制:

  • Target为 Android 7.0 (API level 24)的App,将不会再收到在mainfest中注册的 CONNECTIVITY_ACTION广播。运行中的App仍然可以在Main Thread中通过Context.registerReceiver()注册 CONNECTIVITY_CHANGE 广播来监听
  • App 将不能够发送或者接收 ACTION_NEW_PICTURE or ACTION_NEW_VIDEO。这种优化会影响到所有的app,不仅是target为Android7.0的设备。

因此如果你使用了这些intennt,应该尽快的移除对它们的依赖,以便你的app可以在Target为Android 7.0的设备上正常运行。Android框架提供了几种解决方案去减小对这些隐式广播的依赖。比如,JobScheduler and GcmNetworkManager提供了强健的机制去调度特定情况下的网络操作。比如,你也可以使用JobScheduler去响应content provider的变化。JobInfo对象封装了JobScheduler用于调度job的参数。当满足指定的条件的时候,系统会通JobService过执行该job。
原文:

https://developer.android.com/topic/performance/background-optimization.html

翻译:

http://www.lightskystreet.com/2016/10/16/android-optimize-background/

减少图片下载大小

主要如下:

  • 如何选择一种图片格式(PNG、JPG、WebP)
  • 确定准确质量值
  • 服务端的尺寸大小

原文:

https://developer.android.com/topic/performance/network-xfer.html

翻译:

http://www.lightskystreet.com/2016/10/19/android-optimize-image-download-size/

网络优化

位于在城市中的大多数软件开发者来说拥有一些现代的基础设施和移动网络是很简单的。但很多其它地区并不具备这样的设施。更别说LTE或4G了。很多国家的地区还是2G的网络而且可能还要承受大量数据的传输。这样就会导致两个通用的问题:

  • 依赖于快速的网络速度 App 严重依赖大媒体数据, 在网络基础较差的地方可能没有选择。但是避免下载,直到条件允许的情况下再去下载也是 App 体验的一部分。
  • 多度同步也许你的 App 希望更新一些信息,但是用户并不需要它,更重要的问题,设备并不应该承受所有应用程序与网络不断交互的情况。这种动态会很容易地使设备持续工作而不能够进行休眠,最终影响电池的续航。

原文:

https://medium.com/google-developers/developing-for-android-iv-e7dc4ce0a59#.l1kwx8e0n

翻译:

http://www.lightskystreet.com/2015/06/07/google-for-android-4-network/

移动端网络优化:

http://b.codekk.com/detail/Trinea/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E7%BD%91%E7%BB%9C%E4%BC%98%E5%8C%96

写在最后

当然优化不仅仅是上面所说的, 不同场景方案不一样。有人的地方就有江湖、有代码的地方就有优化,代码不止、优化不止。生活当然不是只有诗和远方, 还有代码和段子。


PS:苹果发布新款 MacBook Proc ,我没有看发布会, 第二天看了 KeyNote, 发现除了变薄,并没有特点。还把 USB 给取消了,变亮的 logo 也没有了, 反正让我太失望了,还好我有2015款。你们感觉呢?

JasonThink wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!